<?php
/**
* ctlTpl template engine.
*
* @package tv2-engine
* @author Emilis Dambauskas (emilis@gildija.lt)
* @copyright 2002–2003 Emilis Dambauskas under {@link http://opensource.org/licenses/artistic-license.php Artistic license}
* @version $Id: ctlTpl.class.php,v 1.8 2004/05/13 08:21:52 lunaticlt Exp $
* @class ctlTpl
*
* @log 2003-07-07 Full code comments
* @log 2003-07-21 Added method loadLibrary()
* @log 2003-07-24 Added checking if templates exist by Linas Gricius linas(a)gricius.net
* @log 2003-08-04 Added method checkVars
* @log 2003-08-04 Fixed bug with quieting down fatal errors in methods process() and template().
* @log 2003-08-04 Fixed constructor comments
* @log 2004-05-13 Replaced variable extraction loops with extract(). Thanks Andrius Juozapaitis for noticing.
*/
class ctlTpl
{
/**
* Stores default temlpate directory name
* @attribute private string tpl_dir
*/
var $tpl_dir;
/**
* Stores PHP error reporting level while parsing
* @attribute private int e
*/
var $e;
/**
* Template variable storage
* @attribute private array vars
*/
var $vars;
/**
* Template filename
* @attribute private string file
*/
var $file;
/**
* Temporary variable used while parsing (stores var names).
* @attribute private string v
*/
var $v;
/**
* Temporary variable used while parsing (stores var values).
* @attribute private mixed k
*/
var $k;
/**
* Variable used to enable/disable checking if template exists or not.
* @attribute private boolean cie
*/
var $cie;
/**
* Constructor. Sets default template directory and clears vars array.
*
* @constructor ctlTpl
* @param optional string $td default template directory (default value './' -- current directory)
* @param optional boolean $cie enable checking if template exists or not
*/
function ctlTpl($td = './', $cie = FALSE)
{
$this->tpl_dir = $td;
$this->vars = array();
$this->cie = $cie;
}
/**
* Creates/changes template var value
*
* @method public setVar
* @param string $name variable name
* @param mixed $value variable value
*/
function setVar($name, $value)
{
$this->vars[$name] = $value;
}
/**
* Creates/changes multiple template variables
*
* @method public setVars
* @param array $array variable array. Format should be: array('varname1'=>'value1', 'varname2'=>'value2', ...).
*/
function setVars($array)
{
$this->vars = array_merge($this->vars, $array);
}
/**
* Registers a reference to an external variable as a tpl var:
*
* @method public regVar
* @param string $name variable name
* @param ref mixed $var variable reference
*/
function regVar($name, &$var)
{
$this->vars[$name] = &$var;
}
/**
* Clears a variable
*
* @method public unsetVar
* @param string $name variable name
*/
function unsetVar($name)
{
unset($this->vars[$name]);
}
/**
* Clears all stored template vars
*
* @method public clearVars
*/
function clearVars()
{
$this->vars = array();
}
/**
* Alias of {@link ctlTpl::clearVars}.
*
* @method public unsetAllVars
*/
function unsetAllVars()
{
return $this->clearVars();
}
/**
* Loads a function library
*
* @method public loadLibrary
* @param string $filename function library name
* @since 2003-07-21
*/
function loadLibrary($filename)
{
if (file_exists($filename) && is_file($filename))
require_once($filename);
else if (file_exists($this->tpl_dir.$filename) && is_file($this->tpl_dir.$filename))
require_once($this->tpl_dir.$filename);
}
/**
* Checks if template exists or not.
*
* @method private checkTpl
* @param string $filename function library name
*/
function checkTpl($filename)
{
if (file_exists($filename) && is_file($filename))
return true;
else
die('<p style="color: #CC0000"><strong>TPL error: '.$filename.'</strong> does not exist!<p>');
}
/**
* Checks if template var[s] exist
*
* @method public checkVars
* @return boolean TRUE if all vars exist, FALSE otherwise
* @param mixed $var_names variable name array or variable name string
*/
function checkVars($var_names)
{
$var_names = (array) $var_names;
foreach ($var_names as $vn)
if (!isset($this->vars[$vn]))
return FALSE;
return TRUE;
}
/**
* Parses the given template file and clears vars if needed.
*
* @method public process
* @return string output from template
* @param string $file template file name (relative to default template dir or absolute).
* @param optional boolean $clr_vars should the variables be cleared after parsing? Default: FALSE.
*/
function process($file, $clr_vars = FALSE)
{
// check if filename is absolute or relative
// (both for absolute unix and windows paths):
if ($file{0} == '.' || $file{0} == '/' || $file{1} == ':' || $file{0} == '\\')
$this->file = $file;
else
$this->file = $this->tpl_dir.$file;
unset($file);
// If enabled...
if ($this->cie)
$this->checkTpl($this->file);
// create vars from data array
extract($this->vars, EXTR_OVERWRITE);
$this->e = error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE); // quiet down warnings and notices:
ob_start(); // start output buffering:
require $this->file; // parse the file. Produces fatal error if file not found.
error_reporting($this->e); // restore previous error reporting level
$r = ob_get_contents(); // get parsed text
ob_end_clean(); // quietly end output buffering
// clear vars:
if ($clr_vars)
$this->vars = array();
return $r; // uh-oh what does this do? ;)
}
/**
* Includes the result from the template script that is
* being parsed now into template specified by $name.
* The result is stored in a variable specified by $myname.
* NOTICE: this method should be called AT THE END of any template script.
*
* @method public template
* @return string output from template
* @param string file template file name (relative to default template dir or absolute).
* @param optional string myname variable name for included text.
* @param optional boolean clr_vars should the variables be cleared after parsing? Default: FALSE.
*/
function template($file, $myname = 'include', $clr_vars = FALSE)
{
// check if filename is absolute or relative
// (both for absolute unix and windows paths):
if ($file{0} == '.' || $file{0} == '/' || $file{1} == ':' || $file{0} == '\\')
$this->file = $file;
else
$this->file = $this->tpl_dir.$file;
unset($file);
// create vars from data array
extract($this->vars, EXTR_OVERWRITE);
error_reporting($this->e); // restore previous error reporting level
$$myname = ob_get_contents(); // get parsed text
ob_end_clean(); // quietly end output buffering
$this->e = error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE); // quiet down warnings and notices:
ob_start(); // start output buffering:
require $this->file; // parse the file. Produces fatal error if file not found.
}
}
?>
|