Skip to content
tpl.inc.php 53.3 KiB
Newer Older
tbrehm's avatar
tbrehm committed
<?php
pedro_morgan's avatar
pedro_morgan committed
* vlibTemplate is a class used to seperate PHP and HTML.
* For instructions on how to use vlibTemplate, see the
* vlibTemplate.html file, located in the 'docs' directory.
*
* @since 07/03/2002
* @author Kelvin Jones <kelvin@kelvinjones.co.uk>
* @package vLIB
* @access public
* @see vlibTemplate.html
*/
tbrehm's avatar
tbrehm committed

/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 4.0                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 2002 Active Fish Group                                 |
// +----------------------------------------------------------------------+
// | Authors: Kelvin Jones <kelvin@kelvinjones.co.uk>                     |
// +----------------------------------------------------------------------+
//
// $Id: class.tpl.inc.php,v 1.1 2003/07/08 12:31:10 platinum Exp $

//** check and avoid multiple loading of class
tbrehm's avatar
tbrehm committed
if (!defined('vlibTemplateClassLoaded')) {
tbrehm's avatar
tbrehm committed
    define('vlibTemplateClassLoaded', 1);
   	include_once (ISPC_CLASS_PATH.'/tpl_error.inc.php');
   	include_once (ISPC_CLASS_PATH.'/tpl_ini.inc.php');
tbrehm's avatar
tbrehm committed

pedro_morgan's avatar
pedro_morgan committed
    class tpl{
    
        /*-----------------------------------------------------------------------------\
        |                                 ATTENTION                                    |
        |  Do not touch the following variables. vlibTemplate will not work otherwise. |
        \-----------------------------------------------------------------------------*/
        private $OPTIONS = array(
                'MAX_INCLUDES'          =>   10,
                'TEMPLATE_DIR'          => null,
                'GLOBAL_VARS'           => null,
                'GLOBAL_CONTEXT_VARS'   => null,
                'LOOP_CONTEXT_VARS'     => null,
                'SET_LOOP_VAR'          => null,
                'DEFAULT_ESCAPE'        => null,
                'STRICT'                => null,
                'CASELESS'              => null,
                'UNKNOWNS'              => null,
                'TIME_PARSE'            => null,
                'ENABLE_PHPINCLUDE'     => null,
                'INCLUDE_PATHS'         => array(),
                'CACHE_DIRECTORY'       => null,
                'CACHE_LIFETIME'        => null,
                'CACHE_EXTENSION'       => null
                );
tbrehm's avatar
tbrehm committed

        /** open and close tags used for escaping */
pedro_morgan's avatar
pedro_morgan committed
        private $ESCAPE_TAGS = array(
                'html'      => array('open' => 'htmlspecialchars('    ,'close'=> ', ENT_QUOTES)'),
                'url'       => array('open' => 'urlencode('           ,'close'=> ')'),
                'rawurl'    => array('open' => 'rawurlencode('        ,'close'=> ')'),
                'sq'        => array('open' => 'addcslashes('         ,'close'=> ", \"'\")"),
                'dq'        => array('open' => 'addcslashes('         ,'close'=> ", '\"')"),
                '1'         => array('open' => 'htmlspecialchars('    ,'close'=> ', ENT_QUOTES)'),
                '0'         => array('open' => ''                     ,'close'=> ''),
                'none'      => array('open' => ''                     ,'close'=> ''),
                'hex'       => array('open' => '$this->_escape_hex('  ,'close'=> ', false)'),
                'hexentity' => array('open' => '$this->_escape_hex('  ,'close'=> ', true)')
                );
    
tbrehm's avatar
tbrehm committed
        /** open and close tags used for formatting */
pedro_morgan's avatar
pedro_morgan committed
        private $FORMAT_TAGS = array(
                'strtoupper' => array('open' => 'strtoupper(',          'close'=> ')'),
                'uc'         => array('open' => 'strtoupper(',          'close'=> ')'),
                'strtolower' => array('open' => 'strtolower(',          'close'=> ')'),
                'lc'         => array('open' => 'strtolower(',          'close'=> ')'),
                'ucfirst'    => array('open' => 'ucfirst(',             'close'=> ')'),
                'lcucfirst'  => array('open' => 'ucfirst(strtolower(',  'close'=> '))'),
                'ucwords'    => array('open' => 'ucwords(',             'close'=> ')'),
                'lcucwords'  => array('open' => 'ucwords(strtolower(',  'close'=> '))')
                );
tbrehm's avatar
tbrehm committed

        /** operators allowed when using extended TMPL_IF syntax */
pedro_morgan's avatar
pedro_morgan committed
        private $allowed_if_ops = array('==','!=','<>','<','>','<=','>=');
    
tbrehm's avatar
tbrehm committed
        /** dbs allowed by vlibTemplate::setDbLoop(). */
pedro_morgan's avatar
pedro_morgan committed
        private $allowed_loop_dbs = array('MYSQL','POSTGRESQL','INFORMIX','INTERBASE','INGRES',
                                        'MSSQL','MSQL','OCI8','ORACLE','OVRIMOS','SYBASE');
    
tbrehm's avatar
tbrehm committed
        /** root directory of vlibTemplate automagically filled in */
pedro_morgan's avatar
pedro_morgan committed
        private $VLIBTEMPLATE_ROOT = null;
    
tbrehm's avatar
tbrehm committed
        /** contains current directory used when doing recursive include */
pedro_morgan's avatar
pedro_morgan committed
        private $_currentincludedir = array();
    
tbrehm's avatar
tbrehm committed
        /** current depth of includes */
pedro_morgan's avatar
pedro_morgan committed
        private $_includedepth = 0;
    
tbrehm's avatar
tbrehm committed
        /** full path to tmpl file */
pedro_morgan's avatar
pedro_morgan committed
        private $_tmplfilename = null;
    
tbrehm's avatar
tbrehm committed
        /** file data before it's parsed */
pedro_morgan's avatar
pedro_morgan committed
        private $_tmplfile = null;
    
tbrehm's avatar
tbrehm committed
        /** parsed version of file, ready for eval()ing */
pedro_morgan's avatar
pedro_morgan committed
        private $_tmplfilep = null;
    
tbrehm's avatar
tbrehm committed
        /** eval()ed version ready for printing or whatever */
pedro_morgan's avatar
pedro_morgan committed
        private $_tmploutput = null;
    
tbrehm's avatar
tbrehm committed
        /** array for variables to be kept */
pedro_morgan's avatar
pedro_morgan committed
        private $_vars = array();
    
tbrehm's avatar
tbrehm committed
        /** array where loop variables are kept */
pedro_morgan's avatar
pedro_morgan committed
        private $_arrvars = array();
tbrehm's avatar
tbrehm committed

        /** array which holds the current namespace during parse */
pedro_morgan's avatar
pedro_morgan committed
        private $_namespace = array();
    
tbrehm's avatar
tbrehm committed
        /** variable is set to true once the template is parsed, to save re-parsing everything */
pedro_morgan's avatar
pedro_morgan committed
        private $_parsed = false;
    
tbrehm's avatar
tbrehm committed
        /** array holds all unknowns vars */
pedro_morgan's avatar
pedro_morgan committed
        private $_unknowns = array();
    
tbrehm's avatar
tbrehm committed
        /** microtime when template parsing began */
pedro_morgan's avatar
pedro_morgan committed
        private $_firstparsetime = null;
    
tbrehm's avatar
tbrehm committed
        /** total time taken to parse template */
pedro_morgan's avatar
pedro_morgan committed
        private $_totalparsetime = null;
    
tbrehm's avatar
tbrehm committed
        /** name of current loop being passed in */
pedro_morgan's avatar
pedro_morgan committed
        private $_currloopname = null;
    
tbrehm's avatar
tbrehm committed
        /** rows with the above loop */
pedro_morgan's avatar
pedro_morgan committed
        private $_currloop = array();
    
tbrehm's avatar
tbrehm committed
        /** define vars to avoid warnings */
pedro_morgan's avatar
pedro_morgan committed
        private $_debug = null;
        private $_cache = null;
tbrehm's avatar
tbrehm committed
        
        /** array which holds the dynamic Includes */
pedro_morgan's avatar
pedro_morgan committed
        private $_dyninclude = array();

        /*-----------------------------------------------------------------------------\
        |                           public functions                                   |
        \-----------------------------------------------------------------------------*/
		    
tbrehm's avatar
tbrehm committed
		
        /**
         * Usually called by the class constructor.
         * Stores the filename in $this->_tmplfilename.
         * Raises an error if the template file is not found.
         * @param string $tmplfile full path to template file
         * @return boolean true
         * @access public
         */
pedro_morgan's avatar
pedro_morgan committed
        public function newTemplate($tmplfile)
        {
            if (!$tfile = $this->_fileSearch($tmplfile)){
                vlibTemplateError::raiseError('VT_ERROR_NOFILE', KILL, $tmplfile);
            }
tbrehm's avatar
tbrehm committed

pedro_morgan's avatar
pedro_morgan committed
            //* make sure that any parsing vars are cleared for the new template
tbrehm's avatar
tbrehm committed
            $this->_tmplfile = null;
            $this->_tmplfilep = null;
            $this->_tmploutput = null;
            $this->_parsed = false;
            $this->_unknowns = array();
            $this->_firstparsetime = null;
            $this->_totalparsetime = null;

pedro_morgan's avatar
pedro_morgan committed
            //* reset debug module
            if ($this->_debug){
                $this->_debugReset();
            }
tbrehm's avatar
tbrehm committed
            $this->_tmplfilename = $tfile;
            return true;
        }

        /**
         * Sets variables to be used by the template
         * If $k is an array, then it will treat it as an associative array
         * using the keys as variable names and the values as variable values.
         * @param mixed $k key to define variable name
         * @param mixed $v variable to assign to $k
         * @return boolean true/false
         * @access public
         */
pedro_morgan's avatar
pedro_morgan committed
        public function setVar($k, $v = null)
        {
tbrehm's avatar
tbrehm committed
            if (is_array($k)) {
                foreach($k as $key => $value){
                    $key = ($this->OPTIONS['CASELESS']) ? strtolower(trim($key)) : trim($key);
                    if (preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $key) && $value !== null ) {
                        $this->_vars[$key] = $value;
                    }
                }
pedro_morgan's avatar
pedro_morgan committed
            } else {
tbrehm's avatar
tbrehm committed
                if (preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $k) && $v !== null) {
Loading full blame...