From 6e68aaa9a4e20552f9f513e6568f9bbfc13dc96f Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 4 Jan 2017 18:08:58 -0800 Subject: [PATCH] Plugin/Theme "new version" alerts on admin dashboard. Overwriting enabled during download - existing plugins/theme now moved out of the way and backed up.Theme-dir scanning improved and optimized for speed. --- e107_admin/admin.php | 141 +++++- e107_admin/e107_update.php | 174 -------- e107_admin/plugin.php | 5 +- e107_admin/update_routines.php | 27 +- e107_handlers/e107_class.php | 16 +- e107_handlers/e_marketplace.php | 50 ++- e107_handlers/file_class.php | 35 +- e107_handlers/theme_handler.php | 476 +++++++++++++++++++++ e107_languages/English/admin/lan_admin.php | 4 +- 9 files changed, 716 insertions(+), 212 deletions(-) diff --git a/e107_admin/admin.php b/e107_admin/admin.php index baba63307..ed738a648 100644 --- a/e107_admin/admin.php +++ b/e107_admin/admin.php @@ -147,16 +147,33 @@ class admin_start $this->deleteDeprecated(); } + e107::getDb()->db_Mark_Time('Check New Install'); $this->checkNewInstall(); + e107::getDb()->db_Mark_Time('Check Core Update'); + $this->checkCoreUpdate(); + e107::getDb()->db_Mark_Time('Check Plugin Update'); + $this->checkPluginUpdate(); + e107::getDb()->db_Mark_Time('Check Theme Update'); + $this->checkThemeUpdate(); + e107::getDb()->db_Mark_Time('Check Paths'); $this->checkPaths(); + e107::getDb()->db_Mark_Time('Check Timezone'); $this->checkTimezone(); + e107::getDb()->db_Mark_Time('Check Writable'); $this->checkWritable(); - $this->checkHtmlarea(); + e107::getDb()->db_Mark_Time('Check HTMLArea'); + $this->checkHtmlarea(); + e107::getDb()->db_Mark_Time('Check Incompatible Plugins'); $this->checkIncompatiblePlugins(); + e107::getDb()->db_Mark_Time('Check Filetypes'); $this->checkFileTypes(); + e107::getDb()->db_Mark_Time('Check Suspect Files'); $this->checkSuspiciousFiles(); + e107::getDb()->db_Mark_Time('Check Deprecated'); $this->checkDeprecated(); + e107::getDb()->db_Mark_Time('Check Password Encryption'); $this->checkPasswordEncryption(); + e107::getDb()->db_Mark_Time('Check Htaccess'); $this->checkHtaccess(); if($this->refresh == true) @@ -206,6 +223,118 @@ class admin_start } + private function checkCoreUpdate() + { + // auto db update + if ('0' != ADMINPERMS) + { + return null; + } + + //$sc = e107::getScBatch('admin'); + //echo $tp->parseTemplate('{ADMIN_COREUPDATE=alert}',true, $sc); + + global $dont_check_update, $e107info; + global $dbupdate, $dbupdatep, $e107cache; + + require_once(e_ADMIN.'update_routines.php'); + update_check(); + + + + } + + + private function checkPluginUpdate() + { + require_once(e_HANDLER.'e_marketplace.php'); + $mp = new e_marketplace(); // autodetect the best method + + $versions = $mp->getVersionList('plugin'); + + $plugins = e107::getPref('plug_installed'); + + if(empty($plugins)) + { + return null; + } + + + $tp = e107::getParser(); + + foreach($plugins as $folder=>$version) + { + + if(!empty($versions[$folder]['version']) && version_compare( $version, $versions[$folder]['version'], '<')) + { + $link = "".$versions[$folder]['name'].""; + + $dl = $mp->getDownloadModal('plugin', $versions[$folder]); + + $caption = LAN_DOWNLOAD.": ".$versions[$folder]['name']." ".$versions[$folder]['version']; + + $lans = array('x'=>$link, 'y'=>LAN_PLUGIN); + $message = $tp->lanVars(LAN_NEWER_VERSION_OF_X, $lans); + $message .= " ".$tp->toGlyph('fa-cloud-download').""; + + + e107::getMessage()->addInfo($message); + e107::getMessage()->addDebug("Local version: ".$version." Remote version: ".$versions[$folder]['version']); + } + + } + + + } + + private function checkThemeUpdate() + { + require_once(e_HANDLER.'e_marketplace.php'); + $mp = new e_marketplace(); // autodetect the best method + + $versions = $mp->getVersionList('theme'); + + $themes = scandir(e_THEME); + + if(empty($themes)) + { + return null; + } + + $tp = e107::getParser(); + + $list = e107::getTheme()->getThemeList(); + + foreach($list as $data) + { + + $folder = $data['path']; + $version = $data['version']; + + if(!empty($versions[$folder]['version']) && version_compare( $version, $versions[$folder]['version'], '<')) + { + $link = "".$versions[$folder]['name'].""; + + $lans = array('x'=>$link, 'y'=>LAN_THEME); + + $dl = $mp->getDownloadModal('theme', $versions[$folder]); + + $caption = LAN_DOWNLOAD.": ".$versions[$folder]['name']." ".$versions[$folder]['version']; + + $message = $tp->lanVars(LAN_NEWER_VERSION_OF_X, $lans); + $message .= " ".$tp->toGlyph('fa-cloud-download').""; + + + e107::getMessage()->addInfo($message); + e107::getMessage()->addDebug("Local version: ".$version." Remote version: ".$versions[$folder]['version']); + } + + } + + + + } + /** * */ @@ -486,15 +615,7 @@ class admin_start // --------------------------------------------------------- -// auto db update -if ('0' == ADMINPERMS) -{ - $sc = e107::getScBatch('admin'); - echo $tp->parseTemplate('{ADMIN_COREUPDATE=alert}',true, $sc); - - require_once(e_ADMIN.'update_routines.php'); - update_check(); -} + diff --git a/e107_admin/e107_update.php b/e107_admin/e107_update.php index b7202832e..7daf35be3 100644 --- a/e107_admin/e107_update.php +++ b/e107_admin/e107_update.php @@ -24,183 +24,9 @@ $e_sub_cat = 'database'; require_once ("auth.php"); require_once ("update_routines.php"); - - -// - -// Carry out CORE updates -/* -function run_updates($dbupdate) -{ - global $mes; - - foreach($dbupdate as $func => $rmks) - { - if(function_exists('update_'.$func)) // Legacy Method. - { - $installed = call_user_func("update_".$func); - //?! (LAN_UPDATE == $_POST[$func]) - if(varsettrue($_POST['update_core'][$func]) && !$installed) - { - if(function_exists("update_".$func)) - { - $message = LAN_UPDATE_7." {$rmks}"; - $error = call_user_func("update_".$func, "do"); - if($error != '') - { - $mes->add($message, E_MESSAGE_ERROR); - $mes->add($error, E_MESSAGE_ERROR); - } - else $mes->add($message, E_MESSAGE_SUCCESS); - } - } - } - - - - } -} - -function run_updates_plugin($func,$check=TRUE) // New for {plugin}_setup.php -{ - if(class_exists($func.'_setup')) - { - $class = $func.'_setup'; - $setObj = new $class; - - if(method_exists($setObj,'upgrade_post')) - { - return $setObj->upgrade_post($check); - } - // print_a($setObj); - // echo "
Found: ".$func; - } -} - - - - -function show_updates($dbupdate, $what) -{ - global $frm; - $mes = e107::getMessage(); - - $caption = constant('LAN_UPDATE_CAPTION_'.strtoupper($what)); - $text = " -
-
- {$caption} - - - - - - - - - - - - - "; - - $updates = 0; - - // asort($dbupdate); - - foreach($dbupdate as $func => $rmks) - { - if(function_exists("update_".$func)) - { - $text .= ""; - - if(call_user_func("update_".$func)) - { - $text .= ""; - } - else - { - $updates ++; - $text .= ""; - } - $text .= "\n"; - } - - if(class_exists($func.'_setup')) // plugin_setup.php - { - $text .= ""; - - $reason = run_updates_plugin($func,TRUE); // TRUE = Just check if needed. - if(!$reason) - { - $text .= ""; - } - else - { - $updates ++; - $mes->addDebug($reason); - $text .= ""; - } - $text .= "\n"; - } - } - - $text .= " - -
".LAN_UPDATE_55."".LAN_UPDATE_2."
{$rmks}".LAN_UPDATE_3."".$frm->admin_button('update_core['.$func.']', LAN_UPDATE, 'warning', '', "id=e-{$func}")."
{$rmks}".LAN_UPDATE_3."".$frm->admin_button('update['.$func.']', LAN_UPDATE, 'warning')."
-
-
- "; - - echo $text; - return $updates; // Number of updates to do -} -*/ - - - new e107Update($dbupdate); - require_once ("footer.php"); - -/* - -if(varset($_POST['update_core']) && is_array($_POST['update_core'])) -{ - $message = run_updates($dbupdate); -} - -if(varset($_POST['update']) && is_array($_POST['update'])) // Do plugin updates -{ - $func = key($_POST['update']); - run_updates_plugin($func,FALSE); -} - -$total_updates = 0; - -ob_start(); - if(isset($dbupdatep)) - { // Show plugin updates done - $total_updates += show_updates($dbupdatep, 'plugin'); - } - // Show core updates done - $total_updates += show_updates($dbupdate, 'core'); - $text = ob_get_contents(); -ob_end_clean(); - -$e107->ns->tablerender(LAN_UPDATE_56, $mes->render().$text); - -if($total_updates == 0) -{ // No updates needed - clear the cache to be sure - $e107cache->set_sys("nq_admin_updatecheck", time().', 1, '.$e107info['e107_version'], TRUE); -} - * - * - */ - - - ?> \ No newline at end of file diff --git a/e107_admin/plugin.php b/e107_admin/plugin.php index 2d8014367..06a833034 100644 --- a/e107_admin/plugin.php +++ b/e107_admin/plugin.php @@ -162,6 +162,7 @@ class pluginmanager_form extends e_form if ($this->plug['plugin_version'] != $this->plug_vars['@attributes']['version'] && $this->plug['plugin_installflag']) { // $text .= "
plug['plugin_id']}'\" title='".EPL_UPGRADE." to v".$this->plug_vars['@attributes']['version']."' value='".EPL_UPGRADE."' />"; + e107::getMessage()->addInfo("".$tp->toHtml($this->plug['plugin_name'],false,'TITLE')." is ready to be upgraded. (see below)"); // TODO LAN $text .= "plug_vars['@attributes']['version']."\" >".ADMIN_UPGRADEPLUGIN_ICON.""; } @@ -1471,7 +1472,7 @@ class pluginManager{ $pgf->plug = $plug; $text .= $pgf->renderTableRow($this->fields, $this->fieldpref, $data, 'plugin_id'); - +/* $folder = $plug['plugin_path']; if(!empty($versions[$folder]['version']) && version_compare( $plug['plugin_version'], $versions[$folder]['version'], '<')) { @@ -1480,7 +1481,7 @@ class pluginManager{ $lan = "A newer version of [x] is available for download."; e107::getMessage()->addInfo($tp->lanVars($lan,$link)); e107::getMessage()->addDebug("Local version: ".$plug['plugin_version']." Remote version: ".$versions[$folder]['version']); - } + }*/ } } diff --git a/e107_admin/update_routines.php b/e107_admin/update_routines.php index 5c1abfb1d..350eb5dcb 100644 --- a/e107_admin/update_routines.php +++ b/e107_admin/update_routines.php @@ -59,7 +59,7 @@ $dbupdate = array(); // Array of core upgrade actions global $e107cache; -if (is_readable(e_ADMIN.'ver.php')) +if(is_readable(e_ADMIN.'ver.php')) { include(e_ADMIN.'ver.php'); } @@ -168,7 +168,7 @@ class e107Update if(varset($_POST['update_core']) && is_array($_POST['update_core'])) { $func = key($_POST['update_core']); - $message = $this->updateCore($func); + $this->updateCore($func); } if(varset($_POST['update']) && is_array($_POST['update'])) // Do plugin updates @@ -176,11 +176,7 @@ class e107Update $func = key($_POST['update']); $this->updatePlugin($func); } - - if(vartrue($message)) - { - $mes->addSuccess($message); - } + $this->renderForm(); } @@ -425,17 +421,22 @@ function update_check() if ($update_needed === TRUE) { $frm = e107::getForm(); + $label = LAN_UPDATE." ".e107::getParser()->toGlyph('fa-arrow-right'); + - $txt = " + $text = "
- ".ADLAN_120." - ".$frm->admin_button('e107_system_update', LAN_UPDATE, 'other')." -
+

".ADLAN_120."

+ ".$frm->admin_button('e107_system_update', 'update', 'other', $label)." +
"; - - $mes->addInfo($txt); + + + // $text = ADLAN_120. "". e107::getParser()->toGlyph('fa-chevron-circle-right').""; + // $text .= "
"; + $mes->addInfo($text); } } diff --git a/e107_handlers/e107_class.php b/e107_handlers/e107_class.php index 14fe307e3..203cb10af 100644 --- a/e107_handlers/e107_class.php +++ b/e107_handlers/e107_class.php @@ -201,6 +201,7 @@ class e107 'e_ranks' => '{e_HANDLER}e_ranks_class.php', 'e_shortcode' => '{e_HANDLER}shortcode_handler.php', 'e_system_user' => '{e_HANDLER}user_model.php', + 'e_theme' => '{e_HANDLER}theme_handler.php', 'e_upgrade' => '{e_HANDLER}e_upgrade_class.php', 'e_user_model' => '{e_HANDLER}user_model.php', 'e_user' => '{e_HANDLER}user_model.php', @@ -1302,7 +1303,7 @@ class e107 } - /** + /** * Retrieve rater singleton object * * @return rater @@ -1384,6 +1385,19 @@ class e107 return self::getSingleton('e_menu', true); } + + /** + * Retrieve rater singleton object + * + * @return e_theme + */ + public static function getTheme() + { + return self::getSingleton('e_theme', true); + } + + + /** * Retrieve URL singleton object * diff --git a/e107_handlers/e_marketplace.php b/e107_handlers/e_marketplace.php index 0c61e4aa9..7e199eb3b 100644 --- a/e107_handlers/e_marketplace.php +++ b/e107_handlers/e_marketplace.php @@ -225,6 +225,54 @@ class e_marketplace } + /** + * @param $data - e107.org plugin/theme feed data. + */ + public function getDownloadModal($type='plugin',$data) + { + + $url = false; + + if($type === 'plugin') + { + + $srcData = array( + 'plugin_id' => $data['params']['id'], + 'plugin_folder' => $data['folder'], + 'plugin_price' => $data['price'], + 'plugin_mode' => $data['params']['mode'], + 'plugin_url' => $data['url'], + ); + + + + $d = http_build_query($srcData,false,'&'); + $url = e_ADMIN.'plugin.php?mode=download&src='.base64_encode($d); + } + + if($type === 'theme') + { + $srcData = array( + 'id' => $data['params']['id'], + 'url' => $data['url'], + 'mode' => 'addon', + 'price' => $data['price'] + ); + + $d = http_build_query($srcData,false,'&'); + $url = e_ADMIN.'theme.php?mode=download&src='.base64_encode($d);//$url.'&action=download'; + + } + + + return $url; + + } + + + + + public function getVersionList($type='plugin') { $cache = e107::getCache(); @@ -408,7 +456,7 @@ abstract class e_marketplace_adapter_abstract } - if($fl->unzipArchive($localfile,$type)) + if($fl->unzipArchive($localfile,$type, true)) { $mes->addSuccess(TPVLAN_82); return true; diff --git a/e107_handlers/file_class.php b/e107_handlers/file_class.php index 2a1e5b144..5f30f209d 100644 --- a/e107_handlers/file_class.php +++ b/e107_handlers/file_class.php @@ -1321,7 +1321,7 @@ class e_file * @param string $type - addon type, either 'plugin' or 'theme', (possibly 'language' in future). * @return string unzipped folder name on success or false. */ - public function unzipArchive($localfile, $type) + public function unzipArchive($localfile, $type, $overwrite=false) { $mes = e107::getMessage(); @@ -1329,7 +1329,7 @@ class e_file $dir = false; - if(class_exists('ZipArchive') && e_DEBUG === true) // PHP7 compat. method. + if(class_exists('ZipArchive')) // PHP7 compat. method. { $zip = new ZipArchive; @@ -1377,15 +1377,30 @@ class e_file if($dir && is_dir($destpath.$dir)) { - $mes->addError("(".ucfirst($type).") Already Downloaded - ".basename($destpath).'/'.$dir); - - if(file_exists(e_TEMP.$localfile)) - { - @unlink(e_TEMP.$localfile); + if($overwrite === true) + { + if(file_exists(e_TEMP.$localfile)) + { + $time = date("YmdHi"); + if(rename($destpath.$dir, e_BACKUP.$dir."_".$time)) + { + $mes->addSuccess("Old folder moved to backup directory"); + } + } + } + else + { + + $mes->addError("(".ucfirst($type).") Already Downloaded - ".basename($destpath).'/'.$dir); + + if(file_exists(e_TEMP.$localfile)) + { + @unlink(e_TEMP.$localfile); + } + + $this->removeDir(e_TEMP.$dir); + return false; } - - $this->removeDir(e_TEMP.$dir); - return false; } if(empty($dir)) diff --git a/e107_handlers/theme_handler.php b/e107_handlers/theme_handler.php index c06173343..9ac979a2c 100644 --- a/e107_handlers/theme_handler.php +++ b/e107_handlers/theme_handler.php @@ -16,6 +16,482 @@ if(!defined('e107_INIT')) } +// 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' + ); + + + private static $cacheTime = 120; // 2 hours + + + function __construct() + { + + + + + } + + + /** + * Get a list of all themes in theme folder and its data. + * @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; + + $array = scandir(e_THEME); + + $cacheTag = "Theme_meta"; + + if($force === false && $tmp = e107::getCache()->retrieve($cacheTag, self::$cacheTime, true, true)) + { + return e107::unserialize($tmp); + } + + 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; + } + 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; + } + + + + + 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]; + + + } + + + + + private static function parse_theme_php($path) + { + $CUSTOMPAGES = ""; + $tp = e107::getParser(); + $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); + + /* 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")) + { + eval(str_replace("$", "\$", $line)); // detect arrays also. + } + } + + if(is_array($CUSTOMPAGES)) + { + foreach ($CUSTOMPAGES as $key=>$val) + { + $themeArray['custompages'][$key] = explode(" ", $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; + + 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 "

".$themeArray['name']."

"; + // print_a($lays); + + return $themeArray; + } + + private 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'); + $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 " + // + //
oldnew parser
".print_a($oldvars,true)."".print_a($vars,true)."
"; + } + + + $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'] = 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'] = varset($vars['preview'][0]); + + if(!empty($vars['themePrefs'])) + { + + foreach($vars['themePrefs']['pref'] as $k=>$val) + { + $name = $val['@attributes']['name']; + $vars['preferences'][$name] = $val['@value']; + } + } + + + unset($vars['authorEmail'], $vars['authorUrl'], $vars['xhtmlCompliant'], $vars['cssCompliant'], $vars['description'],$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; + + if(!empty($vars['stylesheets']['css'])) + { + $vars['css'] = array(); + + foreach($vars['stylesheets']['css'] as $val) + { + $notadmin = vartrue($val['@attributes']['admin']) ? false : true; + + $vars['css'][] = array("name" => $val['@attributes']['file'], "info"=> $val['@attributes']['name'], "nonadmin"=>$notadmin, 'scope'=> vartrue($val['@attributes']['scope'])); + } + + unset($vars['stylesheets']); + } + + + $vars['glyphs'] = array(); + if(!empty($vars['glyphicons']['glyph'])) + { + + foreach($vars['glyphicons']['glyph'] as $val) + { + $vars['glyphs'][] = array( + 'name' => $val['@attributes']['name'], + 'pattern' => $val['@attributes']['pattern'], + 'path' => $val['@attributes']['path'], + 'prefix' => $val['@attributes']['prefix'], + 'tag' => $val['@attributes']['tag'], + ); + + } + + unset($vars['glyphicons']); + + } + + + if($path == "leasure" ) + { + + // $mes->addDebug("

".$path."

"); + // $mes->addDebug(print_a($vars,true)); + // $mes->addDebug("
"); + } + + if($path == "bootstrap3" ) + { + // print_a($vars); + // echo "
".print_a($vars,true)."".print_a($adv,true)."
"; + } + + + 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); + + } + + +} + + + + + class themeHandler { diff --git a/e107_languages/English/admin/lan_admin.php b/e107_languages/English/admin/lan_admin.php index 1de141c26..0dd68a477 100644 --- a/e107_languages/English/admin/lan_admin.php +++ b/e107_languages/English/admin/lan_admin.php @@ -503,5 +503,7 @@ define("LAN_CREATE_ANOTHER", "create another"); define("LAN_EDIT_CURRENT", "edit current"); define("LAN_MAINTENANCE", "Maintenance"); define("LAN_RETURN_TO_FRONT_PANEL", "Return to Front Panel"); -define("LAN_CHANGE_LANGUAGE", "Change Language"); +define("LAN_CHANGE_LANGUAGE", "Change Language"); + +define("LAN_NEWER_VERSION_OF_X", "A newer version of the [x] [y] is available for download."); // x= Name y = Theme | Plugin