and Andrei Zmievski . * * The SquirrelMail (Foowd) template implementation. * Derived from the foowd template implementation and adapted * for squirrelmail * @copyright © 2005-2006 The SquirrelMail Project Team * @license http://opensource.org/licenses/gpl-license.php GNU Public License * @version $Id$ * @package squirrelmail */ /** * The SquirrelMail (Foowd) template class. * * Basic template class for capturing values and pluging them into a template. * This class uses a similar API to Smarty. * * @author Paul James * @author Monte Ohrt * @author Andrei Zmievski * @package squirrelmail */ class Template { /** * The templates values array * * @var array */ var $values = array(); /** * The template directory to use * * @var string */ var $template_dir = ''; /** * The default template directory * * @var string */ var $default_template_dir = 'templates/default/'; /** * Template files provided by this template set * * @var array */ var $templates_provided = array(); /** * Javascript files required by the template * * @var array */ var $required_js_files = array(); /** * Javascript files provided by the template. If a JS file is required, but * not provided, the js file by the same name will be included from the * default template directory. * * @var array */ var $provided_js_files = array(); /** * Additional stylesheets provided by the template. This allows template * authors to provide additional CSS sheets to templates while using the * default template set stylesheet for other definitions. */ var $additional_css_sheets = array(); /** * Constructor * * @param string $sTplDir where the template set is located */ function Template($sTplDir) { $this->template_dir = $sTplDir; // Pull in the tempalte config file if (!file_exists($this->template_dir . 'template.php')) { trigger_error('No template.php could be found in the requested template directory ("'.$this->template_dir.'")', E_USER_ERROR); } else { include ($this->template_dir . 'template.php'); $this->templates_provided = is_array($templates_provided) ? $templates_provided : array(); $this->required_js_files = is_array($required_js_files) ? $required_js_files : array(); $this->provided_js_files = is_array($provided_js_files) ? $provided_js_files: array(); $this->additional_css_sheets = is_array($additional_css_sheets) ? $additional_css_sheets : array(); } } /** * Assigns values to template variables * * @param array|string $tpl_var the template variable name(s) * @param mixed $value the value to assign */ function assign($tpl_var, $value = NULL) { if (is_array($tpl_var)) { foreach ($tpl_var as $key => $val) { if ($key != '') $this->values[$key] = $val; } } else { if ($tpl_var != '') $this->values[$tpl_var] = $value; } } /** * Assigns values to template variables by reference * * @param string $tpl_var the template variable name * @param mixed $value the referenced value to assign */ function assign_by_ref($tpl_var, &$value) { if ($tpl_var != '') $this->values[$tpl_var] = &$value; } /** * Appends values to template variables * * @param array|string $tpl_var the template variable name(s) * @param mixed $value the value to append * @param boolean $merge when $value is given as an array, * this indicates whether or not that * array itself should be appended as * a new template variable value or if * that array's values should be merged * into the existing array of template * variable values */ function append($tpl_var, $value = NULL, $merge = FALSE) { if (is_array($tpl_var)) { //FIXME: $tpl_var is supposed to be a list of template var names, // so we should be looking at the values NOT the keys! foreach ($tpl_var as $_key => $_val) { if ($_key != '') { if(isset($this->values[$_key]) && !is_array($this->values[$_key])) settype($this->values[$_key],'array'); //FIXME: we should be iterating the $value array here not the values of the // list of template variable names! I think this is totally broken // This might just be a matter of needing to clarify the method's API; // values may have been meant to be passed in $tpl_var in the case that // $tpl_var is an array. Ugly and non-intuitive. // PROPOSAL: API should be as such: // if (is_string($tpl_var)) then $values are added/merged as already done // if (is_array($tpl_var)) then $values is required to be an array whose // keys must match up with $tpl_var keys and // whose values are then what is added to // each template variable value (array or // strings, doesn't matter) if($merge && is_array($_val)) { foreach($_val as $_mkey => $_mval) $this->values[$_key][$_mkey] = $_mval; } else $this->values[$_key][] = $_val; } } } else { if ($tpl_var != '' && isset($value)) { if(isset($this->values[$tpl_var]) && !is_array($this->values[$tpl_var])) settype($this->values[$tpl_var],'array'); if($merge && is_array($value)) { foreach($value as $_mkey => $_mval) $this->values[$tpl_var][$_mkey] = $_mval; } else $this->values[$tpl_var][] = $value; } } } /** * Appends values to template variables by reference * * @param string $tpl_var the template variable name * @param mixed $value the referenced value to append * @param boolean $merge when $value is given as an array, * this indicates whether or not that * array itself should be appended as * a new template variable value or if * that array's values should be merged * into the existing array of template * variable values */ function append_by_ref($tpl_var, &$value, $merge = FALSE) { if ($tpl_var != '' && isset($value)) { if(!@is_array($this->values[$tpl_var])) settype($this->values[$tpl_var],'array'); if ($merge && is_array($value)) { foreach($value as $_key => $_val) $this->values[$tpl_var][$_key] = &$value[$_key]; } else $this->values[$tpl_var][] = &$value; } } /** * * Return the relative template directory path for this template set. * * @return string The relative path to the template directory based * from the main SquirrelMail directory (SM_PATH). * */ function get_template_file_directory() { //FIXME: temporarily parse off SM_PATH from the template dir class attribute until we can change the entire template subsystem such that the template dir is derived internally in this class from the template ID/name/attributes return substr($this->template_dir, strlen(SM_PATH)); return $this->template_dir; } /** * * Return the relative template directory path for the DEFAULT template set. * * @return string The relative path to the default template directory based * from the main SquirrelMail directory (SM_PATH). * */ function get_default_template_file_directory() { return $this->default_template_dir; } /** * * Find the right template file. * * Templates are expected to be found in the template set directory, * for example: * SM_PATH/templates/