';
$this->ColorSelector();
}
/**
* Display a list of all the titles using the current layout
*
*/
public function ShowTitles(){
global $langmessage;
//affected titles
$titles_count = $this->TitlesCount($this->curr_layout);
echo '
';
echo '';
}
}
/**
* Display gadgets and their status for the current layout
*
*/
public function ShowGadgets(){
global $langmessage, $config;
$gadget_info = \gp\tool\Output::WhichGadgets($this->curr_layout);
echo '
';
}
/**
* Create a drop-down menu for the layout options
*
*/
public function LayoutOptions($layout,$info){
global $langmessage, $config;
//theme name
echo '
';
}
}
/**
* Get number of handlers
*
*/
public function HandlersCount($layout_info){
$handlers_count = 0;
if( isset($layout_info['handlers']) && is_array($layout_info['handlers']) ){
foreach($layout_info['handlers'] as $val){
$int = count($val);
if( $int === 0){
$handlers_count++;
}
$handlers_count += $int;
}
}
return $handlers_count;
}
/**
* Get the layout customizer array if customizer.php exists
* @since 5.2
* @param string the layout id
* @return array layout customizer
*/
public function GetLayoutCustomizer($layout){
$layout_info = \gp\tool::LayoutInfo($layout, false);
$dir = $layout_info['dir'] . '/' . $layout_info['theme_color'];
$customizer_file = $dir . '/customizer.php';
if( file_exists($customizer_file) ){
return \gp\tool\Files::Get($customizer_file, 'customizer');
}
return [];
}
/**
* Get the custom config for a layout if it exists
* @since 5.2
* @param string the layout id
* @return array layout configuration
*
*/
public function GetLayoutConfig($layout){
$config_file = \gp\tool\Output::LayoutConfigFile($layout);
if( file_exists($config_file) ){
$config = \gp\tool\Files::Get($config_file, 'config');
if( !empty($config) ){
return $config;
}
}
// not yet saved? - get the defaults from customizer
return $this->GetLayoutDefaultConfig($layout);
}
/**
* Extract default config values from customizer definition file
* @since 5.2
* @param string the layout id
* @return array default config
*
*/
public function GetLayoutDefaultConfig($layout){
$customizer_data = $this->GetLayoutCustomizer($layout);
if( empty($customizer_data) ){
return [];
}
$default_config = [];
foreach( $customizer_data as $area => $area_info ){
foreach( $area_info['items'] as $var_name => $var_data ){
$default_config[$var_name] = [];
$default_config[$var_name]['value'] = $var_data['default_value'];
if( !empty($var_data['default_units']) ){
$default_config[$var_name]['units'] = $var_data['default_units'];
}
}
}
return $default_config;
}
/**
* Get the path of the customizer css file
* @since 5.2
* @param string the layout id
* @return string
*
*/
public function GetCustomizerCSSFile($layout){
$layout_info = \gp\tool::LayoutInfo($layout, false);
$dir = $layout_info['dir'] . '/' . $layout_info['theme_color'];
$style_type = \gp\tool\Output::StyleType($dir);
return \gp\tool\Output::CustomizerStyleFile($layout, $style_type);
}
/**
* @deprecated 5.2
* use GetLayoutCSS instead
*/
public function LayoutCSS($layout){
return $this->GetLayoutCSS($layout);
}
/**
* Get the custom css for a layout if it exists
* @since 5.2
* @param string the layout id
* @return string CSS, SCSS or LESS
*/
public function GetLayoutCSS($layout){
$custom_css_file = $this->GetLayoutCSSFile($layout);
if( file_exists($custom_css_file) ){
return file_get_contents($custom_css_file);
}
return '';
}
/**
* @deprecated 5.2
* use SaveCustomCSS instead
*/
public function SaveCustom($layout, $css){
$this->SaveCustomCSS($layout, $css);
}
/**
* Save the custom.css / .less / .scss file
* @since 5.2
* @param string the layout id
* @param string CSS, SCSS or LESS
* @return bool success
*
*/
public function SaveCustomCSS($layout, $css){
global $langmessage;
$custom_file = $this->GetLayoutCSSFile($layout);
//delete css file if empty
if( empty($css) ){
return $this->RemoveCSS($layout, $custom_file);
}
//save if not empty
if( !\gp\tool\Files::Save($custom_file, $css) ){
msg($langmessage['OOPS'] . ' (CSS not saved)');
return false;
}
return true;
}
/**
* Save the data posted by customizer
* @since 5.2
* @param string the layout id
* @param array customizer results
* @return bool success
*
*/
public function SaveCustomizerResults($layout, $customizer_results){
$success = true;
// customizer css
$customizer_css = '';
if( !empty($customizer_results['scssless_vars']) ){
$customizer_css .= $customizer_results['scssless_vars'];
}
if( !empty($customizer_results['css_vars']) ){
$customizer_css .= $customizer_results['css_vars'];
}
$success = $success && $this->SaveCustomizerCSS($layout, $customizer_css);
// layout config
$layout_config = !empty($customizer_results['layout_config']) ?
$customizer_results['layout_config'] :
[];
$success = $success && $this->SaveLayoutConfig($layout, $layout_config);
return $success;
}
/**
* Save the layout config from customizer
* @since 5.2
* @param string the layout id
* @param array layout config
* @return bool success
*
*/
public function SaveLayoutConfig($layout, $layout_config){
global $langmessage;
$success = true;
$layout_config_file = \gp\tool\Output::LayoutConfigFile($layout);
if( empty($layout_config) ){
// delete layout config file if empty
$success = $success && $this->RemoveLayoutConfig($layout);
// save it otherwise
}elseif( !\gp\tool\Files::SaveData($layout_config_file, 'config', $layout_config) ){
msg($langmessage['OOPS'] . ' (Layout config not saved)');
$success = false;
}
return $success;
}
/**
* Get the customizer css for a layout if it exists
* @since 5.2
* @param string the layout id
* @return string CSS, SCSS or LESS
*/
public function GetCustomizerCSS($layout){
$customizer_css_file = $this->GetCustomizerCSSFile($layout);
if( file_exists($customizer_css_file) ){
return file_get_contents($customizer_css_file);
}
return '';
}
/**
* Save the customizer css
* @since 5.2
* @param string the layout id
* @param array customizer results
* @return bool success
*
*/
public function SaveCustomizerCSS($layout, $customizer_css){
global $langmessage;
$success = true;
$customizer_css_file = $this->GetCustomizerCSSFile($layout);
if( empty($customizer_css) ){
// delete css file if empty
$success = $success && $this->RemoveCustomizerCSS($layout, $customizer_css_file);
// save it otherwise
}elseif( !\gp\tool\Files::Save($customizer_css_file, $customizer_css) ){
msg($langmessage['OOPS'] . ' (Customizer stylesheet not saved)');
$success = false;
}
return $success;
}
/**
* @deprecated 5.2
* use GetLayoutCSSFile instead
*/
public function LayoutCSSFile($layout){
return $this->GetLayoutCSSFile();
}
/**
* Get the path of the custom css file
* @since 5.2
* @param string the layout id
* @return string
*
*/
public function GetLayoutCSSFile($layout){
$layout_info = \gp\tool::LayoutInfo($layout, false);
$dir = $layout_info['dir'] . '/' . $layout_info['theme_color'];
$style_type = \gp\tool\Output::StyleType($dir);
return \gp\tool\Output::CustomStyleFile($layout, $style_type);
}
/**
* Remove the custom css file and unset the 'css' key from a layout
* @param string the layout id
* @param string custom file abspath
* @return bool success
*/
public function RemoveCSS($layout, $custom_file){
global $gpLayouts;
if( file_exists($custom_file) ){
unlink($custom_file);
}
if( isset($gpLayouts[$layout]['css']) ){
unset($gpLayouts[$layout]['css']);
}
return true;
}
/**
* Remove the customizer.scss/less/css file for a layout
* @since 5.2
* @param string the layout id
* @return bool success
*
*/
public function RemoveCustomizerCSS($layout){
global $gpLayouts;
$customizer_css_file = $this->GetCustomizerCSSFile($layout);
if( file_exists($customizer_css_file) ){
unlink($customizer_css_file);
}
if( isset($gpLayouts[$layout]['customizer_css']) ){
unset($gpLayouts[$layout]['customizer_css']);
}
return true;
}
/**
* Remove the custom config.php file for a layout
* @since 5.2
* @param string the layout id
* @return bool success
*
*/
public function RemoveLayoutConfig($layout){
global $gpLayouts;
$config_file = \gp\tool\Output::LayoutConfigFile($layout);
if( file_exists($config_file) ){
unlink($config_file);
}
if( isset($gpLayouts[$layout]['config']) ){
unset($gpLayouts[$layout]['config']);
}
return true;
}
/**
* Entirely remove the custom layout data direcory and its content
* @since 5.2
* @param string the layout directory
* @return bool success
*
*/
public function RemoveCustomDir($layout){
global $langmessage, $dataDir;
$dir = $dataDir . '/data/_layouts/' . $layout;
if( !file_exists($dir) ){
return false;
}
$remove_files = [
$dir . '/custom.css',
$dir . '/custom.less',
$dir . '/custom.scss',
$dir . '/customizer.css',
$dir . '/customizer.less',
$dir . '/customizer.scss',
$dir . '/config.php',
$dir . '/index.html',
];
foreach($remove_files as $path){
if( file_exists($path) ){
@unlink($path);
}
}
if( !\gp\tool\Files::RmDir($dir) ){
msg(
$langmessage['OOPS'] .
' Cannot remove /data/_layouts/' .
htmlspecialchars($layout) .
'. Directory is not empty.'
);
return false;
};
return true;
}
/**
* Save changes to the css settings for a layout
*
*/
public function CSSPreferences(){
global $langmessage, $gpLayouts;
$new_info = $gpLayouts[$this->curr_layout];
if( isset($_POST['menu_css_ordered']) ){
if( $_POST['menu_css_ordered'] === 'off' ){
$new_info['menu_css_ordered'] = false;
}else{
unset($new_info['menu_css_ordered']);
}
}
if( isset($_POST['menu_css_indexed']) ){
if( $_POST['menu_css_indexed'] === 'off' ){
$new_info['menu_css_indexed'] = false;
}else{
unset($new_info['menu_css_indexed']);
}
}
$gpLayouts[$this->curr_layout] = $new_info;
if( !$this->SaveLayouts(false) ){
return;
}
if( $this->layout_request || $this->page->gpLayout == $this->curr_layout ){
$this->page->SetTheme($this->curr_layout);
}
$content = $this->CSSPreferenceForm($this->curr_layout,$new_info);
$this->page->ajaxReplace = [];
$this->page->ajaxReplace[] = [
'replace',
'#layout_css_ul_' . $this->curr_layout,
$content
];
}
/**
* Remove a gadget from a layout
* @return null
*
*/
public function RmGadget(){
global $langmessage;
//$this->page->ajaxReplace = [];
$gadget =& $_REQUEST['gadget'];
$handlers = $this->GetAllHandlers($this->curr_layout);
//make sure GetAllGadgets is set
$this->PrepContainerHandlers(
$handlers,
'GetAllGadgets',
'GetAllGadgets'
);
$changed = false;
foreach($handlers as $container => $container_info){
foreach($container_info as $key => $gpOutCmd){
if( $gpOutCmd == $gadget ){
$changed = true;
unset($handlers[$container][$key]);
}
}
}
if( !$changed ){
msg($langmessage['OOPS'] . ' (Not Changed)');
return;
}
$this->SaveHandlersNew($handlers, $this->curr_layout);
}
public static function GetRandColor(){
$colors = self::GetColors();
$color_key = array_rand($colors);
return $colors[$color_key];
}
public static function GetColors(){
return [
'#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#0000ff', '#9900ff', '#ff00ff',
'#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#cfe2f3', '#d9d2e9', '#ead1dc',
'#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#9fc5e8', '#b4a7d6', '#d5a6bd',
'#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af', '#6fa8dc', '#8e7cc3', '#c27ba0',
'#cc0000', '#e69138', '#f1c232', '#6aa84f', '#45818e', '#3d85c6', '#674ea7', '#a64d79',
'#990000', '#b45f06', '#bf9000', '#38761d', '#134f5c', '#0b5394', '#351c75', '#741b47',
];
}
/**
* Update theme hooks and references in any related layouts
*
*
*/
public function UpgradeTheme(){
global $langmessage, $gpLayouts;
$theme =& $_REQUEST['source'];
$theme_info = $this->ThemeInfo($theme);
if( !$theme_info ){
msg($langmessage['OOPS'] . ' (Invalid Source)');
return false;
}
//install addon
$installer = new \gp\admin\Addon\Installer();
$installer->addon_folder_rel = dirname($theme_info['rel']);
$installer->code_folder_name = '_themes';
$installer->source = $theme_info['full_dir'];
$success = $installer->Install();
$installer->OutputMessages();
if( !$success ){
return;
}
$this->UpdateLayouts($installer);
}
/**
* Update related layouts with new $theme_info
*
*/
public function UpdateLayouts($installer){
global $gpLayouts, $langmessage;
$theme_folder = basename($installer->dest);
if( strpos($installer->dest, '/data/_themes') !== false ){
$new_layout_info = $this->AvailableTheme('/data/_themes', true, $theme_folder);
}else{
$new_layout_info = $this->AvailableTheme('/themes', false, $theme_folder);
}
if( $new_layout_info === false ){
return;
}
if( $installer->has_hooks ){
$new_layout_info['addon_key'] = $installer->config_key;
}
// update each layout
foreach($gpLayouts as $layout => $layout_info){
if( !$this->SameTheme($layout_info, $new_layout_info) ){
continue;
}
unset(
$layout_info['is_addon'],
$layout_info['addon_id'],
$layout_info['version'],
$layout_info['name'],
$layout_info['addon_key']
);
$layout_info += $new_layout_info;
$layout_info['theme'] = $theme_folder . '/' . basename($layout_info['theme']);
$gpLayouts[$layout] = $layout_info;
}
$this->SaveLayouts();
}
/**
* Return true if two layouts use the same theme
*
*/
public function SameTheme($layout_info, $new_layout_info ){
//if we have addon ids
if( isset($new_layout_info['addon_id']) &&
isset($layout_info['addon_id']) &&
$layout_info['addon_id'] == $new_layout_info['addon_id']
){
return true;
}
if( isset($layout_info['is_addon']) && $layout_info['is_addon'] ){
$layout_info['rel'] = '/data/_themes/' . dirname($layout_info['theme']);
}else{
$layout_info['rel'] = '/themes/' . dirname($layout_info['theme']);
}
$keys = ['is_addon' => '', 'rel' => ''];
$testa = array_intersect_key($layout_info, $keys);
$testb = array_intersect_key($new_layout_info, $keys);
if( $testa === $testb ){
return true;
}
return false;
}
/**
*
*/
public function RemoteInstallConfirmed($type='themes'){
$installer = parent::RemoteInstallConfirmed($type);
$this->GetPossible();
$this->UpdateLayouts($installer);
}
/**
* Display some options before copying a layout
*
*/
public function CopyLayoutPrompt(){
global $langmessage, $gpLayouts;
$layout = $this->ReqLayout();
if( $layout === false ){
return;
}
$label = self::NewLabel($gpLayouts[$layout]['label']);
echo '
' . $langmessage['new_layout'] . '
';
echo '';
}
/**
* Copy a layout
*
*/
public function CopyLayout(){
global $gpLayouts, $langmessage;
$copy_id = $this->ReqLayout();
if( $copy_id === false ){
return;
}
if( empty($_POST['label']) ){
msg($langmessage['OOPS'] . '(Empty Label)');
return;
}
$newLayout = $gpLayouts[$copy_id];
$newLayout['color'] = self::GetRandColor();
$newLayout['label'] = htmlspecialchars($_POST['label']);
//get new unique layout id
do{
$layout_id = rand(1000, 9999);
}while(isset($gpLayouts[$layout_id]));
$gpLayouts[$layout_id] = $newLayout;
if( !\gp\tool\Files::ArrayInsert($copy_id, $layout_id, $newLayout, $gpLayouts, 1) ){
msg($langmessage['OOPS'] . '(Not Inserted)');
return;
}
$success = true;
//copy any css
$css = $this->GetLayoutCSS($copy_id);
if( !$this->SaveCustom($layout_id, $css) ){
$success = false;
}
//copy possible customizer css
$customizer_css = $this->GetCustomizerCSS($copy_id);
if( !empty($customizer_css) && !$this->SaveCustomizerCSS($layout_id, $customizer_css) ){
$success = false;
}
//copy possible layout config
$layout_config = $this->GetLayoutConfig($copy_id);
if( !empty($layout_config) && !$this->SaveLayoutConfig($layout_id, $layout_config) ){
$success = false;
}
if (!empty($_POST['default'])){
$this->SaveLayouts(false);
$this->curr_layout = $layout_id;
$this->MakeDefault();
}else{
$this->SaveLayouts();
}
}
/**
* Save the gpLayouts data
*
*/
protected function SaveLayouts($notify_user=true){
global $gpLayouts;
if( \gp\admin\Tools::SavePagesPHP($notify_user, $notify_user) ){
return true;
}
if( is_array($this->gpLayouts_before) ){
$gpLayouts = $this->gpLayouts_before;
}
return false;
}
/**
* Save the config setting
* NOTE: This is not layout config but global system config!
*/
protected function SaveConfig(){
global $config;
if( \gp\admin\Tools::SaveConfig(true, true) ){
return true;
}
if( is_array($this->config_before) ){
$config = $this->config_before;
}
return false;
}
/**
* Create a new unique layout label
* @static
*/
public function NewLabel($label){
global $gpLayouts;
$labels = [];
foreach($gpLayouts as $info){
$labels[$info['label']] = true;
}
$len = strlen($label);
if( $len > 25 ){
$label = substr($label,0,$len-2);
}
if( substr($label, $len - 2, 1) === '_' && is_numeric(substr($label, $len - 1, 1)) ){
$label = substr($label, 0, $len - 2);
}
$int = 1;
do{
$new_label = $label . '_' . $int;
$int++;
}while(isset($labels[$new_label]));
return $new_label;
}
public function LoremIpsum(){
global $langmessage, $gp_titles, $gp_menu;
ob_start();
echo '
H1 Lorem Ipsum Heading
';
echo '
Paragraph (larger): Lorem ipsum dolor sit amet, consectetur adipisicing elit, ';
echo 'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ';
echo 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
';
echo '
H2 Lorem Ipsum Heading
';
echo '
Paragraph: Excepteur sint emphasize cupidatat non strong proident, sunt in ';
echo 'emphasized strong culpa qui officia anchor ';
echo 'deserunt underline mollit anim id est laborum. Duis aute irure dolor in reprehenderit in voluptate ';
echo 'velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui ';
echo 'abbr officia deserunt mollit mark anim id est code laborum.
';
echo '
Blockquote: Lorem ipsum dolor sit amet, consectetur adipisicing elit.
';
echo '
';
echo '
';
echo '
Unordered list
';
echo '
';
echo '
Lorem Ipsum unordered list item
';
echo '
Lorem Ipsum unordered list item
';
echo '
Lorem Ipsum unordered list item
';
echo '
Lorem Ipsum unordered list item
';
echo '
';
echo '
'; // /.gpCol-4
echo '
';
echo '
Ordered list
';
echo '';
echo '
Lorem Ipsum ordered list item
';
echo '
Lorem Ipsum ordered list item
';
echo '
Lorem Ipsum ordered list item
';
echo '
Lorem Ipsum ordered list item
';
echo '';
echo '
'; // /.gpCol-4
echo '
';
echo '
Description list
';
echo '
';
echo '
Lorem Ipsum term
Lorem Ipsum description
';
echo '
Lorem Ipsum term
Lorem Ipsum description
';
echo '
';
echo '
'; // /.gpCol-4
echo '
'; // /.gpRow
echo '';
echo '
';
echo '
';
echo '
H3 Lorem Ipsum Heading
';
echo '
H4 Lorem Ipsum Heading
';
echo '
H5 Lorem Ipsum Heading
';
echo '
H6 Lorem Ipsum Heading
';
echo '
Paragraph (smaller): Excepteur sint cupidatat non proident, sunt in ';
echo 'culpa qui officia deserunt mollit anim id est laborum. Duis aute irure dolor in reprehenderit ';
echo 'in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat ';
echo 'non proident.
Lead: Lorem ipsum dolor sit amet, consectetur adipisicing elit, ';
echo 'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ';
echo 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
';
echo '
H2 Lorem Ipsum Heading + small
';
echo '
Default paragraph: Excepteur sint emphasize cupidatat non strong proident, sunt in ';
echo 'emphasized strong culpa qui officia anchor ';
echo 'deserunt underline mollit anim id est laborum. Duis aute irure dolor in reprehenderit in voluptate ';
echo 'velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint kbd occaecat cupidatat non proident, sunt in culpa qui ';
echo 'abbr officia deserunt mollit mark anim id est code laborum.
Blockquote: Lorem ipsum dolor sit amet, consectetur adipisicing elit.
';
echo '
';
echo '
';
echo '
Unordered list
';
echo '
';
echo '
Lorem Ipsum unordered list item
';
echo '
Lorem Ipsum unordered list item
';
echo '
Lorem Ipsum unordered list item
';
echo '
Lorem Ipsum unordered list item
';
echo '
';
echo '
'; // /.col-md-4
echo '
';
echo '
Ordered list
';
echo '';
echo '
Lorem Ipsum ordered list item
';
echo '
Lorem Ipsum ordered list item
';
echo '
Lorem Ipsum ordered list item
';
echo '
Lorem Ipsum ordered list item
';
echo '';
echo '
'; // /.col-md-4
echo '
';
echo '
Description list
';
echo '
';
echo '
Lorem Ipsum term
Lorem Ipsum description
';
echo '
Lorem Ipsum term
Lorem Ipsum description
';
echo '
';
echo '
'; // /.col-md-4
echo '
'; // /.row
echo '
';
echo '
';
echo '
H3 Lorem Ipsum Heading + small
';
echo '
H4 Lorem Ipsum Heading + small
';
echo '
H5 Lorem Ipsum Heading + small
';
echo '
H6 Lorem Ipsum Heading + small
';
echo '
Small text paragraph: Excepteur sint cupidatat non proident, sunt in ';
echo 'culpa qui officia deserunt mollit anim id est laborum. Duis aute irure dolor in reprehenderit ';
echo 'in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat ';
echo 'non proident. ';
echo '