diff options
-rw-r--r-- | include/functions.inc.php | 2 | ||||
-rw-r--r-- | include/template.class.php | 402 |
2 files changed, 325 insertions, 79 deletions
diff --git a/include/functions.inc.php b/include/functions.inc.php index b0c011453..eef4e9126 100644 --- a/include/functions.inc.php +++ b/include/functions.inc.php @@ -36,8 +36,6 @@ include_once( PHPWG_ROOT_PATH .'include/functions_url.inc.php' ); include_once( PHPWG_ROOT_PATH .'include/derivative_params.inc.php'); include_once( PHPWG_ROOT_PATH .'include/derivative_std_params.inc.php'); include_once( PHPWG_ROOT_PATH .'include/derivative.inc.php'); -//require_once( PHPWG_ROOT_PATH .'include/smarty/libs/Smarty.class.php'); -require_once( PHPWG_ROOT_PATH .'include/smarty/libs/SmartyBC.class.php'); include_once( PHPWG_ROOT_PATH .'include/template.class.php'); diff --git a/include/template.class.php b/include/template.class.php index 733d051ff..98f09721f 100644 --- a/include/template.class.php +++ b/include/template.class.php @@ -21,37 +21,61 @@ // | USA. | // +-----------------------------------------------------------------------+ -define('BUTTONS_RANK_NEUTRAL', 50); +/** + * @package template + */ -class Template { +//require_once( PHPWG_ROOT_PATH .'include/smarty/libs/Smarty.class.php'); +require_once( PHPWG_ROOT_PATH .'include/smarty/libs/SmartyBC.class.php'); - var $smarty; +/** default rank for buttons */ +define('BUTTONS_RANK_NEUTRAL', 50); + +/** + * This a wrapper arround Smarty classes proving various custom mechanisms for templates. + */ +class Template +{ + /** @var Smarty */ + var $smarty; + /** @var string */ var $output = ''; - // Hash of filenames for each template handle. + /** @var string[] - Hash of filenames for each template handle. */ var $files = array(); - - // Template extents filenames for each template handle. + /** @var string[] - Template extents filenames for each template handle. */ var $extents = array(); - - // Templates prefilter from external sources (plugins) + /** @var array - Templates prefilter from external sources (plugins) */ var $external_filters = array(); - // used by html_head smarty block to add content before </head> + /** @var string - Content to add before </head> tag */ var $html_head_elements = array(); + /** @var string - Runtime CSS rules */ private $html_style = ''; + /** @const string */ const COMBINED_SCRIPTS_TAG = '<!-- COMBINED_SCRIPTS -->'; + /** @var ScriptLoader */ var $scriptLoader; + /** @const string */ const COMBINED_CSS_TAG = '<!-- COMBINED_CSS -->'; + /** @var CssLoader */ var $cssLoader; + /** @var array - Runtime buttons on picture page */ var $picture_buttons = array(); + /** @var array - Runtime buttons on index page */ var $index_buttons = array(); - function Template($root = ".", $theme= "", $path = "template") + + /** + * @var string $root + * @var string $theme + * @var string $path + */ + function __construct($root = ".", $theme= "", $path = "template") { global $conf, $lang_info; @@ -62,7 +86,9 @@ class Template { $this->smarty = new SmartyBC; $this->smarty->debugging = $conf['debug_template']; if (!$this->smarty->debugging) + { $this->smarty->error_reporting = error_reporting() & ~E_NOTICE; + } $this->smarty->compile_check = $conf['template_compile_check']; $this->smarty->force_compile = $conf['template_force_compile']; @@ -133,7 +159,13 @@ class Template { } /** - * Load theme's parameters. + * Loads theme's parameters. + * + * @param string $root + * @param string $theme + * @param string $path + * @param bool $load_css + * @param bool $load_local_head */ function set_theme($root, $theme, $path, $load_css=true, $load_local_head=true) { @@ -166,8 +198,10 @@ class Template { } /** - * Add template directory for this Template object. - * Set compile id if not exists. + * Adds template directory for this Template object. + * Also set compile id if not exists. + * + * @param string $dir */ function set_template_dir($dir) { @@ -183,6 +217,8 @@ class Template { /** * Gets the template root directory for this Template object. + * + * @return string */ function get_template_dir() { @@ -201,6 +237,12 @@ class Template { file_put_contents($this->smarty->getCompileDir().'/index.htm', 'Not allowed!'); } + /** + * Returns theme's parameter. + * + * @param string $val + * @return mixed + */ function get_themeconf($val) { $tc = $this->smarty->getTemplateVars('themeconf'); @@ -209,6 +251,10 @@ class Template { /** * Sets the template filename for handle. + * + * @param string $handle + * @param string $filename + * @return bool */ function set_filename($handle, $filename) { @@ -216,8 +262,10 @@ class Template { } /** - * Sets the template filenames for handles. $filename_array should be a - * hash of handle => filename pairs. + * Sets the template filenames for handles. + * + * @param string[] $filename_array hashmap of handle=>filename + * @return true */ function set_filenames($filename_array) { @@ -242,6 +290,13 @@ class Template { /** * Sets template extention filename for handles. + * + * @param string $filename + * @param mixed $param + * @param string $dir + * @param bool $overwrite + * @param string $theme + * @return bool */ function set_extent($filename, $param, $dir='', $overwrite=true, $theme='N/A') { @@ -250,7 +305,12 @@ class Template { /** * Sets template extentions filenames for handles. - * $filename_array should be an hash of filename => array( handle, param) or filename => handle + * + * @param string[] $filename_array hashmap of handle=>filename + * @param string $dir + * @param bool $overwrite + * @param string $theme + * @return bool */ function set_extents($filename_array, $dir='', $overwrite=true, $theme='N/A') { @@ -288,7 +348,13 @@ class Template { return true; } - /** return template extension if exists */ + /** + * Returns template extension if exists. + * + * @param string $filename should be empty! + * @param string $handle + * @return string + */ function get_extent($filename='', $handle='') { if (isset($this->extents[$handle])) @@ -298,17 +364,27 @@ class Template { return $filename; } - /** see smarty assign http://www.smarty.net/manual/en/api.assign.php */ - function assign($tpl_var, $value = null) + /** + * Assigns a template variable. + * @see http://www.smarty.net/manual/en/api.assign.php + * + * @param string|array $tpl_var can be a var name or a hashmap of variables + * (in this case, do not use the _$value_ parameter) + * @param mixed $value + */ + function assign($tpl_var, $value=null) { $this->smarty->assign( $tpl_var, $value ); } /** - * Inserts the uncompiled code for $handle as the value of $varname in the - * root-level. This can be used to effectively include a template in the - * middle of another template. - * This is equivalent to assign($varname, $this->parse($handle, true)) + * Defines _$varname_ as the compiled result of _$handle_. + * This can be used to effectively include a template in another template. + * This is equivalent to assign($varname, $this->parse($handle, true)). + * + * @param string $varname + * @param string $handle + * @return true */ function assign_var_from_handle($varname, $handle) { @@ -316,15 +392,24 @@ class Template { return true; } - /** see smarty append http://www.smarty.net/manual/en/api.append.php */ + /** + * Appends a new value in a template array variable, the variable is created if needed. + * @see http://www.smarty.net/manual/en/api.append.php + * + * @param string $tpl_var + * @param mixed $value + * @param bool $merge + */ function append($tpl_var, $value=null, $merge=false) { $this->smarty->append( $tpl_var, $value, $merge ); } /** - * Root-level variable concatenation. Appends a string to an existing - * variable assignment with the same name. + * Performs a string concatenation. + * + * @param string $tpl_var + * @param string $value */ function concat($tpl_var, $value) { @@ -332,23 +417,35 @@ class Template { $this->smarty->getTemplateVars($tpl_var) . $value); } - /** see smarty append http://www.smarty.net/manual/en/api.clear_assign.php */ + /** + * Removes an assigned template variable. + * @see http://www.smarty.net/manual/en/api.clear_assign.php + * + * @param string $tpl_var + */ function clear_assign($tpl_var) { $this->smarty->clearAssign( $tpl_var ); } - /** see smarty get_template_vars http://www.smarty.net/manual/en/api.get_template_vars.php */ - function get_template_vars($name=null) + /** + * Returns an assigned template variable. + * @see http://www.smarty.net/manual/en/api.get_template_vars.php + * + * @param string $tpl_var + */ + function get_template_vars($tpl_var=null) { - return $this->smarty->getTemplateVars( $name ); + return $this->smarty->getTemplateVars( $tpl_var ); } - /** - * Load the file for the handle, eventually compile the file and run the compiled - * code. This will add the output to the results or return the result if $return - * is true. + * Loads the template file of the handle, compiles it and appends the result to the output + * (or returns it if _$return_ is true). + * + * @param string $handle + * @param bool $return + * @return null|string */ function parse($handle, $return=false) { @@ -381,8 +478,10 @@ class Template { } /** - * Load the file for the handle, eventually compile the file and run the compiled - * code. This will print out the results of executing the template. + * Loads the template file of the handle, compiles it and appends the result to the output, + * then sends the output to the browser. + * + * @param string $handle */ function pparse($handle) { @@ -390,6 +489,9 @@ class Template { $this->flush(); } + /** + * Load and compile JS & CSS into the template and sends the output to the browser. + */ function flush() { if (!$this->scriptLoader->did_head()) @@ -449,7 +551,10 @@ class Template { $this->output=''; } - /** flushes the output */ + /** + * Same as flush() but with optional debugging. + * @see Template::flush() + */ function p() { $this->flush(); @@ -466,6 +571,12 @@ class Template { } } + /** + * Eval a temp string to retrieve the original PHP value. + * + * @param string $str + * @return mixed + */ static function get_php_str_val($str) { if (is_string($str) && strlen($str)>1) @@ -481,7 +592,14 @@ class Template { } /** - * translate variable modifier - translates a text to the currently loaded language + * "translate" variable modifier. + * Usage : + * - {'Comment'|translate} + * - {'%d comments'|translate:$count} + * @see l10n() + * + * @param array $params + * @return string */ static function modcompiler_translate($params) { @@ -511,6 +629,15 @@ class Template { } } + /** + * "translate_dec" variable modifier. + * Usage : + * - {$count|translate_dec:'%d comment':'%d comments'} + * @see l10n_dec() + * + * @param array $params + * @return string + */ static function modcompiler_translate_dec($params) { global $conf, $lang, $lang_info; @@ -537,8 +664,13 @@ class Template { } /** - * explode variable modifier - similar to php explode - * 'Yes;No'|@explode:';' -> array('Yes', 'No') + * "explode" variable modifier. + * Usage : + * - {assign var=valueExploded value=$value|@explode:','} + * + * @param string $text + * @param string $delimiter + * @return array */ static function mod_explode($text, $delimiter=',') { @@ -546,10 +678,11 @@ class Template { } /** - * This smarty "html_head" block allows to add content just before - * </head> element in the output after the head has been parsed. This is - * handy in order to respect strict standards when <style> and <link> - * html elements must appear in the <head> element + * The "html_head" block allows to add content just before + * </head> element in the output after the head has been parsed. + * + * @param array $params (unused) + * @param string $content */ function block_html_head($params, $content) { @@ -560,6 +693,13 @@ class Template { } } + /** + * The "html_style" block allows to add CSS juste before + * </head> element in the output after the head has been parsed. + * + * @param array $params (unused) + * @param string $content + */ function block_html_style($params, $content) { $content = trim($content); @@ -569,6 +709,20 @@ class Template { } } + /** + * The "define_derivative" function allows to define derivative from tpl file. + * It assigns a DerivativeParams object to _name_ template variable. + * + * @param array $params + * - name (required) + * - type (optional) + * - width (required if type is empty) + * - height (required if type is empty) + * - crop (optional, used if type is empty) + * - min_height (optional, used with crop) + * - min_height (optional, used with crop) + * @param Smarty $smarty + */ function func_define_derivative($params, $smarty) { !empty($params['name']) or fatal_error('define_derivative missing name'); @@ -610,18 +764,18 @@ class Template { $smarty->assign( $params['name'], ImageStdParams::get_custom($w, $h, $crop, $minw, $minh) ); } - /** - * combine_script smarty function allows inclusion of a javascript file in the current page. - * The engine will combine several js files into a single one in order to reduce the number of - * required http requests. - * param id - required - * param path - required - the path to js file RELATIVE to piwigo root dir - * param load - optional - header|footer|async, default header - * param require - optional - comma separated list of script ids required to be loaded and executed - before this one - * param version - optional - plugins could use this and change it in order to force a - browser refresh - */ + /** + * The "combine_script" functions allows inclusion of a javascript file in the current page. + * The engine will combine several js files into a single one. + * + * @param array $params + * - id (required) + * - path (required) + * - load (optional) 'header', 'footer' or 'async' + * - require (optional) comma separated list of script ids required to be loaded + * and executed before this one + * - version (optional) used to force a browser refresh + */ function func_combine_script($params) { if (!isset($params['id'])) @@ -646,7 +800,13 @@ class Template { isset($params['version']) ? $params['version'] : 0 ); } - + /** + * The "get_combined_scripts" function returns HTML tag of combined scripts. + * It can returns a placeholder for delayed JS files combination and minification. + * + * @param array $params + * - load (required) + */ function func_get_combined_scripts($params) { if (!isset($params['load'])) @@ -698,8 +858,13 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa return implode("\n", $content); } - - private static function make_script_src( $script ) + /** + * Returns clean relative URL to script file. + * + * @param Combinable $script + * @return string + */ + private static function make_script_src($script) { $ret = ''; if ( $script->is_remote() ) @@ -717,6 +882,13 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa return embellish_url($ret); } + /** + * The "footer_script" block allows to add runtime script in the HTML page. + * + * @param array $params + * - require (optional) comma separated list of script ids + * @param string $content + */ function block_footer_script($params, $content) { $content = trim($content); @@ -731,13 +903,16 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa } /** - * combine_css smarty function allows inclusion of a css stylesheet file in the current page. - * The engine will combine several css files into a single one in order to reduce the number of - * required http requests. - * param path - required - the path to css file RELATIVE to piwigo root dir - * param version - optional - plugins could use this and change it in order to force a - browser refresh - */ + * The "combine_css" function allows inclusion of a css file in the current page. + * The engine will combine several css files into a single one. + * + * @param array $params + * - id (optional) used to deal with multiple inclusions from plugins + * - path (required) + * - version (optional) used to force a browser refresh + * - order (optional) + * - template (optional) set to true to allow smarty syntax in the css file + */ function func_combine_css($params) { if (empty($params['path'])) @@ -753,17 +928,26 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa $this->cssLoader->add($params['id'], $params['path'], isset($params['version']) ? $params['version'] : 0, (int)@$params['order'], (bool)@$params['template']); } + /** + * The "get_combined_scripts" function returns a placeholder for delayed + * CSS files combination and minification. + * + * @param array $params (unused) + */ function func_get_combined_css($params) { return self::COMBINED_CSS_TAG; } - - /** - * This function allows to declare a Smarty prefilter from a plugin, thus allowing - * it to modify template source before compilation and without changing core files + /** + * Declares a Smarty prefilter from a plugin, allowing it to modify template + * source before compilation and without changing core files. * They will be processed by weight ascending. - * http://www.smarty.net/manual/en/advanced.features.prefilters.php + * @see http://www.smarty.net/manual/en/advanced.features.prefilters.php + * + * @param string $handle + * @param Callable $callback + * @param int $weight */ function set_prefilter($handle, $callback, $weight=50) { @@ -771,22 +955,40 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa ksort($this->external_filters[$handle]); } + /** + * Declares a Smarty postfilter. + * They will be processed by weight ascending. + * @see http://www.smarty.net/manual/en/advanced.features.postfilters.php + * + * @param string $handle + * @param Callable $callback + * @param int $weight + */ function set_postfilter($handle, $callback, $weight=50) { $this->external_filters[$handle][$weight][] = array('post', $callback); ksort($this->external_filters[$handle]); } + /** + * Declares a Smarty outputfilter. + * They will be processed by weight ascending. + * @see http://www.smarty.net/manual/en/advanced.features.outputfilters.php + * + * @param string $handle + * @param Callable $callback + * @param int $weight + */ function set_outputfilter($handle, $callback, $weight=50) { $this->external_filters[$handle][$weight][] = array('output', $callback); ksort($this->external_filters[$handle]); } - /** - * This function actually triggers the filters on the tpl files. - * Called in the parse method. - * http://www.smarty.net/manual/en/advanced.features.prefilters.php + /** + * Register the filters for the tpl file. + * + * @param string $handle */ function load_external_filters($handle) { @@ -806,6 +1008,11 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa } } + /** + * Unregister the filters for the tpl file. + * + * @param string $handle + */ function unload_external_filters($handle) { if (isset($this->external_filters[$handle])) @@ -821,6 +1028,13 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa } } + /** + * @toto : description of Template::prefilter_white_space + * + * @param string $source + * @param Smarty $smarty + * @param return string + */ static function prefilter_white_space($source, $smarty) { $ld = $smarty->left_delimiter; @@ -845,7 +1059,11 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa } /** - * Smarty postfilter + * Postfilter used when $conf['compiled_template_cache_language'] is true. + * + * @param string $source + * @param Smarty $smarty + * @param return string */ static function postfilter_language($source, $smarty) { @@ -857,6 +1075,13 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa return $source; } + /** + * Prefilter used to add theme local CSS files. + * + * @param string $source + * @param Smarty $smarty + * @param return string + */ static function prefilter_local_css($source, $smarty) { $css = array(); @@ -882,6 +1107,12 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa return $source; } + /** + * Loads the configuration file from a theme directory and returns it. + * + * @param string $dir + * @return array + */ function load_themeconf($dir) { global $themeconfs, $conf; @@ -897,16 +1128,31 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa return $themeconfs[$dir]; } + /** + * Registers a button to be displayed on picture page. + * + * @param string $content + * @param int $rank + */ function add_picture_button($content, $rank=BUTTONS_RANK_NEUTRAL) { $this->picture_buttons[$rank][] = $content; } + /** + * Registers a button to be displayed on index pages. + * + * @param string $content + * @param int $rank + */ function add_index_button($content, $rank=BUTTONS_RANK_NEUTRAL) { $this->index_buttons[$rank][] = $content; } + /** + * Assigns PLUGIN_PICTURE_BUTTONS template variable with registered picture buttons. + */ function parse_picture_buttons() { if (!empty($this->picture_buttons)) @@ -921,6 +1167,9 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa } } + /** + * Assigns PLUGIN_INDEX_BUTTONS template variable with registered index buttons. + */ function parse_index_buttons() { if (!empty($this->index_buttons)) @@ -934,7 +1183,6 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa )); } } - } |