diff --git a/htdocs/sql/libraries/Theme_Manager.class.php b/htdocs/sql/libraries/Theme_Manager.class.php new file mode 100755 --- /dev/null +++ b/htdocs/sql/libraries/Theme_Manager.class.php @@ -0,0 +1,395 @@ +init(); + } + + /** + * sets path to folder containing the themes + * + * @param string $path path to themes folder + * @return boolean success + */ + function setThemesPath($path) + { + if (! $this->_checkThemeFolder($path)) { + return false; + } + + $this->_themes_path = trim($path); + return true; + } + + /** + * @public + * @return string + */ + function getThemesPath() + { + return $this->_themes_path; + } + + /** + * sets if there are different themes per server + * + * @param boolean $per_server + */ + function setThemePerServer($per_server) + { + $this->per_server = (bool) $per_server; + } + + function init() + { + $this->themes = array(); + $this->theme_default = 'original'; + $this->active_theme = ''; + + if (! $this->setThemesPath($GLOBALS['cfg']['ThemePath'])) { + return false; + } + + $this->setThemePerServer($GLOBALS['cfg']['ThemePerServer']); + + $this->loadThemes(); + + $this->theme = new PMA_Theme; + + + if (! $this->checkTheme($GLOBALS['cfg']['ThemeDefault'])) { + $GLOBALS['PMA_errors'][] = sprintf($GLOBALS['strThemeDefaultNotFound'], + htmlspecialchars($GLOBALS['cfg']['ThemeDefault'])); + trigger_error( + sprintf($GLOBALS['strThemeDefaultNotFound'], + htmlspecialchars($GLOBALS['cfg']['ThemeDefault'])), + E_USER_WARNING); + $GLOBALS['cfg']['ThemeDefault'] = false; + } + + $this->theme_default = $GLOBALS['cfg']['ThemeDefault']; + + // check if user have a theme cookie + if (! $this->getThemeCookie() + || ! $this->setActiveTheme($this->getThemeCookie())) { + // otherwise use default theme + if ($GLOBALS['cfg']['ThemeDefault']) { + $this->setActiveTheme($GLOBALS['cfg']['ThemeDefault']); + } else { + // or original theme + $this->setActiveTheme('original'); + } + } + } + + function checkConfig() + { + if ($this->_themes_path != trim($GLOBALS['cfg']['ThemePath']) + || $this->theme_default != $GLOBALS['cfg']['ThemeDefault']) { + $this->init(); + } else { + // at least the theme path needs to be checked every time for new + // themes, as there is no other way at the moment to keep track of + // new or removed themes + $this->loadThemes(); + } + } + + function setActiveTheme($theme = null) + { + if (! $this->checkTheme($theme)) { + $GLOBALS['PMA_errors'][] = sprintf($GLOBALS['strThemeNotFound'], + htmlspecialchars($theme)); + /* Following code can lead to path disclossure, because headers will be sent later */ +/* trigger_error( + sprintf($GLOBALS['strThemeNotFound'], htmlspecialchars($theme)), + E_USER_WARNING);*/ + return false; + } + + $this->active_theme = $theme; + $this->theme = $this->themes[$theme]; + + // need to set later + //$this->setThemeCookie(); + + return true; + } + + /** + * @return string cookie name + */ + function getThemeCookieName() + { + // Allow different theme per server + if (isset($GLOBALS['server']) && $this->per_server) { + return $this->cookie_name . '-' . $GLOBALS['server']; + } else { + return $this->cookie_name; + } + } + + /** + * returns name of theme stored in the cookie + * @return string theme name from cookie + */ + function getThemeCookie() + { + if (isset($_COOKIE[$this->getThemeCookieName()])) { + return $_COOKIE[$this->getThemeCookieName()]; + } + + return false; + } + + /** + * save theme in cookie + * + * @uses PMA_setCookie(); + * @uses PMA_Theme_Manager::getThemeCookieName() + * @uses PMA_Theme_Manager::$theme + * @uses PMA_Theme_Manager::$theme_default + * @uses PMA_Theme::getId() + */ + function setThemeCookie() + { + PMA_setCookie($this->getThemeCookieName(), $this->theme->id, + $this->theme_default); + // force a change of a dummy session variable to avoid problems + // with the caching of phpmyadmin.css.php + $_SESSION['PMA_Config']->set('theme-update', $this->theme->id); + return true; + } + + /** + * old PHP 4 constructor + */ + function PMA_Theme_Manager() + { + $this->__construct(); + } + + /** + * @private + * @param string $folder + * @return boolean + */ + /*private*/ function _checkThemeFolder($folder) + { + if (! is_dir($folder)) { + $GLOBALS['PMA_errors'][] = + sprintf($GLOBALS['strThemePathNotFound'], + htmlspecialchars($folder)); + trigger_error( + sprintf($GLOBALS['strThemePathNotFound'], + htmlspecialchars($folder)), + E_USER_WARNING); + return false; + } + + return true; + } + + /** + * read all themes + */ + function loadThemes() + { + $this->themes = array(); + + if ($handleThemes = opendir($this->getThemesPath())) { + // check for themes directory + while (false !== ($PMA_Theme = readdir($handleThemes))) { + if (array_key_exists($PMA_Theme, $this->themes)) { + // this does nothing! + //$this->themes[$PMA_Theme] = $this->themes[$PMA_Theme]; + continue; + } + $new_theme = PMA_Theme::load($this->getThemesPath() . '/' . $PMA_Theme); + if ($new_theme) { + $new_theme->setId($PMA_Theme); + $this->themes[$PMA_Theme] = $new_theme; + } + } // end get themes + closedir($handleThemes); + } else { + trigger_error( + 'phpMyAdmin-ERROR: cannot open themes folder: ' . $this->getThemesPath(), + E_USER_WARNING); + return false; + } // end check for themes directory + + ksort($this->themes); + return true; + } + + /** + * checks if given theme name is a known theme + * + * @param string $theme name fo theme to check for + */ + function checkTheme($theme) + { + if (! array_key_exists($theme, $this->themes)) { + return false; + } + + return true; + } + + /** + * returns HTML selectbox, with or without form enclsoed + * + * @param boolean $form wether enclosed by from tags or not + */ + function getHtmlSelectBox($form = true) + { + $select_box = ''; + + if ($form) { + $select_box .= '
'; + } + + return $select_box; + } + + /** + * enables backward compatibility + */ + function makeBc() + { + $GLOBALS['theme'] = $this->theme->getId(); + $GLOBALS['pmaThemePath'] = $this->theme->getPath(); + $GLOBALS['pmaThemeImage'] = $this->theme->getImgPath(); + + /** + * load layout file if exists + */ + if (@file_exists($GLOBALS['pmaThemePath'] . 'layout.inc.php')) { + include $GLOBALS['pmaThemePath'] . 'layout.inc.php'; + } + + + } + + /** + * prints out preview for every theme + * + * @uses $this->themes + * @uses PMA_Theme::printPreview() + */ + function printPreviews() + { + foreach ($this->themes as $each_theme) { + $each_theme->printPreview(); + } // end 'open themes' + } + + /** + * returns PMA_Theme object for fall back theme + * @return object PMA_Theme + */ + function getFallBackTheme() + { + if (isset($this->themes['original'])) { + return $this->themes['original']; + } + + return false; + } + + /** + * prints css data + */ + function printCss($type) + { + if ($this->theme->loadCss($type)) { + return true; + } + + // load css for this them failed, try default theme css + $fallback_theme = $this->getFallBackTheme(); + if ($fallback_theme && $fallback_theme->loadCss($type)) { + return true; + } + + return false; + } +} +?>