diff --git a/ChangeLog b/ChangeLog index 6906298de..58cad8425 100755 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,10 @@ phpMyAdmin - Changelog $Id$ $Source$ +2005-11-28 Sebastian Mendel + * libraries/Theme.class.php, libraries/Theme_Manager.class.php: + new classes for handling themes + 2005-11-27 Michal Čihař * Documentation.html, scripts/setup.php: Many new features to setup script. diff --git a/libraries/Theme.class.php b/libraries/Theme.class.php new file mode 100644 index 000000000..ffa03cd93 --- /dev/null +++ b/libraries/Theme.class.php @@ -0,0 +1,134 @@ +setPath( $folder ); + + if ( isset( $theme_full_version ) ) { + $theme->setVersion( $theme_full_version ); + } elseif ( isset( $theme_generation, $theme_version ) ) { + $theme->setVersion( $theme_generation . '.' . $theme_version ); + } + $theme->setName( $theme_name ); + + if ( is_dir( $theme->getPath() . 'img/' ) ) { + $theme->setImgPath( $theme->getPath() . 'img/' ); + } elseif ( is_dir( $GLOBALS['cfg']['ThemePath'] . '/original/img/' ) ) { + $theme->setImgPath( $GLOBALS['cfg']['ThemePath'] . '/original/img/' ); + } else { + $GLOBALS['PMA_errors'][] = + sprintf( $GLOBALS['strThemeNoValidImgPath'], $theme_name ); + trigger_error( + sprintf( $GLOBALS['strThemeNoValidImgPath'], $theme_name ), + E_USER_WARNING ); + } + + return $theme; + } + + function getPath() { + return $this->path; + } + + function setPath( $path ) { + $this->path = trim( $path ); + } + + /** + * sets version + * @param string new version + */ + function setVersion( $version ) { + $this->version = trim( $version ); + } + + /** + * sets name + * @param string $name new name + */ + function setName( $name ) { + $this->name = trim( $name ); + } + + /** + * returns name + * @return string name + */ + function getName() { + return $this->name; + } + + /** + * sets id + * @param string $id new id + */ + function setId( $id ) { + $this->id = trim( $id ); + } + + /** + * returns id + * @return string id + */ + function getId() { + return $this->id; + } + + function setImgPath( $path ) { + $this->img_path = $path; + } + + function getImgPath() { + return $this->img_path; + } +} + +?> \ No newline at end of file diff --git a/libraries/Theme_Manager.class.php b/libraries/Theme_Manager.class.php new file mode 100644 index 000000000..e8c5c0fc2 --- /dev/null +++ b/libraries/Theme_Manager.class.php @@ -0,0 +1,238 @@ +themes_path = trim( $GLOBALS['cfg']['ThemePath'] ) ; + $this->per_server = (bool) $GLOBALS['cfg']['ThemePerServer']; + $this->theme = new PMA_Theme; + + if ( ! $this->_checkThemeFolder( $this->themes_path ) ) { + return; + } + + $this->loadThemes( $this->themes_path ); + + if ( ! $this->checkTheme( $GLOBALS['cfg']['ThemeDefault'] ) ) { + $GLOBALS['PMA_errors'][] = sprintf( $GLOBALS['strThemeDefaultNotFound'], + $GLOBALS['cfg']['ThemeDefault'] ); + trigger_error( + sprintf( $GLOBALS['strThemeDefaultNotFound'], + $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() ) ) { + if ( $GLOBALS['cfg']['ThemeDefault'] ) { + $this->setActiveTheme( $GLOBALS['cfg']['ThemeDefault'] ); + } else { + $this->setActiveTheme( 'original' ); + } + } + } + + function setActiveTheme( $theme = NULL ) { + if ( ! $this->checkTheme( $theme ) ) { + $GLOBALS['PMA_errors'][] = sprintf( $GLOBALS['strThemeNotFound'], + $theme ); + trigger_error( + sprintf( $GLOBALS['strThemeNotFound'], $theme ), + E_USER_WARNING ); + return false; + } + + $this->active_theme = $theme; + $this->theme = $this->themes[$theme]; + + $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; + } + } + + function getThemeCookie() { + if ( isset( $_COOKIE[$this->getThemeCookieName()] ) ) { + return $_COOKIE[$this->getThemeCookieName()]; + } + + return false; + } + + /** + * save theme in cookie + */ + function setThemeCookie() { + if ( $this->theme_default === $this->theme->getId() ) { + // remove cookie + setcookie( $this->getThemeCookieName(), $this->theme->getId(), + time() - 3600, $GLOBALS['cookie_path'], '', $GLOBALS['is_https'] ); + return true; + } + + if ( $this->getThemeCookie() === $this->theme->getId() ) { + return true; + } + + setcookie( $this->getThemeCookieName(), $this->theme->getId(), + time() + 60*60*24*30, $GLOBALS['cookie_path'], '', $GLOBALS['is_https'] ); + 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'], + $folder ); + trigger_error( + sprintf( $GLOBALS['strThemePathNotFound'], + $folder ), + E_USER_WARNING ); + return false; + } + + return true; + } + + /** + * read all themes + */ + function loadThemes( $folder ) { + $this->themes = array(); + + if ( $handleThemes = opendir( $folder ) ) { + // check for themes directory + while (FALSE !== ($PMA_Theme = readdir($handleThemes))) { + $new_theme = PMA_Theme::load( $folder . '/' . $PMA_Theme ); + if ( $new_theme ) { + $new_theme->setId( $PMA_Theme ); + $this->themes[$PMA_Theme] = $new_theme; + } + } // end get themes + closedir( $handleThemes ); + } else { + return false; + } // end check for themes directory + + ksort( $this->themes ); + } + + function checkTheme( $theme ) { + if ( ! array_key_exists( $theme, $this->themes ) ) { + return false; + } + + return true; + } + + function getHtmlSelectBox( $form = true ) { + if ( $form ) { + echo '
'; + echo PMA_generate_common_hidden_inputs(); + } + + $theme_selected = FALSE; + $theme_preview_path= './themes.php'; + $theme_preview_href = ''; + echo $theme_preview_href . $GLOBALS['strTheme'] . ':' . "\n"; + + echo ''; + + if ( $form ) { + echo ''; + echo '
'; + } + } + + /** + * 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' ); + } + + + } +} +?> \ No newline at end of file