1
0
mirror of https://github.com/e107inc/e107.git synced 2025-01-17 04:38:27 +01:00
php-e107/e107_handlers/theme_handler.php

3267 lines
84 KiB
PHP
Raw Normal View History

2009-10-28 23:52:56 +00:00
<?php
2006-12-02 04:36:16 +00:00
/*
* e107 website system
*
* Copyright (C) 2008-2016 e107 Inc (e107.org)
* Released under the terms and conditions of the
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
*
* e107 Admin Theme Handler
*
2009-10-28 23:45:46 +00:00
*/
2006-12-02 04:36:16 +00:00
2009-10-28 23:45:46 +00:00
if(!defined('e107_INIT'))
{
exit;
}
2006-12-02 04:36:16 +00:00
// new in v.2.1.4
/**
* Retrieve info about themes on the system. - optimized for speed.
* Class e_theme
*/
class e_theme
{
private static $allowedCategories = array(
'generic',
'adult',
'blog',
'clan',
'children',
'corporate',
'forum',
'gaming',
'gallery',
'news',
'social',
'video',
'multimedia'
);
2017-02-02 16:42:11 -08:00
private $_data = array();
private $_current = null;
private $_frontcss = null;
private $_admincss = null;
private $_legacy_themes = array();
const CACHETIME = 120; // 2 hours
const CACHETAG = "Meta_theme";
2017-02-02 16:42:11 -08:00
function __construct($options=array())
{
2017-02-02 16:42:11 -08:00
if(!empty($options['themedir']))
{
$this->_current = $options['themedir'];
}
if(!defined('E107_INSTALL'))
{
$this->_frontcss = e107::getPref('themecss');
$this->_admincss = e107::getPref('admincss');
}
if(empty($this->_data) || $options['force'] === true)
{
$this->load($options['force']);
}
2017-02-02 16:42:11 -08:00
}
/**
* Load theme layout from html files
* Required theme.html file in the theme root directory.
* @param string $key layout name
* @return array|bool
*/
public static function loadLayout($key=null, $theme = null)
{
if($theme === null)
{
$theme = e107::pref('core','sitetheme');
}
if(!is_readable(e_THEME.$theme."/layouts/".$key."_layout.html") || !is_readable(e_THEME.$theme."/theme.html"))
{
return false;
}
e107::getDebug()->log("Using HTML layout: ".$key.".html");
$tmp = file_get_contents(e_THEME.$theme."/theme.html");
$LAYOUT = array();
list($LAYOUT['_header_'], $LAYOUT['_footer_']) = explode("{---LAYOUT---}", $tmp, 2);
$LAYOUT[$key] = file_get_contents(e_THEME.$theme."/layouts/".$key."_layout.html");
return $LAYOUT;
}
2017-02-02 16:42:11 -08:00
/**
* Load library dependencies.
*
* @param string $scope
* front | admin | all | auto
*/
public function loadLibrary($scope = 'auto')
{
if($scope === 'auto')
{
$scope = 'front';
if(deftrue('e_ADMIN_AREA', false))
{
$scope = 'admin';
}
}
$libraries = $this->get('library');
if(empty($libraries))
{
return;
}
foreach($libraries as $library)
{
if(empty($library['name']))
{
continue;
}
// If no scope set, we load library on both areas.
if(empty($library['scope']) || $library['scope'] === 'all')
{
if($library['name'] === 'bootstrap' && varset($library['version']) == 4) // quick fix.
{
$library['name'] .= (string) $library['version'];
2019-02-28 14:20:33 -08:00
e107::getParser()->setBootstrap($library['version']);
if(!defined('BOOTSTRAP'))
{
define('BOOTSTRAP', (int) $library['version']);
}
}
elseif($library['name'] === 'fontawesome' && !empty($library['version'])) // quick fix.
{
$library['name'] .= (string) $library['version'];
2019-02-28 14:20:33 -08:00
e107::getParser()->setFontAwesome($library['version']);
if(!defined('FONTAWESOME'))
{
define('FONTAWESOME', (int) $library['version']);
}
}
e107::library('load', $library['name']);
continue;
}
if($library['scope'] === $scope)
{
e107::library('load', $library['name']);
continue;
}
}
}
/**
* Get info on the current front or admin theme and selected style.
* (ie. as found in theme.xml <stylesheets>)
*
2017-02-02 16:42:11 -08:00
* @param string $mode
* front | admin | auto
* @param string $var
* file | name | scope | exclude
*
* @return mixed
2017-02-02 16:42:11 -08:00
*/
public function cssAttribute($mode = 'front', $var = null)
2017-02-02 16:42:11 -08:00
{
$css = $this->get('css');
if(empty($css))
{
return false;
}
if($mode === 'auto')
{
$mode = 'front';
if(deftrue('e_ADMIN_AREA', false))
{
$mode = 'admin';
}
}
foreach($css as $k => $v)
2017-02-02 16:42:11 -08:00
{
if($mode === 'front' && $v['name'] === $this->_frontcss)
{
return !empty($var) ? varset($v[$var], null) : $v;
2017-02-02 16:42:11 -08:00
}
if($mode === 'admin' && $v['name'] === $this->_admincss)
{
return !empty($var) ? varset($v[$var], null) : $v;
2017-02-02 16:42:11 -08:00
}
}
return false;
}
public function clearCache()
{
e107::getCache()->clear(self::CACHETAG, true);
return $this;
}
public function upgradeThemeCode($text)
{
$search = array();
$replace = array();
$search[0] = '$HEADER ';
$replace[0] = '$HEADER["default"] ';
$search[1] = '$FOOTER ';
$replace[1] = '$FOOTER["default"] ';
// Early 0.6 and 0.7 Themes
$search[2] = '$CUSTOMHEADER ';
$replace[2] = '$HEADER["custom"] ';
$search[3] = '$CUSTOMFOOTER ';
$replace[3] = '$FOOTER["custom"] ';
//TODO Handle v1.x style themes. eg. $CUSTOMHEADER['something'];
$text = str_replace($_SESSION['themebulder-remove'],"",$text);
$text = str_replace($search, $replace, $text);
return $text;
}
2017-02-02 16:42:11 -08:00
/**
* Load data for all themes in theme directory.
* @param bool|false $force
* @return $this
*/
private function load($force=false)
{
$themeArray = array();
2017-02-02 16:42:11 -08:00
$tloop = 1;
2017-02-02 16:42:11 -08:00
$cacheTag = self::CACHETAG;
if($force === false && $tmp = e107::getCache()->retrieve($cacheTag, self::CACHETIME, true, true))
{
$this->_data = e107::unserialize($tmp);
return $this;
}
$array = scandir(e_THEME);
foreach($array as $file)
{
if($file != "." && $file != ".." && $file != "CVS" && $file != "templates" && is_dir(e_THEME.$file) && is_readable(e_THEME.$file."/theme.php"))
{
$themeArray[$file] = self::getThemeInfo($file);
$themeArray[$file]['id'] = $tloop;
$tloop++;
}
}
$cacheSet = e107::serialize($themeArray,'json');
e107::getCache()->set($cacheTag,$cacheSet,true,true,true);
$this->_data = $themeArray;
}
/**
* Return a var from the current theme.
* @param $var
* @param null $key
* @return array|bool
*/
2017-02-03 07:56:54 -08:00
public function get($var=null, $key=null)
2017-02-02 16:42:11 -08:00
{
2017-02-03 07:56:54 -08:00
if(empty($var) && isset($this->_data[$this->_current]))
{
return $this->_data[$this->_current];
}
2017-02-02 16:42:11 -08:00
return isset($this->_data[$this->_current][$var]) ? $this->_data[$this->_current][$var] : false;
}
/**
* Rebuild URL without trackers, for matching against theme_layout prefs.
* @param string $url
* @return string
*/
private function filterTrackers($url)
{
if(strpos($url,'?') === false || empty($url))
{
return $url;
}
list($site,$query) = explode('?',$url);
parse_str($query,$get);
$get = eHelper::removeTrackers($get);
$ret = empty($get) ? $site : $site.'?'.http_build_query($get);
return $ret;
}
/**
* Calculate THEME_LAYOUT constant based on theme preferences and current URL.
2019-02-26 13:56:07 -08:00
*
* @param array $cusPagePref
* @param string $defaultLayout
* @param string $request_url (optional) defaults to e_REQUEST_URL
* @param string $request_script $_SERVER['SCRIPT_FILENAME'];
2019-02-26 13:56:07 -08:00
* @return int|string
*/
2019-02-28 14:20:33 -08:00
public function getThemeLayout($cusPagePref, $defaultLayout, $request_url = null, $request_script = null)
{
2019-02-26 13:56:07 -08:00
if($request_url === null)
{
$request_url = e_REQUEST_URL;
}
$def = ""; // no custom pages found yet.
2019-02-28 14:20:33 -08:00
if(is_array($cusPagePref) && count($cusPagePref)>0) // check if we match a page in layout custompages.
{
//e_SELF.(e_QUERY ? '?'.e_QUERY : '');
$c_url = str_replace(array('&amp;'), array('&'), $request_url);//.(e_QUERY ? '?'.e_QUERY : '');// mod_rewrite support
// FIX - check against urldecoded strings
$c_url = rtrim(rawurldecode($c_url), '?');
$c_url = $this->filterTrackers($c_url);
2019-02-28 14:20:33 -08:00
// First check all layouts for exact matches - possible fix for future issues?.
/*
foreach($cusPagePref as $lyout=>$cusPageArray)
{
if(!is_array($cusPageArray)) { continue; }
$base = basename($request_url);
if(in_array("/".$base, $cusPageArray) || in_array($base, $cusPageArray))
{
return $lyout;
}
}*/
foreach($cusPagePref as $lyout=>$cusPageArray)
{
2019-02-28 14:20:33 -08:00
if(!is_array($cusPageArray)) { continue; }
// NEW - Front page template check - early
if(in_array('FRONTPAGE', $cusPageArray) && ($c_url == SITEURL || rtrim($c_url, '/') == SITEURL.'index.php'))
{
2019-02-28 14:20:33 -08:00
return $lyout;
}
2019-02-28 14:20:33 -08:00
foreach($cusPageArray as $kpage)
{
2019-03-26 12:05:01 -07:00
$lastChar = substr($kpage, -1);
if($lastChar === '$') // script name match.
{
$kpage = rtrim($kpage, '$');
if(!empty($request_script) && strpos($request_script, '/'.$kpage) !== false)
2019-03-26 12:05:01 -07:00
{
return $lyout;
}
}
if($lastChar === '!')
{
2019-02-28 14:20:33 -08:00
$kpage = rtrim($kpage, '!');
2019-02-28 14:20:33 -08:00
if(basename($request_url) === $kpage) // exact match specified by '!', skip other processing.
2019-02-28 14:20:33 -08:00
{
return $lyout;
2019-02-28 14:20:33 -08:00
}
elseif(substr($c_url, - strlen($kpage)) === $kpage)
{
2019-02-28 14:20:33 -08:00
$def = $lyout;
}
2019-02-28 14:20:33 -08:00
continue;
}
2019-02-28 14:20:33 -08:00
if (!empty($kpage) && (strpos($c_url, $kpage) !== false)) // partial URL match
{
$def = $lyout;
}
2019-03-26 12:05:01 -07:00
}
}
}
if($def) // custom-page layout.
{
$layout = $def;
}
else // default layout.
{
2019-02-26 13:56:07 -08:00
$layout = $defaultLayout;
}
return $layout;
}
2017-02-02 16:42:11 -08:00
/**
* Return a list of all local themes in various formats.
* Replaces getThemeList
* @param null|string $mode null, 'version' | 'id'
* @return array|bool a list or false if no results
*/
public function getList($mode=null)
{
$arr = array();
if($mode === 'version')
{
foreach($this->_data as $dir=>$v)
{
$arr[$dir] = array('version'=>$v['version'], 'author'=>$v['author']);
2017-02-02 16:42:11 -08:00
}
}
elseif($mode === 'id')
{
foreach($this->_data as $dir=>$v)
{
$arr[] = $dir;
}
}
else
{
$arr = $this->_data;
}
return !empty($arr) ? $arr : false;
}
/**
* Get a list of all themes in theme folder and its data.
2017-02-02 16:42:11 -08:00
* @deprecated
* @see load();
* @param bool|false xml|false
* @param bool|false $force force a refresh ie. ignore cached list.
* @return array
*/
public static function getThemeList($mode = false, $force = false)
{
$themeArray = array();
$tloop = 1;
$cacheTag = self::CACHETAG;
if(!empty($mode))
{
$cacheTag = self::CACHETAG.'_'.$mode;
}
if($force === false && $tmp = e107::getCache()->retrieve($cacheTag, self::CACHETIME, true, true))
{
return e107::unserialize($tmp);
}
$array = scandir(e_THEME);
foreach($array as $file)
{
if(($mode == 'xml') && !is_readable(e_THEME.$file."/theme.xml"))
{
continue;
}
if($file != "." && $file != ".." && $file != "CVS" && $file != "templates" && is_dir(e_THEME.$file) && is_readable(e_THEME.$file."/theme.php"))
{
if($mode === "id")
{
$themeArray[$tloop] = $file;
}
elseif($mode === 'version')
{
$data = self::getThemeInfo($file);
$themeArray[$file] = $data['version'];
}
else
{
$themeArray[$file] = self::getThemeInfo($file);
$themeArray[$file]['id'] = $tloop;
}
$tloop++;
}
}
$cacheSet = e107::serialize($themeArray,'json');
e107::getCache()->set($cacheTag,$cacheSet,true,true,true);
return $themeArray;
}
2017-02-02 16:42:11 -08:00
/**
* Internal Use. Heavy CPU usage.
* Use e107::getTheme($themeDir,$force)->get() instead.
* @param $file
* @return mixed
*/
public static function getThemeInfo($file)
{
$reject = array('e_.*');
$handle2 = e107::getFile()->get_files(e_THEME.$file."/", "\.php|\.css|\.xml|preview\.jpg|preview\.png", $reject, 1);
$themeArray = array();
foreach ($handle2 as $fln)
{
$file2 = str_replace(e_THEME.$file."/", "", $fln['path']).$fln['fname'];
$themeArray[$file]['files'][] = $file2;
if(strstr($file2, "preview."))
{
$themeArray[$file]['preview'] = e_THEME.$file."/".$file2;
}
// ---------------- get information string for css file - Legacy mode (no theme.xml)
if(strstr($file2, ".css") && !strstr($file2, "menu.css") && strpos($file2, "e_") !== 0)
{
if($cssContents = file_get_contents(e_THEME.$file."/".$file2))
{
$nonadmin = preg_match('/\* Non-Admin(.*?)\*\//', $cssContents) ? true : false;
preg_match('/\* info:(.*?)\*\//', $cssContents, $match);
$match[1] = varset($match[1], '');
$scope = ($nonadmin == true) ? 'front' : '';
$themeArray[$file]['css'][] = array("name"=>$file2, "info"=>$match[1], "scope"=>$scope, "nonadmin"=>$nonadmin);
}
else
{
// $mes->addDebug("Couldn't read file: ".e_THEME.$file."/".$file2);
}
}
} // end foreach
// Load Theme information and merge with existing array. theme.xml (v2.x theme) is given priority over theme.php (v1.x).
if(in_array("theme.xml", $themeArray[$file]['files']))
{
$themeArray[$file] = array_merge($themeArray[$file], self::parse_theme_xml($file));
}
elseif(in_array("theme.php", $themeArray[$file]['files']))
{
$themeArray[$file] = array_merge($themeArray[$file], self::parse_theme_php($file));
}
if(!empty($themeArray[$file]['css']) && count($themeArray[$file]['css']) > 1)
{
$themeArray[$file]['multipleStylesheets'] = true;
}
return $themeArray[$file];
}
public static function parse_theme_php($path)
{
2019-05-27 10:45:35 -07:00
$CUSTOMPAGES = null;
2017-02-02 16:42:11 -08:00
$tp = e107::getParser(); // could be used by a theme file.
$sql = e107::getDb(); // could be used by a theme file.
$fp = fopen(e_THEME.$path."/theme.php", "r");
$themeContents = fread($fp, filesize(e_THEME.$path."/theme.php"));
fclose($fp);
preg_match('/themename(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['name'] = varset($match[3], '');
preg_match('/themeversion(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['version'] = varset($match[3], '');
preg_match('/themeauthor(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['author'] = varset($match[3], '');
preg_match('/themeemail(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['email'] = varset($match[3], '');
preg_match('/themewebsite(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['website'] = varset($match[3], '');
preg_match('/themedate(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['date'] = varset($match[3], '');
preg_match('/themeinfo(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['info'] = varset($match[3], '');
preg_match('/xhtmlcompliant(\s*?=\s*?)(\S*?);/si', $themeContents, $match);
$xhtml = strtolower($match[2]);
$themeArray['xhtmlcompliant'] = ($xhtml == "true" ? "1.1" : false);
preg_match('/csscompliant(\s*?=\s*?)(\S*?);/si', $themeContents, $match);
$css = strtolower($match[2]);
$themeArray['csscompliant'] = ($css == "true" ? "2.1" : false);
2017-02-01 09:16:31 -08:00
$themeArray['version'] = str_replace(array('<br />','<br>','<br/>'),' ',$themeArray['version']);
/* preg_match('/CUSTOMPAGES(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['custompages'] = array_filter(explode(" ",$match[3]));*/
$themeContentsArray = explode("\n", $themeContents);
preg_match_all("#\\$"."CUSTOMHEADER\[(\"|')(.*?)('|\")\].*?#",$themeContents,$match);
$customHeaderArray = $match[2];
preg_match_all("#\\$"."CUSTOMFOOTER\[(\"|')(.*?)('|\")\].*?#",$themeContents,$match);
$customFooterArray = $match[2];
if(!$themeArray['name'])
{
unset($themeArray);
}
$lays['legacyDefault']['@attributes'] = array('title'=>'Default',
'plugins'=>'',
'default'=>'true');
// load custompages from theme.php only when theme.xml doesn't exist.
if(!file_exists(e_THEME.$path."theme.xml"))
{
foreach ($themeContentsArray as $line)
{
if(strstr($line, "CUSTOMPAGES"))
{
2017-02-03 07:39:20 -08:00
try
{
@eval(str_replace("$", "\$", $line)); // detect arrays also.
}
catch (ParseError $e)
{
}
}
}
if(is_array($CUSTOMPAGES))
{
foreach ($CUSTOMPAGES as $key=>$val)
{
$themeArray['custompages'][$key] = explode(" ", trim($val));
$lays[$key]['custompages'] = trim($val);
}
}
elseif($CUSTOMPAGES)
{
$themeArray['custompages']['legacyCustom'] = explode(" ", $CUSTOMPAGES);
$lays['legacyCustom']['@attributes'] = array('title'=>'Custom',
'plugins'=>'');
}
foreach($customHeaderArray as $tm)
{
$lays[$tm]['@attributes'] = array('title'=>str_replace("_"," ",$tm),
'plugins'=>'');
}
foreach($customFooterArray as $tm)
{
$lays[$tm]['@attributes'] = array('title'=>str_replace("_"," ",$tm),
'plugins'=>'');
}
}
$themeArray['path'] = $path;
$themeArray['layouts'] = $lays;
2017-01-10 17:57:04 -08:00
$themeArray['description'] = $themeArray['info'];
if(file_exists(e_THEME.$path."/preview.jpg"))
{
$themeArray['preview'] = array("preview.jpg");
$themeArray['thumbnail'] = "preview.jpg";
}
if(file_exists(e_THEME.$path."/preview.png"))
{
$themeArray['preview'] = array("preview.png");
$themeArray['thumbnail'] = "preview.png";
}
// echo "<h2>".$themeArray['name']."</h2>";
// print_a($lays);
2017-02-02 16:42:11 -08:00
$themeArray['legacy'] = true;
return $themeArray;
}
public static function parse_theme_xml($path)
{
$tp = e107::getParser();
$xml = e107::getXml();
// loadLanFiles($path, 'admin'); // Look for LAN files on default paths
// layout should always be an array.
$xml->setOptArrayTags('layout,screenshots/image,plugins/plugin');
$xml->setOptStringTags('menuPresets,customPages,custompages');
//
// $vars = $xml->loadXMLfile(e_THEME.$path.'/theme.xml', true, true);
// $oldvars =
$vars = $xml->loadXMLfile(e_THEME.$path.'/theme.xml', 'advanced', true); // must be 'advanced'
if($path == "bootstrap3" )
{
// echo "<table class='table table-bordered'>
// <tr><th>old</th><th>new parser</th></tr>
// <tr><td>".print_a($oldvars,true)."</td><td>".print_a($vars,true)."</td></tr></table>";
}
$vars['name'] = varset($vars['@attributes']['name']);
$vars['version'] = varset($vars['@attributes']['version']);
$vars['date'] = varset($vars['@attributes']['date']);
$vars['compatibility'] = varset($vars['@attributes']['compatibility']);
$vars['releaseUrl'] = varset($vars['@attributes']['releaseUrl']);
$vars['email'] = varset($vars['author']['@attributes']['email']);
$vars['website'] = varset($vars['author']['@attributes']['url']);
$vars['author'] = varset($vars['author']['@attributes']['name']);
$vars['info'] = !empty($vars['description']['@value']) ? $vars['description']['@value'] : varset($vars['description']);
$vars['category'] = self::getThemeCategory(varset($vars['category']));
$vars['xhtmlcompliant'] = varset($vars['compliance']['@attributes']['xhtml']);
$vars['csscompliant'] = varset($vars['compliance']['@attributes']['css']);
$vars['path'] = $path;
$vars['@attributes']['default'] = (varset($vars['@attributes']['default']) && strtolower($vars['@attributes']['default']) == 'true') ? 1 : 0;
$vars['preview'] = varset($vars['screenshots']['image']);
$vars['thumbnail'] = isset($vars['preview'][0]) && file_exists(e_THEME.$path.'/'.$vars['preview'][0]) ? $vars['preview'][0] : '';
2017-01-10 17:57:04 -08:00
if(!empty($vars['themePrefs']))
{
foreach($vars['themePrefs']['pref'] as $k=>$val)
{
$name = $val['@attributes']['name'];
$vars['preferences'][$name] = $val['@value'];
}
}
2017-01-10 17:57:04 -08:00
unset($vars['authorEmail'], $vars['authorUrl'], $vars['xhtmlCompliant'], $vars['cssCompliant'], $vars['screenshots']);
// Compile layout information into a more usable format.
$custom = array();
/*
foreach ($vars['layouts'] as $layout)
{
foreach ($layout as $key=>$val)
{
$name = $val['@attributes']['name'];
unset($val['@attributes']['name']);
$lays[$name] = $val;
if(isset($val['customPages']))
{
$cusArray = explode(" ", $val['customPages']);
$custom[$name] = array_filter($cusArray);
}
if(isset($val['custompages']))
{
$cusArray = explode(" ", $val['custompages']);
$custom[$name] = array_filter(explode(" ", $val['custompages']));
}
}
}
*/
$lays = array();
foreach($vars['layouts']['layout'] as $k=>$val)
{
$name = $val['@attributes']['name'];
unset($val['@attributes']['name']);
$lays[$name] = $val;
if(isset($val['custompages']))
{
if(is_string($val['custompages']))
{
$custom[$name] = array_filter(explode(" ", $val['custompages']));
}
elseif(is_array($val['custompages']))
{
$custom[$name] = $val['custompages'];
}
}
}
$vars['layouts'] = $lays;
$vars['path'] = $path;
$vars['custompages'] = $custom;
$vars['legacy'] = false;
$vars['library'] = array();
if(!empty($vars['libraries']['library']))
{
$vars['css'] = array();
foreach($vars['libraries']['library'] as $val)
{
$vars['library'][] = array(
'name' => $val['@attributes']['name'],
'version' => varset($val['@attributes']['version']),
'scope' => varset($val['@attributes']['scope']),
);
}
unset($vars['libraries']);
}
if(!empty($vars['stylesheets']['css']))
{
$vars['css'] = array();
foreach($vars['stylesheets']['css'] as $val)
{
2017-01-31 16:39:00 -08:00
// $notadmin = vartrue($val['@attributes']['admin']) ? false : true;
$notadmin = (varset($val['@attributes']['scope']) !== 'admin') ? true : false;
2017-02-02 16:42:11 -08:00
$vars['css'][] = array(
"name" => $val['@attributes']['file'],
"info" => $val['@attributes']['name'],
"nonadmin" => $notadmin,
'scope' => vartrue($val['@attributes']['scope']),
'exclude' => vartrue($val['@attributes']['exclude']),
'description' => vartrue($val['@attributes']['description']),
'thumbnail' => vartrue($val['@attributes']['thumbnail'])
2017-02-02 16:42:11 -08:00
);
}
unset($vars['stylesheets']);
}
$vars['glyphs'] = array();
if(!empty($vars['glyphicons']['glyph']))
{
foreach($vars['glyphicons']['glyph'] as $val)
{
$vars['glyphs'][] = array(
'name' => isset($val['@attributes']['name']) ? $val['@attributes']['name'] : '',
'pattern' => isset($val['@attributes']['pattern']) ? $val['@attributes']['pattern'] : '',
'path' => isset($val['@attributes']['path']) ? $val['@attributes']['path'] : '',
'class' => isset($val['@attributes']['class']) ? $val['@attributes']['class'] : '',
'prefix' => isset($val['@attributes']['prefix']) ? $val['@attributes']['prefix'] : '',
'tag' => isset($val['@attributes']['tag']) ? $val['@attributes']['tag'] : '',
);
}
unset($vars['glyphicons']);
}
if($path == "landingzero" )
{
// e107::getMessage()->addDebug("<h2>".$path."</h2>");
// e107::getMessage()->addDebug(print_a($vars,true));
// $mes->addDebug("<hr />");
}
if($path == "bootstrap3" )
{
// print_a($vars);
// echo "<table class='table'><tr><td>".print_a($vars,true)."</td><td>".print_a($adv,true)."</td></tr></table>";
}
return $vars;
}
/**
* Validate and return the name of the categories.
*
* @param string [optional] $categoryfromXML
* @return string
*/
private static function getThemeCategory($categoryfromXML = '')
{
if(!$categoryfromXML)
{
return 'generic';
}
$tmp = explode(",", $categoryfromXML);
$category = array();
foreach ($tmp as $cat)
{
$cat = trim($cat);
if(in_array($cat, self::$allowedCategories))
{
$category[] = $cat;
}
else
{
$category[] = 'generic';
}
}
return implode(', ', $category);
}
}
2009-10-28 23:45:46 +00:00
class themeHandler
{
2009-10-28 23:52:56 +00:00
2006-12-02 04:36:16 +00:00
var $themeArray;
var $action;
var $id;
2009-07-06 05:59:42 +00:00
var $frm;
var $fl;
2009-08-17 11:25:01 +00:00
var $themeConfigObj = null;
var $themeConfigFormObj= null;
2009-09-17 00:13:40 +00:00
var $noLog = FALSE;
2016-11-28 16:27:17 -08:00
private $curTheme = null;
2012-11-29 22:03:36 -08:00
private $approvedAdminThemes = array('bootstrap','bootstrap3');
2012-11-29 22:03:36 -08:00
2009-10-28 23:45:46 +00:00
public $allowedCategories = array('generic',
'adult',
'blog',
'clan',
'children',
'corporate',
'forum',
'gaming',
'gallery',
'news',
'social',
'video',
'multimedia');
/**
* Marketplace handler instance
* @var e_marketplace
*/
protected $mp;
const RENDER_THUMBNAIL = 0;
const RENDER_SITEPREFS = 1;
const RENDER_ADMINPREFS = 2;
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
/* constructor */
2009-10-28 23:45:46 +00:00
function __construct()
2009-10-28 23:45:46 +00:00
{
2009-10-28 23:52:56 +00:00
2012-11-28 02:22:23 -08:00
global $e107cache,$pref;
$mes = e107::getMessage();
/*
if(deftrue('e_BOOTSTRAP3_ADMIN'))
{
$this->approvedAdminThemes[] = 'bootstrap3';
}
*/
2009-10-28 23:45:46 +00:00
require_once (e_HANDLER."form_handler.php");
2012-11-28 04:32:05 -08:00
2009-10-28 23:52:56 +00:00
//enable inner tabindex counter
if(!deftrue("E107_INSTALL"))
{
$this->frm = new e_form();
}
2009-10-28 23:45:46 +00:00
$this->fl = e107::getFile();
$this->postObserver();
}
public function postObserver()
{
$mes = e107::getMessage();
$pref = e107::getPref();
if(!empty($_POST['upload']))
{
$unzippedTheme = $this->themeUpload();
}
2016-11-28 16:27:17 -08:00
if(!empty($_POST['curTheme']))
{
$this->curTheme = e107::getParser()->filter($_POST['curTheme'],'file');
2016-11-28 16:27:17 -08:00
}
if(!empty($_POST['setUploadTheme']) && !empty($unzippedTheme))
{
$themeArray = $this->getThemes();
$this->id = $themeArray[$unzippedTheme]['id'];
if($this->setTheme())
{
$mes->addSuccess(TPVLAN_3);
}
else
{
$mes->addError(TPVLAN_86);
}
2006-12-02 04:36:16 +00:00
}
if(!empty($_POST['installContent']))
{
$this->installContent($_POST['installContent']);
}
2009-10-28 23:45:46 +00:00
$this->themeArray = (defined('E107_INSTALL')) ? $this->getThemes('xml') : $this->getThemes();
2009-10-28 23:45:46 +00:00
// print_a($this -> themeArray);
2009-10-28 23:45:46 +00:00
foreach ($_POST as $key=>$post)
2006-12-02 04:36:16 +00:00
{
2009-10-28 23:45:46 +00:00
if(strstr($key, "preview"))
2006-12-02 04:36:16 +00:00
{
2009-10-28 23:45:46 +00:00
// $this -> id = str_replace("preview_", "", $key);
$this->id = key($post);
$this->themePreview();
2006-12-02 04:36:16 +00:00
}
/* if(strstr($key, "selectmain"))
2006-12-02 04:36:16 +00:00
{
2009-10-28 23:45:46 +00:00
// $this -> id = str_replace("selectmain_", "", $key);
$this->id = key($post);
if($this->setTheme())
{
$mes->addSuccess(TPVLAN_3);
}
else
{
$mes->addError(TPVLAN_3);
}
}*/
2009-10-28 23:45:46 +00:00
if(strstr($key, "selectadmin"))
2006-12-02 04:36:16 +00:00
{
2009-10-28 23:45:46 +00:00
$this->id = key($post);
$this->setAdminTheme();
$this->refreshPage('admin');
2006-12-02 04:36:16 +00:00
}
}
2006-12-02 04:36:16 +00:00
if(isset($_POST['submit_adminstyle']))
{
2016-11-28 16:27:17 -08:00
$this->id = $this->curTheme;
2009-10-28 23:45:46 +00:00
if($this->setAdminStyle())
{
eMessage::getInstance()->add(TPVLAN_43, E_MESSAGE_SUCCESS);
}
e107::getConfig()->save(true);
2006-12-02 04:36:16 +00:00
}
2006-12-02 04:36:16 +00:00
if(isset($_POST['submit_style']))
{
2016-11-28 16:27:17 -08:00
$this->id = $this->curTheme;
$this->setLayouts(); // Update the layouts in case they have been manually changed.
2009-10-28 23:45:46 +00:00
$this->SetCustomPages($_POST['custompages']);
$this->setStyle();
2009-10-28 23:45:46 +00:00
e107::getConfig()->save(true);
2006-12-02 04:36:16 +00:00
}
if(!empty($_POST['git_pull']))
{
$gitTheme = e107::getParser()->filter($_POST['git_pull'],'w');
$return = e107::getFile()->gitPull($gitTheme, 'theme');
$mes->addSuccess($return);
}
if(isset($_POST['installplugin']))
{
$key = key($_POST['installplugin']);
2017-01-23 09:41:23 -08:00
e107::includeLan(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_plugin.php");
2009-10-28 23:45:46 +00:00
require_once (e_HANDLER."plugin_class.php");
$eplug = new e107plugin;
2009-10-28 23:45:46 +00:00
$message = $eplug->install_plugin($key);
2012-11-28 02:22:23 -08:00
$mes->add($message, E_MESSAGE_SUCCESS);
}
if(isset($_POST['setMenuPreset']))
{
2009-10-28 23:45:46 +00:00
$key = key($_POST['setMenuPreset']);
2017-01-23 09:41:23 -08:00
e107::includeLan(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_menus.php");
2009-10-28 23:45:46 +00:00
require_once (e_HANDLER."menumanager_class.php");
2009-08-16 16:30:56 +00:00
$men = new e_menuManager();
$men->curLayout = $key;
2009-10-28 23:52:56 +00:00
//menu_layout is left blank when it's default.
$men->dbLayout = ($men->curLayout != $pref['sitetheme_deflayout']) ? $men->curLayout : "";
if($areas = $men->menuSetPreset())
{
$message = '';
2009-10-28 23:45:46 +00:00
foreach ($areas as $val)
{
2009-10-28 23:45:46 +00:00
$ar[$val['menu_location']][] = $val['menu_name'];
}
2009-10-28 23:45:46 +00:00
foreach ($ar as $k=>$v)
{
2009-10-28 23:45:46 +00:00
$message .= MENLAN_14." ".$k." : ".implode(", ", $v)."<br />";
}
2012-11-28 02:22:23 -08:00
$mes->add(MENLAN_43." : ".$key."<br />".$message, E_MESSAGE_SUCCESS);
}
}
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
function getThemes($mode = FALSE)
2006-12-02 04:36:16 +00:00
{
$themeArray = array();
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
$tloop = 1;
$fl = e107::getFile();
$array = $fl->get_dirs(e_THEME);
2009-10-28 23:45:46 +00:00
foreach($array as $file)
{
2009-09-17 00:13:40 +00:00
if(($mode == 'xml') && !is_readable(e_THEME.$file."/theme.xml"))
{
continue;
}
2009-10-28 23:45:46 +00:00
if($file != "." && $file != ".." && $file != "CVS" && $file != "templates" && is_dir(e_THEME.$file) && is_readable(e_THEME.$file."/theme.php"))
{
if($mode == "id")
{
$themeArray[$tloop] = $file;
2006-12-02 04:36:16 +00:00
}
else
{
$themeArray[$file] = $this->getThemeInfo($file);
$themeArray[$file]['id'] = $tloop;
2006-12-02 04:36:16 +00:00
}
$tloop++;
2009-10-28 23:45:46 +00:00
}
}
// echo "<pre>";
// print_r($themeArray);
// echo "</pre>";
2009-10-28 23:45:46 +00:00
return $themeArray;
}
2009-10-28 23:45:46 +00:00
function getThemeInfo($file)
{
2017-01-10 17:57:04 -08:00
// return e_theme::getThemeInfo($file);
$mes = e107::getMessage();
$reject = array('e_.*');
$handle2 = e107::getFile()->get_files(e_THEME.$file."/", "\.php|\.css|\.xml|preview\.jpg|preview\.png", $reject, 1);
2009-10-28 23:45:46 +00:00
foreach ($handle2 as $fln)
{
$file2 = str_replace(e_THEME.$file."/", "", $fln['path']).$fln['fname'];
$themeArray[$file]['files'][] = $file2;
2009-10-28 23:45:46 +00:00
if(strstr($file2, "preview."))
{
$themeArray[$file]['preview'] = e_THEME.$file."/".$file2;
}
// ---------------- get information string for css file - Legacy mode (no theme.xml)
if(strstr($file2, ".css") && !strstr($file2, "menu.css") && strpos($file2, "e_") !== 0)
2009-10-28 23:45:46 +00:00
{
if($cssContents = file_get_contents(e_THEME.$file."/".$file2))
2009-10-28 23:45:46 +00:00
{
$nonadmin = preg_match('/\* Non-Admin(.*?)\*\//', $cssContents) ? true : false;
preg_match('/\* info:(.*?)\*\//', $cssContents, $match);
$match[1] = varset($match[1], '');
$scope = ($nonadmin == true) ? 'front' : '';
$themeArray[$file]['css'][] = array("name"=>$file2, "info"=>$match[1], "scope"=>$scope, "nonadmin"=>$nonadmin);
2009-10-28 23:45:46 +00:00
}
else
{
// $mes->addDebug("Couldn't read file: ".e_THEME.$file."/".$file2);
}
2009-10-28 23:45:46 +00:00
}
2009-10-28 23:52:56 +00:00
2009-10-28 23:45:46 +00:00
} // end while..
// Load Theme information and merge with existing array. theme.xml (v2.x theme) is given priority over theme.php (v1.x).
2009-10-28 23:45:46 +00:00
if(in_array("theme.xml", $themeArray[$file]['files']))
{
$themeArray[$file] = array_merge($themeArray[$file], $this->parse_theme_xml($file));
}
elseif(in_array("theme.php", $themeArray[$file]['files']))
{
$themeArray[$file] = array_merge($themeArray[$file], $this->parse_theme_php($file));
}
if(!empty($themeArray[$file]['css']) && count($themeArray[$file]['css']) > 1)
{
2017-01-31 16:39:00 -08:00
$themeArray[$file]['multipleStylesheets'] = true;
}
2009-10-28 23:45:46 +00:00
return $themeArray[$file];
2009-10-28 23:52:56 +00:00
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
2009-09-02 02:38:50 +00:00
/**
2009-11-17 14:50:37 +00:00
* Validate and return the name of the categories.
*
* @param string [optional] $categoryfromXML
* @return string
2009-09-02 02:38:50 +00:00
*/
2009-10-28 23:45:46 +00:00
function getThemeCategory($categoryfromXML = '')
2009-09-02 02:38:50 +00:00
{
2009-09-17 00:13:40 +00:00
if(!$categoryfromXML)
{
2009-10-28 23:45:46 +00:00
return 'generic';
2009-09-17 00:13:40 +00:00
}
2009-10-28 23:45:46 +00:00
$tmp = explode(",", $categoryfromXML);
2009-09-02 02:38:50 +00:00
$category = array();
2009-10-28 23:45:46 +00:00
foreach ($tmp as $cat)
2009-09-02 02:38:50 +00:00
{
$cat = trim($cat);
2009-10-28 23:45:46 +00:00
if(in_array($cat, $this->allowedCategories))
2009-09-02 02:38:50 +00:00
{
$category[] = $cat;
}
else
{
2009-10-28 23:45:46 +00:00
$category[] = 'generic';
2009-09-02 02:38:50 +00:00
}
}
2009-10-28 23:45:46 +00:00
return implode(', ', $category);
2009-10-28 23:52:56 +00:00
2009-09-02 02:38:50 +00:00
}
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
function themeUpload()
{
2009-10-28 23:45:46 +00:00
if(!$_POST['ac'] == md5(ADMINPWCHANGE))
{
2006-12-02 04:36:16 +00:00
exit;
}
2012-11-28 02:22:23 -08:00
$mes = e107::getMessage();
$ns = e107::getRender();
// extract($_FILES);
//print_a($_FILES);
if(!is_writable(e_TEMP))
{
$mes->addInfo(TPVLAN_20);
return FALSE;
}
$fl = e107::getFile();
$mp = $this->getMarketplace();
$status = $fl->getUploaded(e_TEMP);
if(!empty($status[0]['error']))
{
$mes->addError($status[0]['message']);
return;
}
$mes->addSuccess($status[0]['message']);
return $fl->unzipArchive($status[0]['name'],'theme');
// else
/*
{
// FIXME - temporary fixes to upload process, check required.
2013-06-15 15:08:03 +02:00
// Probably in need of a rewrite to use process_uploaded_files();
2009-10-28 23:45:46 +00:00
require_once (e_HANDLER."upload_handler.php");
$fileName = $_FILES['file_userfile']['name'][0];
$fileSize = $_FILES['file_userfile']['size'][0];
$fileType = $_FILES['file_userfile']['type'][0]; // type is returned as mime type (application/octet-stream) not as zip/rar
// There may be a better way to do this.. MIME may not be secure enough
2013-06-15 15:08:03 +02:00
// process_uploaded_files() ?
$mime_zip = array("application/octet-stream", "application/zip", "multipart/x-zip");
$mime_gzip = array("application/x-gzip", "multipart/x-gzip");
// rar?
2009-10-28 23:45:46 +00:00
if(in_array($fileType, $mime_zip))
2009-10-28 23:45:46 +00:00
{
$fileType = "zip";
2009-10-28 23:45:46 +00:00
}
elseif(in_array($fileType, $mime_gzip))
2009-10-28 23:45:46 +00:00
{
$fileType = "gzip";
2009-10-28 23:45:46 +00:00
}
else
{
$mes->addError(TPVLAN_17);
return FALSE;
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
if($fileSize)
{
2009-10-28 23:52:56 +00:00
$uploaded = file_upload(e_THEME);
2006-12-02 04:36:16 +00:00
$archiveName = $uploaded[0]['name'];
2009-10-28 23:45:46 +00:00
if($fileType == "zip")
{
require_once (e_HANDLER."pclzip.lib.php");
2006-12-02 04:36:16 +00:00
$archive = new PclZip(e_THEME.$archiveName);
$unarc = ($fileList = $archive->extract(PCLZIP_OPT_PATH, e_THEME, PCLZIP_OPT_SET_CHMOD, 0666)); // FIXME - detect folder structure similar to 'Find themes'
2009-10-28 23:45:46 +00:00
}
else
{
require_once (e_HANDLER."pcltar.lib.php");
$unarc = ($fileList = PclTarExtract($archiveName, e_THEME)); // FIXME - detect folder structure similar to 'Find themes'
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
if(!$unarc)
{
if($fileType == "zip")
{
2009-10-28 23:45:46 +00:00
$error = TPVLAN_46." '".$archive->errorName(TRUE)."'";
}
else
{
$error = TPVLAN_47.PclErrorString().", ".TPVLAN_48.intval(PclErrorCode());
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
$mes->addError(TPVLAN_18." ".$archiveName." ".$error);
return FALSE;
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
$folderName = substr($fileList[0]['stored_filename'], 0, (strpos($fileList[0]['stored_filename'], "/")));
$mes->addSuccess(TPVLAN_19);
2009-10-28 23:45:46 +00:00
if(varset($_POST['setUploadTheme']))
{
$themeArray = $this->getThemes();
$this->id = $themeArray[$folderName]['id'];
if($this->setTheme())
{
$mes->addSuccess(TPVLAN_3);
}
else
{
$mes->addError("Could not change site theme."); // TODO LAN
}
2009-10-28 23:52:56 +00:00
}
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
@unlink(e_THEME.$archiveName);
}
}
*
*/
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
2013-05-07 03:47:32 -07:00
private function search($name, $searchVal, $submitName, $filterName='', $filterArray=false, $filterVal=false)
{
$frm = e107::getForm();
return $frm->search($name, $searchVal, $submitName, $filterName, $filterArray, $filterVal);
2019-01-31 14:35:57 -08:00
/*
2013-05-07 03:47:32 -07:00
$text = '<span class="input-append e-search"><i class="icon-search"></i>
'.$frm->text($name, $searchVal,20,'class=search-query').'
<button class="btn btn-primary" name="'.$submitName.'" type="submit">'.LAN_GO.'</button>
</span>';
// $text .= $this->admin_button($submitName,LAN_SEARCH,'search');
return $text;
2019-01-31 14:35:57 -08:00
*/
2013-05-07 03:47:32 -07:00
}
/**
* Temporary, e107::getMarketplace() coming soon
* @return e_marketplace
*/
public function getMarketplace()
{
if(null === $this->mp)
{
require_once(e_HANDLER.'e_marketplace.php');
$this->mp = new e_marketplace(); // autodetect the best method
}
return $this->mp;
}
2013-05-07 03:47:32 -07:00
function renderOnline($ajax=false)
{
global $e107SiteUsername, $e107SiteUserpass;
$xml = e107::getXml();
$mes = e107::getMessage();
$frm = e107::getForm();
$ns = e107::getRender();
$mp = $this->getMarketplace();
$from = intval(varset($_GET['frm']));
$limit = 96; // FIXME - ajax pages load
2013-05-06 21:28:05 -07:00
$srch = preg_replace('/[^\w]/','', vartrue($_GET['srch']));
2013-03-04 00:47:56 -08:00
// check for cURL
if(!function_exists('curl_init'))
{
$mes->addWarning(TPVLAN_79);
}
// auth
$mp->generateAuthKey($e107SiteUsername, $e107SiteUserpass);
// do the request, retrieve and parse data
$xdata = $mp->call('getList', array(
'type' => 'theme',
'params' => array('limit' => $limit, 'search' => $srch, 'from' => $from)
));
$total = $xdata['params']['count'];
// OLD BIT OF CODE ------------------------------->
/*$file = "http://e107.org/feed?type=theme&frm=".$from."&srch=".$srch."&limit=".$limit;
$mes->addDebug("File = ".$file);
2013-01-30 16:51:06 -08:00
$xml->setOptArrayTags('theme,screenshots/image'); // make sure 'theme' tag always returns an array
// $xdata = $xml->loadXMLfile($file,'advanced',true);
$xdata = $xml->loadXMLfile($file,true,false);
$total = $xdata['@attributes']['total'];*/
// OLD BIT OF CODE ------------------------------->
2013-03-04 00:47:56 -08:00
$amount =$limit;
/*
if($total > $amount)
{
//$parms = $total.",".$amount.",".$from.",".e_SELF.'?mode='.$_GET['mode'].'&amp;frm=[FROM]';
$url = rawurlencode(e_SELF.'?mode='.$_GET['mode'].'&frm=[FROM]');
$parms = "total=".$total."&amount=".$amount."&current=".$from."&url=".$url."&caption=off&tmpl=basic&navcount=4&glyphs=1";
$text .= "<div class='span5' style='margin-left: 100px;margin-top:10px'>".$tp->parseTemplate("{NEXTPREV=$parms}",TRUE)."</div>";
}
*/
// print_a($xdata);
$c = 1;
2017-11-20 14:45:37 -08:00
$filterName = '';
$filterArray = array();
$filterVal = '';
2013-03-04 00:47:56 -08:00
2013-05-07 03:47:32 -07:00
$text = "<form class='form-search' action='".e_SELF."?".e_QUERY."' id='core-plugin-list-form' method='get'>";
$text .= '<div id="myCarousel" class="carousel slide" data-interval="false">';
$text .= "<div class='form-inline clearfix row-fluid'>";
$text .= $this->search('srch', $srch, 'go', $filterName, $filterArray, $filterVal).$frm->hidden('mode','online');
$text .= '<div class="btn-group" style="margin-left:10px"><a class="btn btn-primary" href="#myCarousel" data-slide="prev">&lsaquo;</a><a class="btn btn-primary" href="#myCarousel" data-slide="next">&rsaquo;</a></div>';
$text .= "{CAROUSEL_INDICATORS}";
$text .= "</div>";
$text .= '<div id="shop" style="margin-top:10px;min-height:585px" class=" carousel-inner">';
if(is_array($xdata['data'] ))
{
2013-05-07 03:47:32 -07:00
$text .= '<div class="active item">';
$slides = array();
foreach($xdata['data'] as $r)
{
if(E107_DBG_PATH)
{
$mes->addDebug(print_a($r,true));
}
$theme = array(
'id' => $r['params']['id'],
'type' => 'theme',
'mode' => $r['params']['mode'],
'name' => stripslashes($r['name']),
'category' => $r['category'],
2013-05-18 12:07:59 +03:00
'preview' => varset($r['screenshots']['image']),
'date' => $r['date'],
'version' => $r['version'],
'thumbnail' => $r['thumbnail'],
'url' => $r['urlView'],
'author' => $r['author'],
'website' => $r['authorUrl'],
'compatibility' => $r['compatibility'],
'description' => $r['description'],
'price' => $r['price'],
'livedemo' => $r['livedemo'],
);
$text .= $this->renderTheme(FALSE, $theme);
$c++;
if($c == 19)
{
$text .= '</div><div class="item">';
$slides[] = 1;
$c = 1;
}
/*
[author] => e107 Inc
[summary] => Bootstrap e107 admin theme
[category] => generic
[keywords] => Array
(
[word] => Array
(
[0] => bootstrap
[1] => clean
)
)
[name] => bootstrap
[version] => 1.0
[date] => 2012-12-01
[compatibility] => 2.0
[releaseUrl] =>
[email] => e107inc@something.com
[website] => http://e107.org
[info] => Bootstrap e107 admin theme
[compliance] => Array
(
[@attributes] => Array
(
[xhtml] =>
[css] =>
)
)
[xhtmlcompliant] =>
[csscompliant] =>
[path] => bootstrap
*/
}
$text .= "<div class='clear'>&nbsp;</div>";
$text .= "</div>";
$text .= "</div>";
}
else
{
$mes->addInfo(TPVLAN_80);
}
2015-07-14 12:13:46 -07:00
$indicators = '<ol class="carousel-indicators col-md-6 span6">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>';
foreach($slides as $key=>$v)
{
$id = $key + 1;
$indicators .= '<li data-target="#myCarousel" data-slide-to="'.$id.'"></li>';
}
$indicators .= '</ol>';
$text = str_replace("{CAROUSEL_INDICATORS}",$indicators,$text);
$text .= "</form>";
$ns->tablerender(TPVLAN_26.SEP.TPVLAN_69, $mes->render().$text);
}
function showThemes($mode = 'main')
{
global $pref;
$mes = e107::getMessage();
$ns = e107::getRender();
$tp = e107::getParser();
$frm = e107::getForm();
2013-05-06 21:28:05 -07:00
echo "<div>";
if($mode == "main" || !$mode) // Show Main Configuration
{
foreach ($this->themeArray as $key=>$theme)
{
if($key == $pref['sitetheme'])
{
$text = $this->renderTheme(1, $theme);
}
}
echo "<form enctype='multipart/form-data' method='post' action='".e_SELF."?mode=".$mode."'>\n";
$ns->tablerender(TPVLAN_26.SEP.TPVLAN_33, $mes->render().$text);
echo "</form>";
}
// Show Admin Configuration
if($mode == "admin")
{
foreach ($this->themeArray as $key=>$theme)
{
if($key == $pref['admintheme'])
{
$text = $this->renderTheme(2, $theme);
}
}
echo "<form enctype='multipart/form-data' method='post' action='".e_SELF."?mode=".$mode."'>\n";
$ns->tablerender(TPVLAN_26.SEP.TPVLAN_34, $mes->render().$text);
echo "</form>";
}
// Show Upload Form
if($mode == "upload")
{
$this->renderUploadForm();
}
// Show All Themes
if($mode == "choose")
{
$text = "";
foreach ($this->themeArray as $key=>$theme)
{
$text .= $this->renderTheme(FALSE, $theme);
// print_a($theme);
}
$text .= "<div class='clear'>&nbsp;</div>";
echo "<form enctype='multipart/form-data' method='post' action='".e_SELF."?mode=".$mode."'>\n";
$ns->tablerender(TPVLAN_26.SEP.TPVLAN_39, $mes->render().$text);
$text .= "</form>";
}
2012-11-28 04:32:05 -08:00
if($mode == "online")
{
$this->renderOnline();
}
echo "</div>\n";
2009-07-10 14:25:23 +00:00
}
2012-11-28 04:32:05 -08:00
2009-10-28 23:45:46 +00:00
function renderUploadForm()
2009-07-10 14:25:23 +00:00
{
2012-11-28 02:22:23 -08:00
$mes = e107::getMessage();
$ns = e107::getRender();
$sql = e107::getDb();
$frm = e107::getForm();
2009-10-28 23:45:46 +00:00
if(!is_writable(e_THEME))
{
$ns->tablerender(TPVLAN_16, TPVLAN_15);
$text = "";
}
else
{
require_once(e_HANDLER.'upload_handler.php');
2009-10-28 23:45:46 +00:00
$max_file_size = get_user_max_upload();
$text = "
<form enctype='multipart/form-data' action='".e_SELF."' method='post'>
2012-11-26 03:23:20 -08:00
<table class='table adminform'>
<colgroup>
2009-07-10 14:25:23 +00:00
<col class='col-label' />
<col class='col-control' />
</colgroup>
2009-07-06 05:59:42 +00:00
<tr>
<td>".TPVLAN_13."</td>
<td>
<input type='hidden' name='MAX_FILE_SIZE' value='{$max_file_size}' />
<input type='hidden' name='ac' value='".md5(ADMINPWCHANGE)."' />
<input class='tbox' type='file' name='file_userfile[]' size='50' />
</td>
</tr>
<tr>
<td>".TPVLAN_10."</td>
<td><input type='checkbox' name='setUploadTheme' value='1' /></td>
2009-07-06 05:59:42 +00:00
</tr>
</table>
2009-10-28 23:45:46 +00:00
<div class='buttons-bar center'>".$frm->admin_button('upload', 1, 'submit', LAN_UPLOAD)."</div>
</form>
";
2009-10-28 23:45:46 +00:00
}
$ns->tablerender(TPVLAN_26.SEP.TPVLAN_38, $mes->render().$text);
2009-07-10 14:25:23 +00:00
}
2009-10-28 23:45:46 +00:00
function renderThemeInfo($theme)
2006-12-02 04:36:16 +00:00
{
if(empty($theme))
{
return null;
}
if(!empty($theme['compatibility']) && $theme['compatibility'] == 2)
{
$theme['compatibility'] = '2.0';
}
2009-10-28 23:45:46 +00:00
global $pref;
$author = !empty($theme['email']) ? "<a href='mailto:".$theme['email']."' title='".$theme['email']."'>".$theme['author']."</a>" : $theme['author'];
$website = !empty($theme['website']) ? "<a href='".$theme['website']."' rel='external'>".$theme['website']."</a>" : "";
// $preview = "<a href='".SITEURL."news.php?themepreview.".$theme['id']."' title='".TPVLAN_9."' >".($theme['preview'] ? "<img src='".$theme['preview']."' style='border: 1px solid #000;width:200px' alt='' />" : "<img src='".e_IMAGE_ABS."admin_images/nopreview.png' title='".TPVLAN_12."' alt='' />")."</a>";
$description = vartrue($theme['description'],'');
$compat = (version_compare(1.9,$theme['compatibility'],'<')) ? "<span class='label label-warning'>".$theme['compatibility']."</span><span class='text-warning'> ".TPVLAN_77."</span>": vartrue($theme['compatibility'],'1.0');
$price = (!empty($theme['price'])) ? "<span class='label label-primary'><i class='icon-shopping-cart icon-white'></i> ".$theme['price']."</span>" : "<span class='label label-success'>".TPVLAN_76."</span>";
$text = e107::getForm()->open('theme-info','post');
$text .= "<table class='table table-striped'>";
// $text .= "<tr><th colspan='2'><h3>".$theme['name']." ".$theme['version']."</h3></th></tr>";
$text .= "<tr><td style='vertical-align:top; width:24%'><b>".TPVLAN_75."</b>:</td><td style='vertical-align:top'>".$price."</td></tr>";
2013-03-03 17:50:30 -08:00
$text .= ($author) ? "<tr><td style='vertical-align:top; width:24%'><b>".LAN_AUTHOR."</b>:</td><td style='vertical-align:top'>".$author."</td></tr>" : "";
$text .= ($website) ? "<tr><td style='vertical-align:top; width:24%'><b>".TPVLAN_5."</b>:</td><td style='vertical-align:top'>".$website."</td></tr>" : "";
$text .= !empty($theme['date']) ? "<tr><td style='vertical-align:top; width:24%'><b>".TPVLAN_6."</b>:</td><td style='vertical-align:top'>".$theme['date']."</td></tr>" : "";
2013-03-03 17:50:30 -08:00
$text .= $compat ? "<tr><td style='vertical-align:top; width:24%'><b>".TPVLAN_57."</b>:</td><td style='vertical-align:top'>".$compat."</td></tr>" : "";
$text .= !empty($description) ? "<tr><td style='vertical-align:top; width:24%'><b>".LAN_DESCRIPTION."</b>:</td><td style='vertical-align:top'>".$description."</td></tr>" : "";
// $text .= "<tr><td style='vertical-align:top; width:24%'><b>".TPVLAN_49."</b>:</td>
// <td style='vertical-align:top'>XHTML ";
// $text .= ($theme['xhtmlcompliant']) ? ADMIN_TRUE_ICON : ADMIN_FALSE_ICON;
// $text .= " &nbsp;&nbsp; CSS ";
// $text .= ($theme['csscompliant']) ? ADMIN_TRUE_ICON : ADMIN_FALSE_ICON;
// $text .= "</td></tr>";
if(!empty($theme['category']))
{
$text .= "<tr><td><b>".LAN_CATEGORY."</b></td><td>".$theme['category']."</td></tr>";
}
if(is_dir(e_THEME.$theme['path']."/.git"))
{
$text .= "<tr><td><b>Developer</b></td>
<td >".$this->frm->admin_button('git_pull', $theme['path'], 'primary', e107::getParser()->toGlyph('fa-refresh'). "Git Sync")."</td></tr>";
}
$itext = '';
if(!empty($theme['layouts']))
{
2009-10-28 23:45:46 +00:00
$itext .= "<tr>
<td style='vertical-align:top; width:24%'><b>".TPVLAN_50."</b>:</td>
2013-03-15 23:35:16 -07:00
<td class='well' style='vertical-align:top'>
2015-02-06 01:03:09 -08:00
<table class='table table-striped table-bordered' style='margin-left:0px;margin-right:auto' >
<tr>";
// $itext .= ($mode == 1) ? "<td class='fcaption' style='text-align:center;vertical-align:top;'>".TPVLAN_55."</td>" : "";
2009-10-28 23:45:46 +00:00
$itext .= "
2016-11-02 17:46:24 +01:00
<th class='fcaption'>".LAN_TITLE."</th>
<th class='fcaption'>".TPVLAN_78."</th>
<th class='fcaption' style='text-align:center;width:100px'>".TPVLAN_54."</th>
</tr>\n";
2009-10-28 23:52:56 +00:00
2009-10-28 23:45:46 +00:00
foreach ($theme['layouts'] as $key=>$val)
{
$itext .= "
<tr>";
/* if($mode == 1)
{
if(!$pref['sitetheme_deflayout'])
{
2009-10-28 23:45:46 +00:00
$pref['sitetheme_deflayout'] = ($val['@attributes']['default'] == 'true') ? $key : "";
// echo "------------- NODEFAULT";
}
$itext .= "
<td style='vertical-align:top width:auto;text-align:center'>
2009-10-28 23:45:46 +00:00
<input type='radio' name='layout_default' value='{$key}' ".($pref['sitetheme_deflayout'] == $key ? " checked='checked'" : "")." />
</td>";
}*/
2009-10-28 23:45:46 +00:00
$itext .= "<td style='vertical-align:top'>";
$itext .= !empty($val['@attributes']['previewFull']) ? "<a href='".e_THEME_ABS.$theme['path']."/".$val['@attributes']['previewFull']."' >" : "";
$itext .= $val['@attributes']['title'];
$itext .= !empty($val['@attributes']['previewFull']) ? "</a>" : "";
2009-10-28 23:45:46 +00:00
$itext .= ($pref['sitetheme_deflayout'] == $key) ? " (default)" : "";
$itext .= "</td>
<td style='vertical-align:top'>".varset($val['@attributes']['plugins'])."&nbsp;</td>
<td style='vertical-align:top;text-align:center'>";
$itext .= !empty($val['menuPresets']) ? ADMIN_TRUE_ICON : "&nbsp;";
2009-10-28 23:45:46 +00:00
$itext .= "</td>
</tr>";
}
2009-10-28 23:45:46 +00:00
$itext .= "</table></td></tr>";
}
2009-10-28 23:45:46 +00:00
// $text .= "<tr><td><b>".TPVLAN_22.": </b></td><td colspan='2'>";
// foreach ($theme['css'] as $val)
// {
// $text .= $val['name']."<br />";
// }
// $text .= "</td></tr>";
2009-10-28 23:45:46 +00:00
$text .= $itext."</table>";
$text .= e107::getForm()->close();
if(count($theme['preview']))
{
$text .= "<div class='clearfix'>";
foreach($theme['preview'] as $pic)
{
$picFull = (substr($pic,0,4) == 'http') ? $pic : e_THEME.$theme['path']."/".$pic;
$text .= "<div class='col-md-6'>
2017-01-20 10:40:05 -08:00
<img class='img-responsive img-fluid' src='".$picFull."' alt=\"".$theme['name']."\" />
</div>";
}
$text .= "</div>";
// $text .= "</td>
// </tr>";
}
2012-11-28 04:32:05 -08:00
// $text .= "<div class='right'><a href='#themeInfo_".$theme['id']."' class='e-expandit'>Close</a></div>";
if(E107_DEBUG_LEVEL > 0)
{
// $text .= print_a($theme, true);
}
2009-10-28 23:45:46 +00:00
return $text;
2009-07-06 05:59:42 +00:00
}
2009-10-28 23:45:46 +00:00
function loadThemeConfig()
{
2012-11-29 22:03:36 -08:00
$mes = e107::getMessage();
2009-10-28 23:45:46 +00:00
$newConfile = e_THEME.$this->id."/theme_config.php";
$legacyConfile = e_THEME.$this->id."/".$this->id."_config.php"; // @Deprecated
if(is_readable($newConfile))
{
$confile = $newConfile;
}
elseif(is_readable($legacyConfile))// TODO Eventually remove it.
{
// NOTE: this is debug info.. do not translate.
e107::getMessage()->addDebug("Deprecated Theme Config File found! Rename <b>".$this->id."_config.php.</b> to <b>theme_config.php</b> to correct this issue. .");
$confile = $legacyConfile;
}
else
{
return;
}
if(($this->themeConfigObj === null) )
{
e107::getDebug()->log("Loading : ".$confile);
2009-10-28 23:45:46 +00:00
include ($confile);
2017-01-01 16:54:57 -08:00
$className = 'theme_'.$this->id;
if(class_exists('theme_config')) // new v2.1.4 theme_config is the class name.
{
$this->themeConfigObj = new theme_config();
if(class_exists('theme_config_form')) // new v2.1.7
{
$this->themeConfigFormObj = new theme_config_form();
}
2017-01-01 16:54:57 -08:00
}
elseif(class_exists($className)) // old way.
2009-08-17 11:25:01 +00:00
{
$this->themeConfigObj = new $className();
}
else
{
2017-01-01 16:54:57 -08:00
$this->themeConfigObj = false;
2009-08-17 11:25:01 +00:00
}
2009-10-28 23:45:46 +00:00
}
2009-10-28 23:52:56 +00:00
}
2009-10-28 23:45:46 +00:00
2009-10-28 23:52:56 +00:00
// TODO process custom theme configuration - .
function renderThemeConfig()
2009-07-06 05:59:42 +00:00
{
2012-11-29 22:03:36 -08:00
$mes = e107::getMessage();
$frm = ($this->themeConfigFormObj !== null) ? $this->themeConfigFormObj : e107::getForm();
$pref = e107::getConfig()->getPref();
e107::getDebug()->log("Rendering Theme Config");
2009-10-28 23:45:46 +00:00
$this->loadThemeConfig();
2017-01-03 07:48:52 -08:00
$value = e107::getThemeConfig($this->id)->getPref();
if(empty($value) && !empty($pref['sitetheme_pref']))
{
$value = $pref['sitetheme_pref'];
}
2009-10-28 23:45:46 +00:00
if($this->themeConfigObj)
{
$var = call_user_func(array(&$this->themeConfigObj, 'config'));
$text = ''; // avoid notice
foreach ($var as $field=>$val)
{
if(is_numeric($field))
{
$text .= "<tr><td><b>".$val['caption']."</b>:</td><td colspan='2'>".$val['html']."<div class='field-help'>".$val['help']."</div></td></tr>";
}
else
{
2017-01-03 07:48:52 -08:00
if(!empty($val['multilan']) && isset($value[$field][e_LANGUAGE]))
{
$value[$field] = varset($value[$field][e_LANGUAGE],'');
}
$tdClass = !empty($val['writeParms']['post']) ? 'form-inline' : '';
2019-05-27 10:45:35 -07:00
$text .= "<tr><td><b>".$val['title']."</b>:</td><td class='".$tdClass."' colspan='2'>".$frm->renderElement($field, $value[$field], $val)."<div class='field-help'>".varset($val['help'])."</div></td></tr>";
}
}
2009-10-28 23:45:46 +00:00
return $text;
}
2009-10-28 23:52:56 +00:00
}
2009-10-28 23:45:46 +00:00
function renderThemeHelp()
{
2009-08-17 11:25:01 +00:00
if($this->themeConfigObj)
2009-10-28 23:45:46 +00:00
{
return call_user_func(array(&$this->themeConfigObj, 'help'));
}
2009-07-06 05:59:42 +00:00
}
2009-10-28 23:45:46 +00:00
2009-07-06 05:59:42 +00:00
function setThemeConfig()
{
2009-10-28 23:45:46 +00:00
$this->loadThemeConfig();
2017-01-01 16:54:57 -08:00
2009-10-28 23:45:46 +00:00
if($this->themeConfigObj)
{
2017-01-01 16:54:57 -08:00
$name = get_class($this->themeConfigObj);
if($name === 'theme_config') // v2.1.4 - don't use process() method.
{
$pref = e107::getThemeConfig();
$theme_pref = array();
$fields = call_user_func(array(&$this->themeConfigObj, 'config'));
foreach($fields as $field=>$data)
{
$theme_pref[$field] = $_POST[$field];
}
if($pref->setPref($theme_pref)->save(true,true,false))
{
$siteThemePref = e107::getConfig()->get('sitetheme_pref');
if(!empty($siteThemePref))
{
e107::getConfig()->set('sitetheme_pref',null)->save(false,true,false); // remove old theme pref
}
}
// if($pref->dataHasChanged())
{
e107::getCache()->clearAll('library'); // Need to clear cache in order to refresh library information.
}
return true;
2017-01-01 16:54:57 -08:00
}
e107::getCache()->clearAll('library');
2017-01-01 16:54:57 -08:00
return call_user_func(array(&$this->themeConfigObj, 'process')); //pre v2.1.4
2009-08-17 11:25:01 +00:00
}
2009-07-06 05:59:42 +00:00
}
2009-10-28 23:45:46 +00:00
2013-01-30 16:51:06 -08:00
/**
mode = 0 :: normal
mode = 1 :: selected site theme
mode = 2 :: selected admin theme
*/
function renderTheme($mode = 0, $theme)
2009-07-06 05:59:42 +00:00
{
$ns = e107::getRender();
$pref = e107::getPref();
$frm = e107::getForm();
2014-01-22 06:10:44 -08:00
$tp = e107::getParser();
2019-05-27 10:45:35 -07:00
2009-10-28 23:45:46 +00:00
2013-01-30 16:51:06 -08:00
$author = ($theme['email'] ? "<a href='mailto:".$theme['email']."' title='".$theme['email']."'>".$theme['author']."</a>" : $theme['author']);
$website = ($theme['website'] ? "<a href='".$theme['website']."' rel='external'>".$theme['website']."</a>" : "");
// $preview = "<a href='".e_BASE."news.php?themepreview.".$theme['id']."' title='".TPVLAN_9."' >".($theme['preview'] ? "<img src='".$theme['preview']."' style='border: 1px solid #000;width:200px' alt='' />" : "<img src='".e_IMAGE_ABS."admin_images/nopreview.png' title='".TPVLAN_12."' alt='' />")."</a>";
$main_icon = ($pref['sitetheme'] != $theme['path']) ? "<button class='btn btn-default btn-secondary btn-small btn-sm btn-inverse' type='submit' name='selectmain[".$theme['id']."]' alt=\"".TPVLAN_10."\" title=\"".TPVLAN_10."\" >".$tp->toGlyph('fa-home',array('size'=>'2x'))."</button>" : "<button class='btn btn-small btn-default btn-secondary btn-sm btn-inverse' type='button'>".$tp->toGlyph('fa-check',array('size'=>'2x'))."</button>";
2013-01-30 16:51:06 -08:00
// $info_icon = "<a data-toggle='modal' data-target='".e_SELF."' href='#themeInfo_".$theme['id']."' class='e-tip' title='".TPVLAN_7."'><img src='".e_IMAGE_ABS."admin_images/info_32.png' alt='' class='icon S32' /></a>";
2019-05-27 10:45:35 -07:00
$info_icon = "<a class='btn btn-default btn-secondary btn-small btn-sm btn-inverse e-modal' data-modal-caption=\"".$theme['name']." ".$theme['version']."\" href='".e_SELF."?mode=".varset($_GET['mode'])."&id=".$theme['path']."&action=info' title='".TPVLAN_7."'>".$tp->toGlyph('fa-info-circle',array('size'=>'2x'))."</a>";
// $preview_icon = "<a title='Preview : ".$theme['name']."' rel='external' class='e-dialog' href='".e_BASE."index.php?themepreview.".$theme['id']."'>".E_32_SEARCH."</a>";
$admin_icon = ($pref['admintheme'] != $theme['path'] ) ? "<button class='btn btn-default btn-secondary btn-small btn-sm btn-inverse' type='submit' name='selectadmin[".$theme['id']."]' alt=\"".TPVLAN_32."\" title=\"".TPVLAN_32."\" >".$tp->toGlyph('fa-gears',array('size'=>'2x'))."</button>" : "<button class='btn btn-small btn-default btn-secondary btn-sm btn-inverse' type='button'>".$tp->toGlyph('fa-check',array('size'=>'2x'))."</button>";
$price = '';
if(substr($theme['thumbnail'],0,4) == 'http')
{
$thumbPath = $theme['thumbnail'];
$previewPath = $theme['preview'][0];
}
elseif(!empty($theme['thumbnail']))
{
$thumbPath = e_THEME.$theme['path'] ."/".$theme['thumbnail'];
$previewPath = e_THEME.$theme['path'] ."/".$theme['thumbnail'];
2017-02-01 14:14:02 -08:00
$class = 'admin-theme-preview';
}
else
{
$thumbPath = e_IMAGE_ABS."admin_images/nopreview.png";
$previewPath = e_BASE."index.php?themepreview.".$theme['id'];
2017-02-01 14:14:02 -08:00
$class = 'admin-theme-nopreview';
}
2012-11-28 04:32:05 -08:00
2017-02-01 14:14:02 -08:00
$thumbnail = "<img class='".$class."' src='".$thumbPath."' style='max-width:100%' alt='' />";
if($_GET['mode'] == 'online')
{
$srcData = array(
'id' => $theme['id'],
'url' => $theme['url'],
'mode' => $theme['mode'],
'price' => $theme['price']
);
e107::getSession()->set('thememanager/online/'.$theme['id'], $theme);
$d = http_build_query($srcData,false,'&');
$base64 = base64_encode($d);
// e107::getDebug()->log($theme['name'].': '.strlen($base64));
$url = e_SELF."?src=".$base64;
$id = $frm->name2id($theme['name']);
2017-04-14 13:52:19 -07:00
$LAN_DOWNLOAD = ($theme['price'] > 0) ? LAN_PURCHASE."/".LAN_DOWNLOAD : LAN_DOWNLOAD;
/*
2013-05-19 15:02:05 -07:00
if($this->mp->hasAuthKey())
{
$action = 'download';
$caption = "Downloading ".$theme['name']." ".$theme['version'];
}
else
{
$action = 'login';
$caption = "Please login to your e107.org account to proceed..";
}
*/
2013-05-19 15:02:05 -07:00
$downloadUrl = e_SELF.'?mode=download&src='.base64_encode($d);//$url.'&amp;action=download';
$infoUrl = $url.'&amp;action=info';
$viewUrl = $theme['url'];
2013-05-19 17:28:43 +03:00
//$main_icon = "<a data-src='".$downloadUrl."' href='{$downloadUrl}' data-target='{$id}' data-loading='".e_IMAGE."/generic/loading_32.gif' class='-e-ajax' title='".$LAN_DOWNLOAD."' ><img class='top' src='".e_IMAGE_ABS."icons/download_32.png' alt='' /></a> ";
// $main_icon = "<a data-toggle='modal' data-modal-caption=\"".$caption."\" href='{$downloadUrl}' data-cache='false' data-target='#uiModal' title='".$LAN_DOWNLOAD."' >".$tp->toGlyph('download',array('size'=>'2x'))."</a> ";
2017-04-14 13:52:19 -07:00
$modalCaption = (empty($theme['price'])) ? ' '.LAN_DOWNLOADING.' '.$theme['name']." ".$theme['version'] :' '.LAN_PURCHASE.' '.$theme['name']." ".$theme['version'];
$main_icon = "<a class='e-modal btn-default btn-secondary btn btn-sm btn-small btn-inverse' data-modal-caption=\"".$modalCaption."\" rel='external' href='{$downloadUrl}' data-cache='false' title='".$LAN_DOWNLOAD."' >".$tp->toGlyph('fa-download',array('size'=>'2x'))."</a>";
// Temporary Pop-up version.
// $main_icon = "<a class='e-modal btn btn-small btn-inverse' data-modal-caption=\"".$theme['name']." ".$theme['version']."\" rel='external' href='{$viewUrl}' data-cache='false' title='".$LAN_DOWNLOAD."' >".$tp->toGlyph('download',array('size'=>'2x'))."</a> ";
$info_icon = "<a class='btn btn-default btn-secondary btn-sm btn-small btn-inverse e-modal' data-toggle='modal' data-modal-caption=\"".$theme['name']." ".$theme['version']."\" href='".$infoUrl."' data-cache='false' title='".TPVLAN_7."'>".$tp->toGlyph('fa-info-circle',array('size'=>'2x'))."</a>";
if($theme['livedemo'])
{
$previewPath = $theme['livedemo'];
}
$price = (!empty($theme['price'])) ? "<span class='label label-primary pull-right'>".$theme['price']."</span>" : "<span class='label label-success pull-right'>".TPVLAN_76."</span>";
}
$preview_icon = "<a class='e-modal btn btn-default btn-secondary btn-sm btn-small btn-inverse' title=' ".TPVLAN_70." ".$theme['name']."' data-modal-caption=\"".$theme['name']." ".$theme['version']."\" rel='external' href='".$previewPath."'>".$tp->toGlyph('fa-search',array('size'=>'2x'))."</a>";
2012-11-29 22:03:36 -08:00
if(!in_array($theme['path'], $this->approvedAdminThemes))
{
$admin_icon = "";
}
2012-11-28 04:32:05 -08:00
2013-01-30 16:51:06 -08:00
if($theme['name'] == 'bootstrap')
{
2013-01-30 16:51:06 -08:00
// print_a($theme);
}
//
2013-01-30 16:51:06 -08:00
// $thumbPath = (substr($theme['thumbnail'],0,4) == 'http') ? $theme['thumbnail'] : e_THEME.$theme['path'] ."/".$theme['preview'][0];
// $thumbnail = "<a href='".e_BASE."news.php?themepreview.".$theme['id']."' title='".TPVLAN_9."' >";
2013-01-30 16:51:06 -08:00
// $thumbnail .= "</a>";
2009-10-28 23:45:46 +00:00
2009-10-28 23:52:56 +00:00
// Choose a Theme to Install.
if($mode == self::RENDER_THUMBNAIL)
2009-07-06 05:59:42 +00:00
{
// styles NEED to be put into style.css
/*
2012-11-29 22:03:36 -08:00
if($pref['sitetheme'] == $theme['path'])
{
$borderStyle = "admin-theme-cell-site";
}
elseif($pref['admintheme'] == $theme['path'])
{
$borderStyle = "admin-theme-cell-admin";
}
else
{
$borderStyle = "admin-theme-cell-default";
}
*/
2013-03-15 03:54:34 -07:00
$borderStyle = 'well';
2012-11-29 22:03:36 -08:00
$text = "
<div class='f-left block-text admin-theme-cell ".$borderStyle."'>
2013-03-15 23:35:16 -07:00
<div class='well admin-theme-thumb'>".$thumbnail."</div>
<div id='".$frm->name2id($theme['name'])."' class='admin-theme-options'>".$main_icon.$admin_icon.$info_icon.$preview_icon."</div>
<div class='admin-theme-title'><small>".strip_tags($theme['name'])." ".$theme['version']."</small>
".$price."
</div>
2012-11-29 22:03:36 -08:00
</div>";
2009-10-28 23:45:46 +00:00
return $text;
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
$this->id = $theme['path'];
2009-10-28 23:52:56 +00:00
// load customn theme configuration fields.
$this->loadThemeConfig();
$text = '';
// $text .= "<h2 class='caption'>".$theme['name']."</h2>";
$text .= "
<ul class='nav nav-tabs'>
<li class='active'><a data-toggle='tab' href='#core-thememanager-configure'>".LAN_CONFIGURE."</a></li>";
2009-10-28 23:52:56 +00:00
if($this->themeConfigObj && call_user_func(array(&$this->themeConfigObj, 'config')) && $mode == self::RENDER_SITEPREFS)
{
$text .= "<li><a data-toggle='tab' href='#core-thememanager-customconfig'>".LAN_PREFS."</a></li>\n";
}
if($this->themeConfigObj && call_user_func(array(&$this->themeConfigObj, 'help')))
{
$text .= "<li><a data-toggle='tab' href='#core-thememanager-help'>".LAN_HELP."</a></li>\n";
}
2009-10-28 23:45:46 +00:00
2012-11-29 22:03:36 -08:00
$text .= "</ul>
<div class='tab-content'>
<div class='tab-pane active' id='core-thememanager-configure'>
<table class='table adminform'>
<colgroup>
<col class='col-label' />
<col class='col-control' />
<col class='col-control' />
</colgroup>
<tr>
<td><b>".TPVLAN_11."</b></td>
<td>".$theme['version']."</td>
<td class='well center middle' rowspan='9' style='text-align:center; vertical-align:middle;width:25%'>".$thumbnail."</td>
</tr>";
$text .= "<tr><td style='vertical-align:top; width:25%'><b>".LAN_AUTHOR."</b>:</td><td style='vertical-align:top'>".$author."</td></tr>";
$text .= "<tr><td style='vertical-align:top; width:25%'><b>".TPVLAN_5."</b>:</td><td style='vertical-align:top'>".$website."</td></tr>";
$text .= "<tr><td style='vertical-align:top; width:25%'><b>".TPVLAN_6."</b>:</td><td style='vertical-align:top'>".$theme['date']."</td></tr>";
2009-10-28 23:45:46 +00:00
2013-03-03 17:50:30 -08:00
$text .= "<tr><td style='vertical-align:top; width:25%'><b>".TPVLAN_7."</b>:</td><td style='vertical-align:top'>".strip_tags($theme['info'],'b')."</td></tr>";
$text .= "<tr><td style='vertical-align:top; width:25%'><b>".LAN_CATEGORY."</b>:</td><td style='vertical-align:top'>".$theme['category']."</td></tr>";
$text .= "<tr><td style='vertical-align:top; width:25%'><b>".LAN_FOLDER."</b>:</td><td style='vertical-align:top'>".$theme['path']."</td></tr>";
// $text .= "<tr><td style='vertical-align:top; width:25%'><b>Price</b>:</td><td style='vertical-align:top'>".$price."</td></tr>";
$text .= "<tr><td style='vertical-align:top; width:25%'><b>".TPVLAN_49."</b>:</td><td style='vertical-align:top'>";
$text .= ($theme['xhtmlcompliant']) ? "W3C XHTML ".$theme['xhtmlcompliant'] : TPVLAN_71;
$text .= ($theme['csscompliant']) ? " &amp; CSS ".$theme['csscompliant'] : "";
$text .= "</td></tr>";
if(is_dir(e_THEME.$this->id."/.git"))
{
$text .= "<tr><td><b>Developer</b></td>
<td >".$this->frm->admin_button('git_pull', $this->id, 'primary', $tp->toGlyph('fa-refresh'). "Git Sync")."</td></tr>";
}
// site theme..
if($mode == self::RENDER_SITEPREFS)
2009-10-28 23:45:46 +00:00
{
$text .= "
<tr>
<td style='vertical-align:top; width:24%;'><b>".TPVLAN_53."</b></td>
<td style='vertical-align:top width:auto;'>";
if(!empty($theme['plugins']['plugin']))
{
$text .= $this->renderPlugins($theme['plugins']['plugin']);
}
$text .= "&nbsp;</td>
2009-07-06 05:59:42 +00:00
</tr>";
/*$text .= "
<tr>
<td style='vertical-align:top; width:24%;'><b>".TPVLAN_30."</b></td>
<td colspan='2' style='vertical-align:top width:auto;'>
<input type='radio' name='image_preload' value='1'".($pref['image_preload'] ? " checked='checked'" : "")." /> ".TPVLAN_28."&nbsp;&nbsp;
<input type='radio' name='image_preload' value='0'".(!$pref['image_preload'] ? " checked='checked'" : "")." /> ".TPVLAN_29."
</td>
</tr>";*/
$itext = "<tr>
<td style='vertical-align:top; width:24%'><b>".TPVLAN_50."</b>:</td>
<td colspan='2' style='vertical-align:top'>
2015-02-06 01:03:09 -08:00
<table class='table table-bordered table-striped'>
<colgroup>
<col class='col-tm-layout-default' style='width:10%' />
<col class='col-tm-layout-name' style='width:40%' />
<col class='col-tm-layout-visibility' style='width:30%' />
<col class='col-tm-layout-preset' style='width:20%' />
</colgroup>
<tr>";
$itext .= ($mode == self::RENDER_SITEPREFS) ? "<th class='center top'>".TPVLAN_55."</th>" : "";
$itext .= "
<th>".TPVLAN_52."</th>
<th>".TPVLAN_56."&nbsp;<a href='#' class='e-tip' title=\"".TPVLAN_96."\">".ADMIN_INFO_ICON."</a></th>
<th class='text-right' style='text-align:right'>".TPVLAN_54."</th>
2009-10-28 23:45:46 +00:00
</tr>\n";
2009-10-28 23:45:46 +00:00
foreach ($theme['layouts'] as $key=>$val)
{
$itext .= "
<tr>";
if($mode == self::RENDER_SITEPREFS)
{
if(!$pref['sitetheme_deflayout'])
{
$pref['sitetheme_deflayout'] = ($val['@attributes']['default'] == 'true') ? $key : "";
}
$itext .= "<td class='center'>\n";
2013-06-17 16:45:03 -07:00
$itext .= "<input id='".$frm->name2id($key)."' type='radio' name='layout_default' value='{$key}' ".($pref['sitetheme_deflayout'] == $key ? " checked='checked'" : "")." />
</td>";
}
2013-06-17 16:45:03 -07:00
$itext .= "<td style='vertical-align:top'><label for='".$frm->name2id($key)."'>";
// $itext .= ($val['@attributes']['previewFull']) ? "<a href='".e_THEME_ABS.$theme['path']."/".$val['@attributes']['previewFull']."' >" : "";
$itext .= $val['@attributes']['title']."</label><div class='field-help'>".$key."</div>";
// $itext .= ($val['@attributes']['previewFull']) ? "</a>" : "";
$custompage_count = (isset($pref['sitetheme_custompages'][$key])) ? " [".count($pref['sitetheme_custompages'][$key])."]" : "";
$custompage_diz = "";
$count = 1;
if(isset($pref['sitetheme_custompages'][$key]) && count($pref['sitetheme_custompages'][$key]) > 0)
{
foreach ($pref['sitetheme_custompages'][$key] as $cp)
{
$custompage_diz .= "<a href='#element-to-be-shown-{$key}' class='btn btn-default btn-secondary btn-xs btn-mini e-expandit'>".trim($cp)."</a>&nbsp;";
if($count > 4)
{
$custompage_diz .= "...";
break;
}
$count++;
}
}
else
{
$custompage_diz = "<a href='#element-to-be-shown-{$key}' class='e-tip btn btn-xs btn-default btn-secondary btn-mini e-expandit'>".LAN_NONE."</a> ";
}
2009-10-28 23:45:46 +00:00
$itext .= "</td>
<td style='vertical-align:top'>";
// Default
// issue #3663: 1. custompages are "deleted" for the current selected layout
// issue #3663: 2. custompages of the selected layout are not editable
//if($pref['sitetheme_deflayout'] != $key)
//if(isset($pref['sitetheme_custompages'][$key]))
//{
$itext .= $custompage_diz."<div class='e-hideme' id='element-to-be-shown-{$key}'>
<textarea style='width:97%' rows='6' placeholder='usersettings.php' cols='20' name='custompages[".$key."]' >".(isset($pref['sitetheme_custompages'][$key]) ? implode("\n", $pref['sitetheme_custompages'][$key]) : "")."</textarea>";
//TODO Later.
2016-05-25 15:10:00 -07:00
if(e_DEBUG === true)
{
$itext .= "<small>(Not functional yet)</small>";
$itext .= e107::getForm()->userclass('layoutUserclass['.$key.']',null, null, array('options'=>'public,member,admin,classes,no-excludes','size'=>'xxlarge'));
}
$itext .= "
</div>\n";
//}
//else
//{
// $itext .= TPVLAN_55;
//}
$itext .= "</td>";
$itext .= "<td>";
if(varset($val['menuPresets']))
{
2013-12-31 00:59:30 -08:00
$itext .= $this->renderPresets($key);
}
$itext .= "</td>
2009-10-28 23:45:46 +00:00
</tr>";
}
$itext .= "</table></td></tr>";
}
2009-10-24 07:53:30 +00:00
2009-10-28 23:45:46 +00:00
// $itext .= !$mode ? "<tr><td style='vertical-align:top;width:24%'><b>".TPVLAN_8."</b>:</td><td style='vertical-align:top'>".$previewbutton.$selectmainbutton.$selectadminbutton."</td></tr>" : "";
2009-10-28 23:45:46 +00:00
if($mode == self::RENDER_ADMINPREFS)
{
$astext = "";
$file = e107::getFile();
$adminstyles = $file->get_files(e_ADMIN."includes");
2017-01-31 16:39:00 -08:00
$astext = "\n<select id='mode2' name='adminstyle' class='form-control input-medium'>\n";
foreach ($adminstyles as $as)
{
$style = str_replace(".php", "", $as['fname']);
$astext .= "<option value='{$style}'".($pref['adminstyle'] == $style ? " selected='selected'" : "").">".$style."</option>\n";
}
$astext .= "</select>";
$text .= "
<tr>
<td><b>".TPVLAN_41.":</b></td>
<td>".$astext."</td>
</tr>
\n";
$text .= "
<tr>
<td><b>" . TPVLAN_89 . "</b></td>
<td colspan='2'>
2017-01-31 16:39:00 -08:00
<div class='checkbox'>
<label class='checkbox'>
" . $frm->checkbox('adminpref', 1, (varset($pref['adminpref'], 0) == 1)) . "
</label>
2017-01-31 16:39:00 -08:00
</div>
</td>
</tr>
\n";
}
2009-08-06 22:27:47 +00:00
$text .= varset($itext, '');
2015-04-09 20:15:20 -07:00
$theme['css'] = $this->filterStylesheets($mode, $theme);
2015-04-09 20:15:20 -07:00
if(array_key_exists("multipleStylesheets", $theme) && $mode && !empty($theme['css']))
{
$pLabel = (self::RENDER_ADMINPREFS === $mode) ? TPVLAN_95 : TPVLAN_22;
$text .= "
<tr><td style='vertical-align:top;'><b>".$pLabel.":</b></td>
<td colspan='2' style='vertical-align:top'>
2015-02-06 01:03:09 -08:00
<table class='table table-bordered table-striped' >
<tr>
2017-04-03 10:18:05 -07:00
<td class='center' style='width:10%'>".TPVLAN_93."</td>
<td style='width:20%'>".TPVLAN_52."</td>
<td class='left'>".TPVLAN_7."</td>
</tr>";
foreach ($theme['css'] as $css)
{
$text2 = "";
switch($mode)
{
case self::RENDER_ADMINPREFS: // admin mode.
2013-03-15 23:35:16 -07:00
$for = $frm->name2id("admincss-".$css['name']);
$text2 = "<td class='center'>";
2017-01-31 16:39:00 -08:00
$text2 .= $frm->radio('admincss', $css['name'], vartrue($pref['admincss'])== $css['name'], array('id'=>$for));
$text2 .= "</td>";
$text2 .= "<td><label for='".$for."' title=\"".$css['name']."\">".$css['info']."</label></td>";
$text2 .= "<td>".($css['description'] ? $css['description'] : '')."</td>\n";
break;
case self::RENDER_SITEPREFS: // front 'sitetheme' mode.
$text2 = "
<td class='center'>
2013-06-17 16:45:03 -07:00
<input id='".$frm->name2id($css['name'])."' type='radio' name='themecss' value='".$css['name']."' ".($pref['themecss'] == $css['name'] || (!$pref['themecss'] && $css['name'] == "style.css") ? " checked='checked'" : "")." />
</td>
2013-06-17 16:45:03 -07:00
<td><label for='".$frm->name2id($css['name'])."' >".$css['name']."</lable></td>
<td>".($css['info'] ? $css['info'] : ($css['name'] == "style.css" ? TPVLAN_23 : TPVLAN_24))."</td>\n";
break;
}
$text .= ($text2) ? "<tr>".$text2."</tr>" : "";
}
$text .= "</table></td></tr>";
}
$text .= "</table>
<div class='center buttons-bar'>";
if($mode == self::RENDER_ADMINPREFS) // admin
{
$mainid = "selectmain[".$theme['id']."]";
$text .= $this->frm->admin_button('submit_adminstyle', TPVLAN_35, 'update');
//$text .= $this->frm->admin_button($mainid, TPVLAN_10, 'other');
}
else // main
{
$adminid = "selectadmin[".$theme['id']."]";
$text .= $this->frm->admin_button('submit_style', TPVLAN_35, 'update');
//$text .= $this->frm->admin_button($adminid, TPVLAN_32, 'other');
}
2009-10-28 23:52:56 +00:00
$text .= "<input type='hidden' name='curTheme' value='".$theme['path']."' />";
2009-10-28 23:52:56 +00:00
$text .= "</div>
</div>
2009-10-28 23:45:46 +00:00
<div class='tab-pane' id='core-thememanager-help'>".$this->renderThemeHelp()."</div>
<div class='tab-pane' id='core-thememanager-customconfig'>
<table class='table adminform'>
<colgroup>
<col class='col-label' />
<col class='col-control' />
<col class='col-control' />
</colgroup>
".$this->renderThemeConfig()."
</table>
<div class='center buttons-bar'>";
if($mode == self::RENDER_ADMINPREFS) // admin
{
$mainid = "selectmain[".$theme['id']."]";
$text .= $this->frm->admin_button('submit_adminstyle', TPVLAN_35, 'update');
//$text .= $this->frm->admin_button($mainid, TPVLAN_10, 'other');
}
else // main
{
$adminid = "selectadmin[".$theme['id']."]";
$text .= $this->frm->admin_button('submit_style', TPVLAN_35, 'update');
//$text .= $this->frm->admin_button($adminid, TPVLAN_32, 'other');
}
$text .= "<input type='hidden' name='curTheme' value='".$theme['path']."' />";
$text .= "</div>
</div>
</div>
\n";
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
return $text;
}
2013-12-31 00:59:30 -08:00
private function filterStylesheets($mode, $theme)
{
$remove = array();
$detected = array();
if($mode == self::RENDER_SITEPREFS)
{
foreach($theme['css'] as $k=>$v) // check if wildcard is present.
{
if($v['name'] == '*')
{
foreach($theme['files'] as $val) // get wildcard list of css files.
{
if(substr($val,-4) == '.css' && substr($val, 0, 6) != "admin_")
{
$detected[$val] = array('name'=>$val, 'info'=>'User-added Stylesheet', 'nonadmin'=>1);
}
}
break;
}
}
}
2017-01-31 16:39:00 -08:00
foreach($theme['css'] as $k=>$vl) // as defined.
{
if(!empty($detected[$vl['name']])) // remove any detected files which are listed
{
unset($detected[$vl['name']]);
}
2019-05-27 10:45:35 -07:00
// frontend
if($mode === self::RENDER_SITEPREFS)
{
if(substr($vl['name'], 0, 6) == "admin_")
{
$remove[$k] = $vl['name'];
}
if($vl['scope'] == 'admin')
{
$remove[$k] = $vl['name'];
}
if($vl['name'] == '*' )
{
$remove[$k] = $vl['name'];
$wildcard = true;
continue;
}
2019-05-27 10:45:35 -07:00
}
2019-05-27 10:45:35 -07:00
if($mode === self::RENDER_ADMINPREFS)
{
2017-01-31 16:39:00 -08:00
if($vl['name'] == "style.css" || empty($vl['info'])) // Hide the admin css unless it has a header. eg. /* info: Default stylesheet */
{
$remove[$k] = $vl['name'];
}
if($vl['name'] == '*' )
{
$remove[$k] = $vl['name'];
}
2017-01-31 16:39:00 -08:00
if($vl['scope'] === 'front')
{
$remove[$k] = $vl['name'];
}
if(!empty($vl['nonadmin']))
{
$remove[$k] = $vl['name'];
}
2019-05-27 10:45:35 -07:00
}
}
foreach($remove as $k=>$file)
{
unset($theme['css'][$k]);
// unset($detected[$file]);
}
foreach($detected as $k=>$v)
{
$theme['css'][] = $v;
}
// print_a($detected);
// print_a($remove);
return $theme['css'];
}
2013-12-31 00:59:30 -08:00
function renderPresets($key)
{
require_once (e_HANDLER."menumanager_class.php");
$frm = e107::getForm();
$men = new e_menuManager();
$men->curLayout = $key;
2015-07-16 14:40:25 -07:00
$preset = $men->getMenuPreset();
2015-02-06 01:03:09 -08:00
// print_a($preset);
2015-07-16 14:40:25 -07:00
//TODO LAN
$text = "<div class='btn-group pull-right'>".$frm->admin_button("setMenuPreset[".$key."]", TPVLAN_73,'other');
2013-12-31 00:59:30 -08:00
$text .= '<button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
</button>
<ul class="dropdown-menu col-selection">
<!-- dropdown menu links -->
<li class="dropdown-header">'.TPVLAN_74.'</li>
2013-12-31 00:59:30 -08:00
';
foreach($preset as $val)
{
$text .= "<li><a title='".$val['menu_name']."'>".str_replace("_menu","",$val['menu_name'])."</a></li>";
}
2015-07-16 14:44:25 -07:00
2013-12-31 00:59:30 -08:00
$text .= "</ul></div>";
return $text;
}
2009-10-28 23:45:46 +00:00
function renderPlugins($pluginOpts)
{
global $frm,$sql;
2009-10-28 23:45:46 +00:00
2009-10-28 23:52:56 +00:00
// if there is 1 entry, then it's not the same array.
// $tmp = (varset($pluginOpts['plugin'][1])) ? $pluginOpts['plugin'] : $pluginOpts;
2009-10-28 23:45:46 +00:00
$text = "";
2009-10-28 23:45:46 +00:00
foreach ($pluginOpts as $p)
{
$plug = trim($p['@attributes']['name']);
2009-10-28 23:45:46 +00:00
if(e107::isInstalled($plug))
{
2009-10-28 23:45:46 +00:00
$text .= $plug." ".ADMIN_TRUE_ICON;
}
else
{
2009-10-28 23:45:46 +00:00
// echo $plug;
if($sql->db_Select("plugin", "plugin_id", " plugin_path = '".$plug."' LIMIT 1 "))
{
2016-02-14 12:15:55 -08:00
$row = $sql->db_Fetch();
$name = "installplugin[".$row['plugin_id']."]";
2009-10-28 23:45:46 +00:00
$text .= $this->frm->admin_button($name, ADLAN_121." ".$plug."", 'delete');
}
else
{
2009-10-28 23:45:46 +00:00
$text .= (varset($p['@attributes']['url']) && ($p['@attributes']['url'] != 'core')) ? "<a rel='external' href='".$p['@attributes']['url']."'>".$plug."</a> " : "<i>".$plug."</i>";
$text .= ADMIN_FALSE_ICON;
}
2009-10-28 23:52:56 +00:00
}
2009-10-28 23:45:46 +00:00
$text .= "&nbsp;&nbsp;&nbsp;";
}
2009-10-28 23:45:46 +00:00
return $text;
}
2009-10-28 23:45:46 +00:00
function refreshPage($page = e_QUERY )
{
2009-10-28 23:45:46 +00:00
header("Location: ".e_SELF."?".$page);
exit;
}
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
function themePreview()
{
2009-10-28 23:45:46 +00:00
echo "<script type='text/javascript'>document.location.href='".e_BASE."index.php?themepreview.".$this->id."'</script>\n";
2006-12-02 04:36:16 +00:00
exit;
}
2009-10-28 23:45:46 +00:00
2019-06-17 09:23:21 -07:00
static function showPreview()
2006-12-02 04:36:16 +00:00
{
2017-01-23 09:41:23 -08:00
e107::includeLan(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_theme.php");
2006-12-02 04:36:16 +00:00
$text = "<br /><div class='indent'>".TPVLAN_1.".</div><br />";
2019-05-27 10:45:35 -07:00
$srch = array(
'{PREVIEWTHEMENAME}' => PREVIEWTHEMENAME,
'{e_ADMIN}' => e_ADMIN
);
$text = str_replace(array_keys($srch),$srch,$text);
2006-12-02 04:36:16 +00:00
global $ns;
$ns->tablerender(TPVLAN_2, $text);
}
2009-10-28 23:45:46 +00:00
2009-09-17 00:13:40 +00:00
/**
2009-10-28 23:45:46 +00:00
* Set Theme as Main Theme.
2009-11-17 14:50:37 +00:00
*
* @param string $name [optional] name (folder) of the theme to set.
* @return boolean TRUE on success, FALSE otherwise
2009-09-17 00:13:40 +00:00
*/
function setTheme($name = '', $contentCheck = true)
2006-12-02 04:36:16 +00:00
{
2009-09-17 00:13:40 +00:00
$core = e107::getConfig('core');
2009-10-28 23:45:46 +00:00
$sql = e107::getDb();
2012-11-28 02:22:23 -08:00
$mes = e107::getMessage();
2009-09-17 00:13:40 +00:00
2009-10-28 23:45:46 +00:00
$themeArray = $this->getThemes("id");
$name = ($name) ? $name : vartrue($themeArray[$this->id]);
2009-10-28 23:45:46 +00:00
$layout = $pref['sitetheme_layouts'] = is_array($this->themeArray[$name]['layouts']) ? $this->themeArray[$name]['layouts'] : array();
$deflayout = $this->findDefault($name);
$customPages = $this->themeArray[$name]['custompages'];
$version = $this->themeArray[$name]['version'];
2017-01-01 08:13:42 -08:00
$glyphs = $this->themeArray[$name]['glyphs'];
2009-10-28 23:45:46 +00:00
$core->set('sitetheme', $name);
$core->set('themecss', 'style.css');
$core->set('sitetheme_layouts', $layout);
$core->set('sitetheme_deflayout', $deflayout);
$core->set('sitetheme_custompages', $customPages);
2017-01-01 08:13:42 -08:00
$core->set('sitetheme_glyphicons', $glyphs);
2013-04-15 19:46:35 -07:00
2009-10-28 23:45:46 +00:00
$core->set('sitetheme_version', $version);
if(!empty($this->themeArray[$name]['preferences']))
{
$themePrefs = $this->themeArray[$name]['preferences'];
e107::getMessage()->addDebug("ThemePrefs found in theme.xml");
$this->id = $name;
$this->loadThemeConfig();
2017-01-30 08:52:12 -08:00
$className = get_class($this->themeConfigObj);
2017-01-30 08:52:12 -08:00
if($className === 'theme_config') // new way. 2.1.4
{
$themeConfig = e107::getThemeConfig($name);
2017-01-30 08:52:12 -08:00
e107::getMessage()->addDebug("Saving theme prefs to their own row: ".print_r($themePrefs,true));
foreach($themePrefs as $key=>$val)
{
$themeConfig->add($key,$val);
}
$themeConfig->save(false,true,false);
}
else // old way.
{
e107::getMessage()->addDebug("Saving theme prefs to sitetheme_ref");
$core->set('sitetheme_pref', $this->themeArray[$name]['preferences']);
}
}
2013-04-15 19:46:35 -07:00
if($contentCheck === true)
{
2016-02-10 19:38:03 -08:00
$sql->delete("menus", "menu_layout !='' ");
2013-04-15 19:46:35 -07:00
}
2009-10-28 23:45:46 +00:00
2014-01-08 17:23:56 +01:00
e107::getCache()->clear();
2016-02-10 19:38:03 -08:00
e107::getCache()->clearAll('js');
e107::getCache()->clearAll('css');
e107::getCache()->clearAll('library');
2009-09-17 00:13:40 +00:00
2009-10-28 23:45:46 +00:00
if($core->save())
{
2017-01-14 13:38:05 -08:00
$mes->addDebug("Default Layout: ".$deflayout);
$mes->addDebug("Custom Pages: ".print_a($customPages,true));
2009-09-17 00:13:40 +00:00
$med = e107::getMedia();
$med->import('_common_image', e_THEME.$name, "^.*?logo.*?(\.png|\.jpeg|\.jpg|\.JPG|\.GIF|\.PNG)$");
$med->import('_common_image', e_THEME.$name, '', 'min-size=20000');
2013-03-08 02:19:18 -08:00
if($contentCheck === true)
{
$this->installContentCheck($name);
}
2009-10-28 23:45:46 +00:00
$this->theme_adminlog('01', $name.', style.css');
return true;
}
else
{
// $mes->add(TPVLAN_3." <b>'".$name."'</b>", E_MESSAGE_ERROR);
return true;
}
2009-10-28 23:52:56 +00:00
2006-12-02 04:36:16 +00:00
}
/**
* @param $name
*/
function installContentCheck($name)
{
$file = e_THEME.$name."/install/install.xml";
$frm = e107::getForm();
$tp = e107::getParser();
if(!is_readable($file))
{
return false;
}
$mes = e107::getMessage();
$xmlArray = e107::getXml()->loadXMLfile($file, 'advanced');
$text = "
<form action='".e_SELF."' method='post'>
<div>
<p>".TPVLAN_58."<br />
".$tp->toHTML(TPVLAN_59, true).":<br />
</p>
<ul>";
$lng = e107::getLanguage();
foreach($xmlArray['database']['dbTable'] as $key=>$val)
{
$count = count($val['item']);
$data = array('x'=> $count, 'y' => $val['@attributes']['name']);
$text .= "<li>".$tp->lanVars(TPVLAN_60, $data)."</li>";
}
$text .= "</ul>
<p>".$tp->toHTML(TPVLAN_61, true)."</p>
".$frm->admin_button('installContent',$name, 'warning', LAN_YES)."
".$frm->admin_button('dismiss',0, 'cancel', LAN_NO)."
</div>
</form>
";
// $text .= print_a($xmlArray, true);
$mes->addInfo($text);
}
function installContent($name)
{
$mes = e107::getMessage();
$file = e_THEME.$name."/install/install.xml";
e107::getXml()->e107Import($file, 'replace', true, false); // Overwrite specific core pref and tables entries.
$mes->addSuccess(LAN_UPDATED);
}
/**
* @param $theme
* @return int|string
*/
function findDefault($theme)
{
2016-12-02 12:04:08 -08:00
if(!empty($_POST['layout_default']))
{
2016-12-02 12:04:08 -08:00
return e107::getParser()->filter($_POST['layout_default'], 'w');
}
2009-10-28 23:45:46 +00:00
$l = $this->themeArray[$theme];
if(!$l)
{
2009-10-28 23:45:46 +00:00
$l = $this->getThemeInfo($theme);
}
2009-10-28 23:45:46 +00:00
if($l['layouts'])
{
2009-10-28 23:45:46 +00:00
foreach ($l['layouts'] as $key=>$val)
{
2009-10-28 23:45:46 +00:00
if(isset($val['@attributes']['default']) && ($val['@attributes']['default'] == "true"))
{
2009-10-28 23:45:46 +00:00
return $key;
}
}
}
else
{
2009-10-28 23:45:46 +00:00
return "";
}
}
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
function setAdminTheme()
{
2012-11-28 02:22:23 -08:00
global $pref,$e107cache;
$ns = e107::getRender();
$mes = e107::getMessage();
2009-10-28 23:45:46 +00:00
$themeArray = $this->getThemes("id");
$pref['admintheme'] = $themeArray[$this->id];
2013-03-15 23:35:16 -07:00
$pref['admincss'] = file_exists(e_THEME.$pref['admintheme'].'/admin_dark.css') ? 'admin_dark.css' : 'admin_light.css';
$e107cache->clear_sys();
if(save_prefs())
{
2009-10-28 23:52:56 +00:00
// Default Message
2012-11-28 02:22:23 -08:00
$mes->add(TPVLAN_40." <b>'".$themeArray[$this->id]."'</b>", E_MESSAGE_SUCCESS);
2009-10-28 23:45:46 +00:00
$this->theme_adminlog('02', $pref['admintheme'].', '.$pref['admincss']);
}
2009-10-28 23:45:46 +00:00
// $ns->tablerender("Admin Message", "<br /><div style='text-align:center;'>".TPVLAN_40." <b>'".$themeArray[$this -> id]."'</b>.</div><br />");
2009-10-28 23:45:46 +00:00
// $this->showThemes('admin');
2006-12-02 04:36:16 +00:00
}
/**
* @todo add admin log
*/
2006-12-02 04:36:16 +00:00
function setStyle()
{
2012-11-28 02:22:23 -08:00
global $pref,$e107cache;
$sql = e107::getDb();
$ns = e107::getRender();
$mes = e107::getMessage();
$themeCSS = vartrue($_POST['themecss'],'style.css');
$themeLayout = vartrue($_POST['layout_default'], 'default');
e107::getConfig()->setPosted('themecss',$themeCSS)->setPosted('sitetheme_deflayout', $themeLayout);
$msg = $this->setThemeConfig();
if($msg)
{
2012-11-28 02:22:23 -08:00
$mes->add(TPVLAN_37, E_MESSAGE_SUCCESS);
if(is_array($msg))
2012-11-28 02:22:23 -08:00
$mes->add($msg[0], $msg[1]);
}
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
2006-12-02 04:36:16 +00:00
function setAdminStyle()
{
//TODO adminlog
2017-01-31 16:39:00 -08:00
$config = e107::getConfig();
if(!empty($_POST['admincss']))
{
$config->setPosted('admincss', $_POST['admincss']);
}
2017-02-01 10:39:13 -08:00
$config->setPosted('adminstyle', $_POST['adminstyle'])
2017-01-31 16:39:00 -08:00
->setPosted('adminpref', varset($_POST['adminpref'], 0))->save(true,true,false);
2017-02-01 10:39:13 -08:00
e107::redirect(e_REQUEST_URI);
2017-01-31 16:39:00 -08:00
/*return (e107::getConfig()->dataHasChangedFor('admincss')
|| e107::getConfig()->dataHasChangedFor('adminstyle')
2017-01-31 16:39:00 -08:00
|| e107::getConfig()->dataHasChangedFor('adminpref'));*/
2006-12-02 04:36:16 +00:00
}
2009-10-28 23:45:46 +00:00
function SetCustomPages($array)
{
2009-10-28 23:45:46 +00:00
if(!is_array($array))
{
return;
}
2010-01-10 16:24:09 +00:00
$newprefs = array();
foreach ($array as $key => $newpref)
{
$newpref = trim(str_replace("\r\n", "\n", $newpref));
$newprefs[$key] = array_filter(explode("\n", $newpref));
$newprefs[$key] = array_unique($newprefs[$key]);
}
2009-10-28 23:45:46 +00:00
if(e107::getPref('sitetheme_deflayout') == 'legacyCustom')
{
$newprefs['legacyCustom'] = array();
}
2010-01-10 16:24:09 +00:00
//setPosted couldn't be used here - sitetheme_custompages structure is not defined
e107::getConfig()->set('sitetheme_custompages', e107::getParser()->toDB($newprefs));
}
/**
* Set the Theme layouts, as found in theme.xml
*/
function setLayouts($name='')
{
$name = $this->id;
$layout = is_array($this->themeArray[$name]['layouts']) ? $this->themeArray[$name]['layouts'] : array();
e107::getConfig()->set('sitetheme_layouts', $layout);
}
2009-10-28 23:45:46 +00:00
2008-11-02 10:28:30 +00:00
// Log event to admin log
2009-10-28 23:45:46 +00:00
function theme_adminlog($msg_num = '00', $woffle = '')
2008-11-02 10:28:30 +00:00
{
2009-09-17 00:13:40 +00:00
if($this->noLog)
{
return;
}
global $pref,$admin_log;
2008-11-02 10:28:30 +00:00
// if (!varset($pref['admin_log_log']['admin_banlist'],0)) return;
2014-10-23 11:12:13 -07:00
e107::getLog()->add('THEME_'.$msg_num, $woffle, E_LOG_INFORMATIVE, '');
2008-11-02 10:28:30 +00:00
}
2009-10-28 23:45:46 +00:00
function parse_theme_php($path)
{
return e_theme::parse_theme_php($path);
}
2009-10-28 23:45:46 +00:00
function parse_theme_xml($path)
{
return e_theme::parse_theme_xml($path);
2017-01-01 08:13:42 -08:00
}
2009-10-28 23:52:56 +00:00
2017-01-01 08:13:42 -08:00
}
2019-01-31 14:35:57 -08:00
interface e_theme_config
{
/**
* Triggered on theme settings submit
* Catch and save theme configuration
*/
2017-01-01 16:54:57 -08:00
// public function process();
2009-10-28 23:45:46 +00:00
/**
* Theme configuration user interface
2009-10-28 23:45:46 +00:00
* Print out config fields
*/
2017-01-01 16:54:57 -08:00
public function config(); // only config() is absolutely required.
/**
* Theme help tab
2009-10-28 23:45:46 +00:00
* Print out theme help content
*/
2017-01-01 16:54:57 -08:00
// public function help();
2007-01-17 20:47:41 +00:00
}
2019-01-31 14:35:57 -08:00
/**
* Interface e_theme_render
* @see e107_themes/bootstrap3/admin_theme.php
*/
interface e_theme_render
{
public function tablestyle($caption, $text, $mode, $data);
}
/**
* Interface e_theme_library
*//*
interface e_theme_library
{
public function config();
}*/