<?php
|
namespace JVBase\managers\Dashboard;
|
|
use JVBase\managers\Cache;
|
use JVBase\registrar\Registrar;
|
use WP_Query;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
class DashboardPage {
|
protected string $title;
|
protected string $slug;
|
protected string $ogSlug;
|
protected string $icon;
|
protected string $URL;
|
protected int $parent = 0;
|
protected int $ID;
|
protected ?string $permission = null;
|
protected ?string $section = null;
|
protected array $scripts = [];
|
protected int $order = 0;
|
protected Cache $cache;
|
|
public function __construct(string $title, string $slug = '', string $icon ='', int $parent = 0) {
|
$this->cache = Cache::for('dashboard');
|
if (JVB_TESTING) {
|
$this->cache->flush();
|
}
|
$this->title = $title;
|
$this->setSlug(empty($slug) ? $title : $slug);
|
$this->icon = $icon;
|
$this->parent = $parent;
|
$this->setID($parent);
|
$this->setURL();
|
}
|
|
public function setID(int $parentID):void
|
{
|
if ($this->slug === 'dash') {
|
//We do not need to create the page for the main dash
|
$this->ID = 0;
|
return;
|
}
|
$this->ID = $this->cache->remember(
|
$this->slug.'_ID',
|
function() use ($parentID) {
|
$existing = new WP_Query([
|
'post_type' => DashboardManager::$based,
|
'name' => $this->slug,
|
'fields' => 'ids',
|
'posts_per_page'=> 1,
|
]);
|
if ($existing->have_posts()) {
|
return $existing->posts[0];
|
}
|
|
$args = [
|
'post_title' => $this->title,
|
'post_name' => $this->slug,
|
'post_type' => DashboardManager::$based,
|
'post_status' => 'publish'
|
];
|
if ($parentID > 0) {
|
$args['post_parent'] = $parentID;
|
}
|
return wp_insert_post($args);
|
}
|
);
|
}
|
public function getID():int
|
{
|
return $this->ID;
|
}
|
|
public function getParent():int
|
{
|
return $this->parent;
|
}
|
|
public function setURL():void
|
{
|
|
if ($this->slug === 'dash') {
|
$this->URL = get_post_type_archive_link(DashboardManager::$based);
|
return;
|
}
|
$this->URL = get_the_permalink($this->ID);
|
}
|
|
public function getURL():string
|
{
|
return $this->URL;
|
}
|
|
|
public function setTitle(string $title):void
|
{
|
$this->title = $title;
|
}
|
public function getTitle():string
|
{
|
return $this->title;
|
}
|
|
public function setSlug(string $slug):void
|
{
|
$this->ogSlug = $slug;
|
$this->slug = self::sanitizeString($slug);
|
}
|
public function getSlug():string
|
{
|
return $this->slug;
|
}
|
|
public function setIcon(string $icon):void
|
{
|
$this->icon = $icon;
|
}
|
public function getIcon():string
|
{
|
return $this->icon;
|
}
|
|
public function setPermission(string $permission):void
|
{
|
$this->permission = $permission;
|
}
|
public function getPermission():?string
|
{
|
return $this->permission;
|
}
|
|
public function setSection(string $section):void
|
{
|
$this->section = self::sanitizeString($section);
|
}
|
public function getSection():?string
|
{
|
return $this->section;
|
}
|
|
public function setOrder(int $order):void
|
{
|
$this->order = $order;
|
}
|
public function getOrder():int
|
{
|
return $this->order;
|
}
|
|
public function setRenderCallback(string $callback):void
|
{
|
|
}
|
public function render():string
|
{
|
$check = str_replace('-','_',$this->slug);
|
ob_start();
|
do_action(BASE.'dashboard_page_'.$check, $this->slug, $this->ogSlug);
|
$out = ob_get_clean();
|
|
if (empty($out)) {
|
$out = sprintf(
|
'<h1>%s</h1><p>It doesn\'t look like this page is configured yet: %s.</p>',
|
$this->title,
|
BASE.'dashboard_page_'.$check
|
);
|
}
|
return $out;
|
}
|
/*********************************************************
|
* UTILITY
|
********************************************************/
|
public static function sanitizeString(string $string):string
|
{
|
return str_replace('_', '-', strtolower(sanitize_title($string)));
|
}
|
|
public function setScripts(array $scripts):void
|
{
|
$this->scripts = $scripts;
|
}
|
public function getScripts():array
|
{
|
return $this->scripts;
|
}
|
}
|