mirror of
				https://github.com/gtbu/Typesetter-5.3-p8.git
				synced 2025-11-04 06:48:27 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			310 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			310 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace gp\Page;
 | 
						|
 | 
						|
defined('is_running') or die('Not an entry point...');
 | 
						|
 | 
						|
 | 
						|
class Layout{
 | 
						|
 | 
						|
	public $from_page = false;
 | 
						|
	public $show_popup = false;
 | 
						|
	public $title = false;
 | 
						|
 | 
						|
	public function __construct($cmd,$url,$query_string=''){
 | 
						|
		global $gp_index;
 | 
						|
 | 
						|
		//if the request is made from the page, we want to remember that and send an appropriate response
 | 
						|
		if( isset($_REQUEST['from']) && $_REQUEST['from'] == 'page' ){
 | 
						|
			$query_string .= '&from=page';
 | 
						|
			$this->from_page = true;
 | 
						|
		}
 | 
						|
		$query_string .= '&';
 | 
						|
		$query_string = ltrim($query_string,'&');
 | 
						|
 | 
						|
		switch($cmd){
 | 
						|
			case 'layout':
 | 
						|
				$this->SelectLayout($url,$query_string);
 | 
						|
				$this->show_popup = true;
 | 
						|
			return;
 | 
						|
			case 'uselayout':
 | 
						|
				$this->SetLayout();
 | 
						|
			return;
 | 
						|
			case 'restorelayout':
 | 
						|
				$this->RestoreLayout();
 | 
						|
			return;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public function Result(){
 | 
						|
		global $page;
 | 
						|
 | 
						|
		if( $this->from_page && $this->title){
 | 
						|
			if( !$this->show_popup ){
 | 
						|
				$url = \gp\tool::AbsoluteUrl($this->title,'',true,false,true);
 | 
						|
				$page->ajaxReplace[] = array('location',$url,0);
 | 
						|
			}
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->show_popup;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Remove any layout setting from a page.
 | 
						|
	 * The page will revert to inheriting the layout setting from the site configuration or a parent page
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function RestoreLayout(){
 | 
						|
		global $gp_titles,$gp_index,$langmessage;
 | 
						|
 | 
						|
		$index = $_POST['index'];
 | 
						|
		$title = \gp\tool::IndexToTitle($index);
 | 
						|
 | 
						|
		if( !$title ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		$this->title = $title;
 | 
						|
 | 
						|
		if( !\gp\tool\Nonce::Verify('restore') ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		unset($gp_titles[$index]['gpLayout']);
 | 
						|
		return \gp\admin\Tools::SavePagesPHP(true, true);
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Assign a layout to the $title. Child pages without a layout assigned will inherit this setting
 | 
						|
	 * @param string $title
 | 
						|
	 */
 | 
						|
	public function SetLayout(){
 | 
						|
		global $gp_index, $gp_titles, $langmessage, $gpLayouts;
 | 
						|
 | 
						|
		$index = $_POST['index'];
 | 
						|
		$title = \gp\tool::IndexToTitle($index);
 | 
						|
 | 
						|
		if( !$title ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		$this->title = $title;
 | 
						|
 | 
						|
		$layout = $_POST['layout'];
 | 
						|
		if( !isset($gpLayouts[$layout]) ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		if( !\gp\tool\Nonce::Verify('use_'.$layout) ){
 | 
						|
			msg($langmessage['OOPS']);
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		//unset, then reset if needed
 | 
						|
		unset($gp_titles[$index]['gpLayout']);
 | 
						|
		$currentLayout = \gp\Page::OrConfig($index,'gpLayout');
 | 
						|
		if( $currentLayout != $layout ){
 | 
						|
			$gp_titles[$index]['gpLayout'] = $layout;
 | 
						|
		}
 | 
						|
 | 
						|
		return \gp\admin\Tools::SavePagesPHP(true, true);
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Display current layout, list of available layouts and list of titles affected by the layout setting for $title
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function SelectLayout($url,$query_string){
 | 
						|
		global $gp_titles, $gpLayouts, $langmessage, $config, $gp_index;
 | 
						|
 | 
						|
		$index = $_REQUEST['index'];
 | 
						|
		$title = \gp\tool::IndexToTitle($index);
 | 
						|
		if( !$title ){
 | 
						|
			echo $langmessage['OOPS'];
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->title = $title;
 | 
						|
 | 
						|
		$Inherit_Info	= \gp\admin\Menu\Tools::Inheritance_Info();
 | 
						|
		$curr_layout	= \gp\admin\Menu\Tools::CurrentLayout($index);
 | 
						|
		$curr_info		= $gpLayouts[$curr_layout];
 | 
						|
 | 
						|
 | 
						|
		echo '<div class="inline_box">';
 | 
						|
 | 
						|
		echo '<h3>';
 | 
						|
		echo $langmessage['current_layout'].':   ';
 | 
						|
		echo '<span class="layout_color_id" style="background-color:'.$curr_info['color'].';" title="'.$curr_info['color'].'"></span>   ';
 | 
						|
		echo str_replace('_',' ',$curr_info['label']);
 | 
						|
		echo '</h3>';
 | 
						|
 | 
						|
		if( !empty($gp_titles[$index]['gpLayout']) ){
 | 
						|
			echo '<p>';
 | 
						|
 | 
						|
			if( isset($Inherit_Info[$index]['parent_layout']) ){
 | 
						|
				$parent_layout = $Inherit_Info[$index]['parent_layout'];
 | 
						|
			}else{
 | 
						|
				$parent_layout = $config['gpLayout'];
 | 
						|
			}
 | 
						|
			$parent_info = $gpLayouts[$parent_layout];
 | 
						|
 | 
						|
			echo $langmessage['restore'].': ';
 | 
						|
			$span = '<span class="layout_color_id" style="background-color:'.$parent_info['color'].';" title="'.$parent_info['color'].'"></span> ';
 | 
						|
			echo \gp\tool::Link($url,$span.$parent_info['label'],$query_string.'cmd=restorelayout&index='.urlencode($index),array('data-cmd'=>'postlink','title'=>$langmessage['restore']),'restore');
 | 
						|
			echo '</p>';
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		echo '<table class="bordered full_width">';
 | 
						|
 | 
						|
		echo '<tr><th>';
 | 
						|
		echo $langmessage['available_layouts'];
 | 
						|
		echo '</th><th>';
 | 
						|
		echo $langmessage['theme'];
 | 
						|
		echo '</th></tr>';
 | 
						|
 | 
						|
		if( count($gpLayouts) < 2 ){
 | 
						|
			echo '<tr><td colspan="2">';
 | 
						|
			echo $langmessage['Empty'];
 | 
						|
			echo '</td></tr>';
 | 
						|
			echo '</table>';
 | 
						|
			echo \gp\tool::Link('Admin_Theme_Content',$langmessage['new_layout']);
 | 
						|
			echo '</div>';
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		foreach($gpLayouts as $layout => $info){
 | 
						|
			if( $layout == $curr_layout ){
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			echo '<tr><td>';
 | 
						|
			echo '<span class="layout_color_id" style="background-color:'.$info['color'].';" title="'.$info['color'].'">';
 | 
						|
			echo '</span> ';
 | 
						|
			if( $layout != $curr_layout ){
 | 
						|
				echo \gp\tool::Link($url,$info['label'],$query_string.'cmd=uselayout&index='.urlencode($index).'&layout='.urlencode($layout),array('data-cmd'=>'postlink'),'use_'.$layout);
 | 
						|
 | 
						|
			}
 | 
						|
			echo '</td><td>';
 | 
						|
			echo $info['theme'];
 | 
						|
			echo '</td></tr>';
 | 
						|
 | 
						|
		}
 | 
						|
		echo '</table>';
 | 
						|
 | 
						|
 | 
						|
		//show affected pages
 | 
						|
		$affected = self::GetAffectedFiles($index);
 | 
						|
 | 
						|
		echo '<br/>';
 | 
						|
 | 
						|
		echo '<table class="bordered full_width">';
 | 
						|
		echo '<tr><th>'.$langmessage['affected_files'].'</th></tr></table>';
 | 
						|
 | 
						|
		echo '<p class="sm">'.$langmessage['about_layout_change'].'</p>';
 | 
						|
		echo '<p class="admin_note">';
 | 
						|
 | 
						|
		$label = \gp\tool::GetLabelIndex($index,false);
 | 
						|
		echo \gp\tool::LabelSpecialChars($label);
 | 
						|
 | 
						|
		$i = 0;
 | 
						|
		foreach($affected as $affected_label){
 | 
						|
			$i++;
 | 
						|
			echo ', '.$affected_label;
 | 
						|
		}
 | 
						|
		echo '</p>';
 | 
						|
 | 
						|
		echo '<p>';
 | 
						|
		echo ' <input type="submit" value="'.$langmessage['cancel'].'" class="admin_box_close gpcancel" /> ';
 | 
						|
		echo '</p>';
 | 
						|
 | 
						|
		echo '<p class="admin_note">';
 | 
						|
		echo '<b>'.$langmessage['see_also'].'</b> ';
 | 
						|
		echo \gp\tool::Link('Admin_Theme_Content',$langmessage['layouts']);
 | 
						|
		echo '</p>';
 | 
						|
 | 
						|
		echo '</div>';
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get a list of titles that inherit layout settings from the page with $index
 | 
						|
	 * @param string $index
 | 
						|
	 *
 | 
						|
	 */
 | 
						|
	public function GetAffectedFiles($index){
 | 
						|
		global $gp_titles, $gp_menu;
 | 
						|
 | 
						|
		$temp = $gp_menu;
 | 
						|
		reset($temp);
 | 
						|
		$result = array();
 | 
						|
 | 
						|
		$i = 0;
 | 
						|
		do{
 | 
						|
			$menu_key = key($temp);
 | 
						|
			$info = current($temp);
 | 
						|
			if( !isset($info['level']) ){
 | 
						|
				break;
 | 
						|
			}
 | 
						|
			$level = $info['level'];
 | 
						|
 | 
						|
			unset($temp[$menu_key]);
 | 
						|
			if( $index === $menu_key ){
 | 
						|
				self::InheritingLayout($level+1,$temp,$result);
 | 
						|
			}
 | 
						|
			$i++;
 | 
						|
		}while( (count($temp) > 0) );
 | 
						|
		return $result;
 | 
						|
	}
 | 
						|
 | 
						|
	public function InheritingLayout($searchLevel,&$menu,&$result){
 | 
						|
		global $gp_titles;
 | 
						|
 | 
						|
		$children = true;
 | 
						|
		do{
 | 
						|
			$menu_key = key($menu);
 | 
						|
			$info = current($menu);
 | 
						|
			if( !isset($info['level']) ){
 | 
						|
				break;
 | 
						|
			}
 | 
						|
			$level = $info['level'];
 | 
						|
 | 
						|
			if( $level < $searchLevel ){
 | 
						|
				return;
 | 
						|
			}
 | 
						|
			if( $level > $searchLevel ){
 | 
						|
				if( $children ){
 | 
						|
					self::InheritingLayout($level,$menu,$result);
 | 
						|
				}else{
 | 
						|
					unset($menu[$menu_key]);
 | 
						|
				}
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
 | 
						|
			unset($menu[$menu_key]);
 | 
						|
			if( !empty($gp_titles[$menu_key]['gpLayout']) ){
 | 
						|
				$children = false;
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			$children = true;
 | 
						|
 | 
						|
			//exclude external links
 | 
						|
			if( $menu_key[0] == '_' ){
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
 | 
						|
			$label = \gp\tool::GetLabelIndex($menu_key,false);
 | 
						|
			$result[] = \gp\tool::LabelSpecialChars($label);
 | 
						|
		}while( count($menu) > 0 );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
}
 |