squirrelmail/class/template/PHP_Template.class.php
2013-07-26 17:31:02 +00:00

268 lines
8.4 KiB
PHP

<?php
/**
* Copyright 2003, Paul James
*
* This file contains some methods from the Smarty templating engine version
* 2.5.0 by Monte Ohrt <monte@ispi.net> and Andrei Zmievski <andrei@php.net>.
*
* The SquirrelMail (Foowd) template implementation.
* Derived from the foowd template implementation and adapted
* for squirrelmail
* @copyright 2005-2013 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id$
* @package squirrelmail
*
*/
/**
* The SquirrelMail PHP Template class. Extends the base
* Template class for use with PHP template pages.
*
* @author Paul James
* @author Monte Ohrt <monte at ispi.net>
* @author Andrei Zmievski <andrei at php.net>
* @author Paul Lesniewski <paul at squirrelmail.org>
* @package squirrelmail
*
*/
class PHP_Template extends Template
{
/**
* The templates values array
*
* @var array
*
*/
var $values = array();
/**
* Constructor
*
* Please do not call directly. Use Template::construct_template().
*
* @param string $template_id the template ID
*
*/
function PHP_Template($template_id) {
//FIXME: find a way to test that this is ONLY ever called
// from parent's construct_template() method (I doubt it
// is worth the trouble to parse the current stack trace)
// if (???)
// trigger_error('Please do not use default PHP_Template() constructor. Instead, use Template::construct_template().', E_USER_ERROR);
parent::Template($template_id);
}
/**
* Assigns values to template variables
*
* @param array|string $tpl_var the template variable name(s)
* @param mixed $value the value to assign
FIXME: Proposed idea to add a parameter here that turns variable
encoding on, so that we can make sure output is always
run through something like sm_encode_html_special_chars() (maybe even nl2br()?)
*
*/
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
FIXME: Proposed idea to add a parameter here that turns variable
encoding on, so that we can make sure output is always
run through something like sm_encode_html_special_chars() (maybe even nl2br()?)
*
*/
function assign_by_ref($tpl_var, &$value) {
if ($tpl_var != '')
$this->values[$tpl_var] = &$value;
}
/**
* Clears the values of all assigned varaiables.
*
*/
function clear_all_assign() {
$this->values = array();
}
/**
* Returns assigned variable value(s).
*
* @param string $varname If given, the value of that variable
* is returned, assuming it has been
* previously assigned. If not specified
* an array of all assigned variables is
* returned. (optional)
*
* @return mixed Desired single variable value or list of all
* assigned variable values.
*
*/
function get_template_vars($varname=NULL) {
// just looking for one value
//
if (!empty($varname)) {
if (!empty($this->values[$varname]))
return $this->values[$varname];
else
// FIXME: this OK? What does Smarty do?
return NULL;
}
// return all variable values
//
return $this->values;
}
/**
* 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
FIXME: Proposed idea to add a parameter here that turns variable
encoding on, so that we can make sure output is always
run through something like sm_encode_html_special_chars() (maybe even nl2br()?)
*
*/
function append($tpl_var, $value = NULL, $merge = FALSE)
{
if (is_array($tpl_var))
{
foreach ($tpl_var as $_key => $_val)
{
if ($_key != '')
{
if(isset($this->values[$_key]) && !is_array($this->values[$_key]))
settype($this->values[$_key],'array');
if($merge && is_array($_val))
{
// FIXME: Tentative testing seems to indicate that
// this does not mirror Smarty behavior; Smarty
// seems to append the full array as a new element
// instead of merging, so this behavior is technically
// more "correct", but Smarty seems to differ
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
FIXME: Proposed idea to add a parameter here that turns variable
encoding on, so that we can make sure output is always
run through something like sm_encode_html_special_chars() (maybe even nl2br()?)
*
*/
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;
}
}
/**
* Applys the template and generates final output destined
* for the user's browser
*
* @param string $filepath The full file path to the template to be applied
*
* @return string The output for the given template
*
*/
function apply_template($filepath) {
// place values array directly in scope
// ($t? let's try to be more verbose please :-) )
//
$t = &$this->values;
ob_start();
include($filepath);
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
}