Typesetter/include/Page.php
2021-09-08 19:52:21 +02:00

360 lines
8.3 KiB
PHP

<?php
namespace gp{
defined('is_running') or die('Not an entry point...');
/**
* Objects of this class handle the display of standard CMS pages
* The classes for admin pages and special pages extend the display class
*
*/
class Page extends Base{
public $pagetype = 'display';
public $gp_index;
public $requested;
public $title;
public $label;
public $file;
public $contentBuffer;
public $TitleInfo;
public $fileType = '';
public $ajaxReplace = array('#gpx_content');
public $admin_links = array();
public $visibility = null;
public $file_sections = array();
public $meta_data = array();
public $lang;
public $language;
public $file_stats = array();
public $fileModTime = 0;
//layout & theme
public $theme_name = false;
public $theme_color = false;
public $get_theme_css = true;
public $theme_dir;
public $theme_path;
public $theme_rel;
public $theme_addon_id = false;
public $menu_css_ordered = true;
public $menu_css_indexed = true;
public $gpLayout;
//<head> content
public $head = '';
public $head_js = array();
public $head_script = '';
public $jQueryCode = false;
public $admin_js = false;
public $head_force_inline = false;
public $meta_description = '';
public $meta_keywords = array();
//css arrays
public $css_user = array();
public $css_admin = array();
/* @deprecated 3.5 */
public $theme_is_addon = false;
public function __construct($title, $type){
global $config, $languages;
$this->requested = $title;
$this->title = $title;
$this->lang = $config['language'];
if( isset($languages[$this->lang]) ){
$this->language = $languages[$this->lang];
}
$this->head .= '<link rel="canonical" href="'.\gp\tool::GetUrl($title).'" />'."\n";
}
/**
* Get page content or do redirect for non-existant titles
* see special_missing.php and /Admin/Settings/Missing
*/
public function Error_404(){
ob_start();
$args = array('page'=>$this);
$missing = new \gp\special\Missing($args);
$missing->RunScript();
$this->contentBuffer = ob_get_clean();
}
public function SetVars(){
global $gp_index, $gp_titles, $gp_menu;
if( !isset($gp_index[$this->title]) ){
$this->Error_404();
return false;
}
$this->gp_index = $gp_index[$this->title];
$this->TitleInfo =& $gp_titles[$this->gp_index]; //so changes made by rename are seen
$this->label = \gp\tool::GetLabel($this->title);
$this->file = \gp\tool\Files::PageFile($this->title);
if( !$this->CheckVisibility() ){
return false;
}
\gp\tool\Plugins::Action('PageSetVars');
return true;
}
/**
* Check the page's visibility
*
*/
public function CheckVisibility(){
global $gp_titles;
if( isset($gp_titles[$this->gp_index]['vis']) ){
$this->visibility = $gp_titles[$this->gp_index]['vis'];
}
if( !\gp\tool::LoggedIn() && $this->visibility ){
$this->Error_404();
return false;
}
return true;
}
public function RunScript(){
if( !$this->SetVars() ){
return;
}
//allow addons to effect page actions and how a page is displayed
$cmd = \gp\tool::GetCommand();
$cmd_after = \gp\tool\Plugins::Filter('PageRunScript',array($cmd));
if( $cmd !== $cmd_after ){
$cmd = $cmd_after;
if( $cmd === 'return' ){
return;
}
}
$this->GetFile();
$this->contentBuffer = \gp\tool\Output\Sections::Render($this->file_sections,$this->title,$this->file_stats);
}
/**
* Retreive the data file for the current title and update the data if necessary
*
*/
public function GetFile(){
$this->file_sections = \gp\tool\Files::Get($this->file,'file_sections');
$this->meta_data = \gp\tool\Files::$last_meta;
$this->fileModTime = \gp\tool\Files::$last_modified;
$this->file_stats = \gp\tool\Files::$last_stats;
if( count($this->file_sections) == 0 ){
$this->file_sections[0] = array(
'type' => 'text',
'content' => '<p>Oops, this page no longer has any content.</p>',
);
}
}
/**
* Set the page's theme name and path information according to the specified $layout
* If $layout is not found, use the installation's default theme
*
*/
public function SetTheme($layout=false){
global $dataDir;
if( $layout === false ){
$layout = self::OrConfig($this->gp_index,'gpLayout');
}
$layout_info = \gp\tool::LayoutInfo($layout);
if( !$layout_info ){
$default_theme = explode('/',gp_default_theme);
$this->gpLayout = false;
$this->theme_name = $default_theme[0];
$this->theme_color = $default_theme[1];
$this->theme_rel = '/themes/'.$this->theme_name.'/'.$this->theme_color;
$this->theme_dir = $dataDir.'/themes/'.$this->theme_name;
}else{
$this->gpLayout = $layout;
$this->theme_name = $layout_info['theme_name'];
$this->theme_color = $layout_info['theme_color'];
$this->theme_rel = $layout_info['path'];
$this->theme_dir = $layout_info['dir'];
if( isset($layout_info['addon_id']) ){
$this->theme_addon_id = $layout_info['addon_id'];
}
$this->theme_is_addon = $layout_info['is_addon'];//if installed in /themes or /data/_themes
//css preferences
if( isset($layout_info['menu_css_ordered']) && !$layout_info['menu_css_ordered'] ){
$this->menu_css_ordered = false;
}
if( isset($layout_info['menu_css_indexed']) && !$layout_info['menu_css_indexed'] ){
$this->menu_css_indexed = false;
}
}
$this->theme_path = \gp\tool::GetDir($this->theme_rel);
}
/**
* Return the most relevant configuration value for a configuration option ($var)
* Check configuration for a page ($id) first, then parent pages (determined by main menu), then the site $config
*
* @return mixed
*
*/
public static function OrConfig($id,$var){
global $config, $gp_titles;
if( $id ){
if( !empty($gp_titles[$id][$var]) ){
return $gp_titles[$id][$var];
}
if( self::ParentConfig($id,$var,$value) ){
return $value;
}
}
if( isset($config[$var]) ){
return $config[$var];
}
return false;
}
/**
* Traverse the main menu upwards looking for a configuration setting for $var
* Start at the title represented by $checkId
* Set $value to the configuration setting if a parent page has the configuration setting
*
* @return bool
*/
public static function ParentConfig($checkId,$var,&$value){
global $gp_titles,$gp_menu;
$parents = \gp\tool::Parents($checkId,$gp_menu);
foreach($parents as $parent_index){
if( !empty($gp_titles[$parent_index][$var]) ){
$value = $gp_titles[$parent_index][$var];
return true;
}
}
return false;
}
/*
* Get functions
*
* Missing:
* $#sitemap#$
* different menu output
*
*/
public function GetSiteLabel(){
global $config;
echo $config['title'];
}
public function GetSiteLabelLink(){
global $config;
echo \gp\tool::Link('',$config['title']);
}
public function GetPageLabel(){
echo $this->label;
}
public function GetContent(){
$this->GetGpxContent();
echo '<div id="gpAfterContent">';
\gp\tool\Output::Get('AfterContent');
\gp\tool\Plugins::Action('GetContent_After');
echo '</div>';
}
public function GetGpxContent(){
$class = '';
if( isset($this->meta_data['file_number']) ){
$class = 'filenum-'.$this->meta_data['file_number'];
}
if( $this->pagetype == 'display' ){
$class .= ' gp_page_display';
}
echo '<div id="gpx_content" class="'.$class.' cf">';
echo $this->contentBuffer;
echo '</div>';
}
/* Deprecated functions
*/
public function GetHead(){
trigger_error('deprecated functions');
\gp\tool\Output::GetHead();
}
public function GetExtra($area,$info=array()){
trigger_error('deprecated functions');
echo \gp\tool\Output\Extra::GetExtra($area);
}
public function GetMenu(){
trigger_error('deprecated functions');
\gp\tool\Output::GetMenu();
}
public function GetFullMenu(){
trigger_error('deprecated functions');
\gp\tool\Output::GetFullMenu();
}
public function GetAllGadgets(){
trigger_error('deprecated functions');
\gp\tool\Output::GetAllGadgets();
}
public function GetAdminLink(){
trigger_error('deprecated functions');
\gp\tool\Output::GetAdminLink();
}
}
}
namespace{
class display extends \gp\Page{}
}