Location: PHPKode > scripts > ctlTpl > ctltpl/ctl.tpl.class.php
<?php

/** 
 * ctlTpl template engine.
 * 
 * @package tv2-engine
 * @author Emilis Dambauskas (hide@address.com)
 * @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.
	}
	
	
}

?>
Return current item: ctlTpl