introduce theme model and use it in jsscuttle. rest will follow

This commit is contained in:
Christian Weiske 2011-05-24 18:21:54 +02:00
parent 85d201b0ad
commit e01c813101
5 changed files with 118 additions and 12 deletions

View file

@ -121,18 +121,19 @@
<replacement <replacement
path="src/SemanticScuttle/header.php" path="src/SemanticScuttle/header.php"
type="pear-config" type="pear-config" from="@data_dir@" to="data_dir"
from="@data_dir@" to="data_dir" />
<replacement
path="src/SemanticScuttle/header.php"
type="pear-config" from="@www_dir@" to="www_dir"
/> />
<replacement <replacement
path="www/www-header.php" path="www/www-header.php"
type="pear-config" type="pear-config" from="@data_dir@" to="data_dir"
from="@data_dir@" to="data_dir"
/> />
<replacement <replacement
path="tests/prepare.php" path="tests/prepare.php"
type="pear-config" type="pear-config" from="@data_dir@" to="data_dir"
from="@data_dir@" to="data_dir"
/> />
<changelog version="0.97" date="2010-06-09" license="GPL"> <changelog version="0.97" date="2010-06-09" license="GPL">

View file

@ -0,0 +1,97 @@
<?php
/**
* SemanticScuttle - your social bookmark manager.
*
* PHP version 5.
*
* @category Bookmarking
* @package SemanticScuttle
* @author Christian Weiske <cweiske@cweiske.de>
* @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 <cweiske@cweiske.de>
* @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;
}
}
?>

View file

@ -14,6 +14,7 @@
*/ */
require_once 'SemanticScuttle/Model/Template.php'; require_once 'SemanticScuttle/Model/Template.php';
require_once 'SemanticScuttle/Model/Theme.php';
/** /**
* SemanticScuttle template service. * SemanticScuttle template service.
@ -40,9 +41,9 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service
/** /**
* The template theme to use. * 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; protected $theme;
@ -72,7 +73,7 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service
protected function __construct() protected function __construct()
{ {
$this->basedir = $GLOBALS['TEMPLATES_DIR']; $this->basedir = $GLOBALS['TEMPLATES_DIR'];
$this->theme = $GLOBALS['theme']; $this->theme = new SemanticScuttle_Model_Theme($GLOBALS['theme']);
//FIXME: verify the theme exists //FIXME: verify the theme exists
} }
@ -84,6 +85,8 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service
* @param string $template Template filename relative * @param string $template Template filename relative
* to template dir * to template dir
* @param array $vars Array of template variables. * @param array $vars Array of template variables.
* The current theme object will be added
* automatically with name "theme".
* *
* @return SemanticScuttle_Model_Template Template object * @return SemanticScuttle_Model_Template Template object
*/ */
@ -95,12 +98,13 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service
$oldIncPath = get_include_path(); $oldIncPath = get_include_path();
set_include_path( set_include_path(
$this->basedir . $this->theme $this->basedir . $this->theme->getName()
. PATH_SEPARATOR . $this->basedir . 'default' . PATH_SEPARATOR . $this->basedir . 'default'
//needed since services are instantiated in templates //needed since services are instantiated in templates
. PATH_SEPARATOR . $oldIncPath . PATH_SEPARATOR . $oldIncPath
); );
$vars['theme'] = $this->theme;
$tpl = new SemanticScuttle_Model_Template( $tpl = new SemanticScuttle_Model_Template(
$template, $vars, $this $template, $vars, $this
); );

View file

@ -18,9 +18,12 @@
if ('@data_dir@' == '@' . 'data_dir@') { if ('@data_dir@' == '@' . 'data_dir@') {
//non pear-install //non pear-install
$datadir = dirname(__FILE__) . '/../../data/'; $datadir = dirname(__FILE__) . '/../../data/';
$wwwdir = dirname(__FILE__) . '/../../www/';
} else { } else {
//pear installation; files are in include path //pear installation; files are in include path
$datadir = '@data_dir@/SemanticScuttle/'; $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')) { if (!file_exists($datadir . '/config.php')) {

View file

@ -3,6 +3,7 @@ $GLOBALS['saveInLastUrl'] = false;
$httpContentType = 'text/javascript'; $httpContentType = 'text/javascript';
require_once 'www-header.php'; require_once 'www-header.php';
require_once 'SemanticScuttle/functions.php'; require_once 'SemanticScuttle/functions.php';
$theme = new SemanticScuttle_Model_Theme($GLOBALS['theme']);
$player_root = ROOT .'includes/player/'; $player_root = ROOT .'includes/player/';
?> ?>
@ -62,7 +63,7 @@ function isAvailable(input, response){
username = username.trim(); username = username.trim();
var availability = document.getElementById("availability"); var availability = document.getElementById("availability");
if (username != '') { if (username != '') {
usernameField.style.backgroundImage = 'url(<?php echo ROOT . 'themes/' . $GLOBALS['theme']; ?>/images/loading.gif)'; usernameField.style.backgroundImage = 'url(<?php echo $theme->resource('images/loading.gif'); ?>)';
if (response != '') { if (response != '') {
usernameField.style.backgroundImage = 'none'; usernameField.style.backgroundImage = 'none';
if (response == 'true') { if (response == 'true') {
@ -92,7 +93,7 @@ function useAddress(ele) {
function getTitle(input, response){ function getTitle(input, response){
var title = document.getElementById('titleField'); var title = document.getElementById('titleField');
if (title.value == '') { if (title.value == '') {
title.style.backgroundImage = 'url(<?php echo ROOT . 'themes/' . $GLOBALS['theme']; ?>/images/loading.gif)'; title.style.backgroundImage = 'url(<?php echo $theme->resource('images/loading.gif');?>)';
if (response != null) { if (response != null) {
title.style.backgroundImage = 'none'; title.style.backgroundImage = 'none';
title.value = response; title.value = response;