From e01c813101f2811879acfe808c4573b924f7b666 Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Tue, 24 May 2011 18:21:54 +0200 Subject: [PATCH] introduce theme model and use it in jsscuttle. rest will follow --- build.xml | 13 ++-- src/SemanticScuttle/Model/Theme.php | 97 ++++++++++++++++++++++++ src/SemanticScuttle/Service/Template.php | 12 ++- src/SemanticScuttle/header.php | 3 + www/jsScuttle.php | 5 +- 5 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 src/SemanticScuttle/Model/Theme.php diff --git a/build.xml b/build.xml index 9773a63..7b3896b 100644 --- a/build.xml +++ b/build.xml @@ -121,18 +121,19 @@ + diff --git a/src/SemanticScuttle/Model/Theme.php b/src/SemanticScuttle/Model/Theme.php new file mode 100644 index 0000000..a2f4973 --- /dev/null +++ b/src/SemanticScuttle/Model/Theme.php @@ -0,0 +1,97 @@ + + * @license AGPL v3 or later http://www.gnu.org/licenses/agpl.html + * @link http://sourceforge.net/projects/semanticscuttle + */ + +/** + * A theme, the visual representation of SemanticScuttle. + * + * @category Bookmarking + * @package SemanticScuttle + * @author Christian Weiske + * @license AGPL v3 or later http://www.gnu.org/licenses/agpl.html + * @link http://sourceforge.net/projects/semanticscuttle + */ +class SemanticScuttle_Model_Theme +{ + /** + * Theme name. Also the path part of template and resource files + * + * @var string + */ + protected $name = null; + + /** + * Local path to the www themes directory. + * Needs to have a trailing slash. + * + * @var string + */ + protected $wwwThemeDir = null; + + + + /** + * Create a new theme instance. + * + * @param string $name Theme name "data/templates/(*)/" + */ + public function __construct($name = 'default') + { + $this->name = $name; + $this->wwwThemeDir = $GLOBALS['wwwdir'] . '/themes/'; + //TODO: implement theme hierarchies with parent fallback + } + + + + /** + * Returns the URL path to a resource file (www/themes/$name/$file). + * Automatically falls back to the parent theme if the file does not exist + * in the theme. + * + * Must always be used when adding i.e. images to the output. + * + * @param string $file File name to find the path for + * + * @return string Full path + */ + public function resource($file) + { + $themeFile = $this->wwwThemeDir . $this->name . '/' . $file; + if (file_exists($themeFile)) { + return ROOT . 'themes/' . $this->name . '/' . $file; + } + + $defaultFile = $this->wwwThemeDir . 'default/' . $file; + if (file_exists($defaultFile)) { + return ROOT . 'themes/default/' . $file; + } + + //file does not exist. fall back to the theme file + // to guide the theme author a bit. + // TODO: logging. in admin mode, there should be a message + return ROOT . 'themes/' . $this->name . '/' . $file; + } + + + + /** + * Returns the theme name. + * + * @return string Theme name + */ + public function getName() + { + return $this->name; + } +} +?> \ No newline at end of file diff --git a/src/SemanticScuttle/Service/Template.php b/src/SemanticScuttle/Service/Template.php index 2a683d6..b5d4cfa 100644 --- a/src/SemanticScuttle/Service/Template.php +++ b/src/SemanticScuttle/Service/Template.php @@ -14,6 +14,7 @@ */ require_once 'SemanticScuttle/Model/Template.php'; +require_once 'SemanticScuttle/Model/Theme.php'; /** * SemanticScuttle template service. @@ -40,9 +41,9 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service /** * The template theme to use. - * Set in constructor from $GLOBALS['theme'] + * Set in constructor based on $GLOBALS['theme'] * - * @var string + * @var SemanticScuttle_Model_Theme */ protected $theme; @@ -72,7 +73,7 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service protected function __construct() { $this->basedir = $GLOBALS['TEMPLATES_DIR']; - $this->theme = $GLOBALS['theme']; + $this->theme = new SemanticScuttle_Model_Theme($GLOBALS['theme']); //FIXME: verify the theme exists } @@ -84,6 +85,8 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service * @param string $template Template filename relative * to template dir * @param array $vars Array of template variables. + * The current theme object will be added + * automatically with name "theme". * * @return SemanticScuttle_Model_Template Template object */ @@ -95,12 +98,13 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service $oldIncPath = get_include_path(); set_include_path( - $this->basedir . $this->theme + $this->basedir . $this->theme->getName() . PATH_SEPARATOR . $this->basedir . 'default' //needed since services are instantiated in templates . PATH_SEPARATOR . $oldIncPath ); + $vars['theme'] = $this->theme; $tpl = new SemanticScuttle_Model_Template( $template, $vars, $this ); diff --git a/src/SemanticScuttle/header.php b/src/SemanticScuttle/header.php index 098e5c3..6c0d4df 100644 --- a/src/SemanticScuttle/header.php +++ b/src/SemanticScuttle/header.php @@ -18,9 +18,12 @@ if ('@data_dir@' == '@' . 'data_dir@') { //non pear-install $datadir = dirname(__FILE__) . '/../../data/'; + $wwwdir = dirname(__FILE__) . '/../../www/'; } else { //pear installation; files are in include path $datadir = '@data_dir@/SemanticScuttle/'; + //FIXME: when you have multiple installations, the www_dir will be wrong + $wwwdir = '@www_dir@/SemanticScuttle/'; } if (!file_exists($datadir . '/config.php')) { diff --git a/www/jsScuttle.php b/www/jsScuttle.php index 4f9d3b7..5e5f31b 100644 --- a/www/jsScuttle.php +++ b/www/jsScuttle.php @@ -3,6 +3,7 @@ $GLOBALS['saveInLastUrl'] = false; $httpContentType = 'text/javascript'; require_once 'www-header.php'; require_once 'SemanticScuttle/functions.php'; +$theme = new SemanticScuttle_Model_Theme($GLOBALS['theme']); $player_root = ROOT .'includes/player/'; ?> @@ -62,7 +63,7 @@ function isAvailable(input, response){ username = username.trim(); var availability = document.getElementById("availability"); if (username != '') { - usernameField.style.backgroundImage = 'url(/images/loading.gif)'; + usernameField.style.backgroundImage = 'url(resource('images/loading.gif'); ?>)'; if (response != '') { usernameField.style.backgroundImage = 'none'; if (response == 'true') { @@ -92,7 +93,7 @@ function useAddress(ele) { function getTitle(input, response){ var title = document.getElementById('titleField'); if (title.value == '') { - title.style.backgroundImage = 'url(/images/loading.gif)'; + title.style.backgroundImage = 'url(resource('images/loading.gif');?>)'; if (response != null) { title.style.backgroundImage = 'none'; title.value = response;