123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- <?php
- /**
- * SmartTemplate Class
- *
- * 'Compiles' HTML-Templates to PHP Code
- *
- *
- * Usage Example I:
- *
- * $page = new SmartTemplate( "template.html" );
- * $page->assign( 'TITLE', 'TemplateDemo - Userlist' );
- * $page->assign( 'user', DB_read_all( 'select * from ris_user' ) );
- * $page->output();
- *
- * Usage Example II:
- *
- * $data = array(
- * 'TITLE' => 'TemplateDemo - Userlist',
- * 'user' => DB_read_all( 'select * from ris_user' )
- * );
- * $page = new SmartTemplate( "template.html" );
- * $page->output( $data );
- *
- *
- * @author Philipp v. Criegern philipp@criegern.com
- * @author Manuel 'EndelWar' Dalla Lana endelwar@aregar.it
- * @version 1.2.1 03.07.2006
- *
- * CVS ID: $Id: class.smarttemplate.php 2504 2011-12-28 07:35:29Z liu21st $
- */
- class SmartTemplate
- {
- /**
- * Whether to store compiled php code or not (for debug purpose)
- *
- * @access public
- */
- var $reuse_code = true;
- /**
- * Directory where all templates are stored
- * Can be overwritten by global configuration array $_CONFIG['template_dir']
- *
- * @access public
- */
- var $template_dir = 'templates/';
- /**
- * Where to store compiled templates
- * Can be overwritten by global configuration array $_CONFIG['smarttemplate_compiled']
- *
- * @access public
- */
- var $temp_dir = 'templates_c/';
- /**
- * Temporary folder for output cache storage
- * Can be overwritten by global configuration array $_CONFIG['smarttemplate_cache']
- *
- * @access public
- */
- var $cache_dir = 'templates_c/';
- /**
- * Default Output Cache Lifetime in Seconds
- * Can be overwritten by global configuration array $_CONFIG['cache_lifetime']
- *
- * @access public
- */
- var $cache_lifetime = 600;
- /**
- * Temporary file for output cache storage
- *
- * @access private
- */
- var $cache_filename;
- /**
- * The template filename
- *
- * @access private
- */
- var $tpl_file;
- /**
- * The compiled template filename
- *
- * @access private
- */
- var $cpl_file;
- /**
- * Template content array
- *
- * @access private
- */
- var $data = array();
- /**
- * Parser Class
- *
- * @access private
- */
- var $parser;
- /**
- * Debugger Class
- *
- * @access private
- */
- var $debugger;
- /**
- * SmartTemplate Constructor
- *
- * @access public
- * @param string $template_filename Template Filename
- */
- function SmartTemplate ( $template_filename = '' )
- {
- global $_CONFIG;
- if (!empty($_CONFIG['smarttemplate_compiled']))
- {
- $this->temp_dir = $_CONFIG['smarttemplate_compiled'];
- }
- if (!empty($_CONFIG['smarttemplate_cache']))
- {
- $this->cache_dir = $_CONFIG['smarttemplate_cache'];
- }
- if (is_numeric($_CONFIG['cache_lifetime']))
- {
- $this->cache_lifetime = $_CONFIG['cache_lifetime'];
- }
- if (!empty($_CONFIG['template_dir']) && is_file($_CONFIG['template_dir'] . '/' . $template_filename))
- {
- $this->template_dir = $_CONFIG['template_dir'];
- }
- $this->tpl_file = $template_filename;
- }
- // DEPRECATED METHODS
- // Methods used in older parser versions, soon will be removed
- function set_templatefile ($template_filename) { $this->tpl_file = $template_filename; }
- function add_value ($name, $value ) { $this->assign($name, $value); }
- function add_array ($name, $value ) { $this->append($name, $value); }
- /**
- * Assign Template Content
- *
- * Usage Example:
- * $page->assign( 'TITLE', 'My Document Title' );
- * $page->assign( 'userlist', array(
- * array( 'ID' => 123, 'NAME' => 'John Doe' ),
- * array( 'ID' => 124, 'NAME' => 'Jack Doe' ),
- * );
- *
- * @access public
- * @param string $name Parameter Name
- * @param mixed $value Parameter Value
- * @desc Assign Template Content
- */
- function assign ( $name, $value = '' )
- {
- if (is_array($name))
- {
- foreach ($name as $k => $v)
- {
- $this->data[$k] = $v;
- }
- }
- else
- {
- $this->data[$name] = $value;
- }
- }
- /**
- * Assign Template Content
- *
- * Usage Example:
- * $page->append( 'userlist', array( 'ID' => 123, 'NAME' => 'John Doe' ) );
- * $page->append( 'userlist', array( 'ID' => 124, 'NAME' => 'Jack Doe' ) );
- *
- * @access public
- * @param string $name Parameter Name
- * @param mixed $value Parameter Value
- * @desc Assign Template Content
- */
- function append ( $name, $value )
- {
- if (is_array($value))
- {
- $this->data[$name][] = $value;
- }
- elseif (!is_array($this->data[$name]))
- {
- $this->data[$name] .= $value;
- }
- }
- /**
- * Parser Wrapper
- * Returns Template Output as a String
- *
- * @access public
- * @param array $_top Content Array
- * @return string Parsed Template
- * @desc Output Buffer Parser Wrapper
- */
- function result ( $_top = '' )
- {
- ob_start();
- $this->output( $_top );
- $result = ob_get_contents();
- ob_end_clean();
- return $result;
- }
- /**
- * Execute parsed Template
- * Prints Parsing Results to Standard Output
- *
- * @access public
- * @param array $_top Content Array
- * @desc Execute parsed Template
- */
- function output ( $_top = '' )
- {
- global $_top;
- // Make sure that folder names have a trailing '/'
- if (strlen($this->template_dir) && substr($this->template_dir, -1) != '/')
- {
- $this->template_dir .= '/';
- }
- if (strlen($this->temp_dir) && substr($this->temp_dir, -1) != '/')
- {
- $this->temp_dir .= '/';
- }
- // Prepare Template Content
- if (!is_array($_top))
- {
- if (strlen($_top))
- {
- $this->tpl_file = $_top;
- }
- $_top = $this->data;
- }
- $_obj = &$_top;
- $_stack_cnt = 0;
- $_stack[$_stack_cnt++] = $_obj;
- // Check if template is already compiled
- $cpl_file_name = preg_replace('/[:\/.\\\\]/', '_', $this->tpl_file);
- if (strlen($cpl_file_name) > 0)
- {
- $this->cpl_file = $this->temp_dir . $cpl_file_name . '.php';
- $compile_template = true;
- if ($this->reuse_code)
- {
- if (is_file($this->cpl_file))
- {
- if ($this->mtime($this->cpl_file) > $this->mtime($this->template_dir . $this->tpl_file))
- {
- $compile_template = false;
- }
- }
- }
- if ($compile_template)
- {
- if (@include_once("class.smarttemplateparser.php"))
- {
- $this->parser = new SmartTemplateParser($this->template_dir . $this->tpl_file);
- if (!$this->parser->compile($this->cpl_file))
- {
- exit( "SmartTemplate Parser Error: " . $this->parser->error );
- }
- }
- else
- {
- exit( "SmartTemplate Error: Cannot find class.smarttemplateparser.php; check SmartTemplate installation");
- }
- }
- // Execute Compiled Template
- include($this->cpl_file);
- }
- else
- {
- exit( "SmartTemplate Error: You must set a template file name");
- }
- // Delete Global Content Array in order to allow multiple use of SmartTemplate class in one script
- unset ($_top);
- }
- /**
- * Debug Template
- *
- * @access public
- * @param array $_top Content Array
- * @desc Debug Template
- */
- function debug ( $_top = '' )
- {
- // Prepare Template Content
- if (!$_top)
- {
- $_top = $this->data;
- }
- if (@include_once("class.smarttemplatedebugger.php"))
- {
- $this->debugger = new SmartTemplateDebugger($this->template_dir . $this->tpl_file);
- $this->debugger->start($_top);
- }
- else
- {
- exit( "SmartTemplate Error: Cannot find class.smarttemplatedebugger.php; check SmartTemplate installation");
- }
- }
- /**
- * Start Ouput Content Buffering
- *
- * Usage Example:
- * $page = new SmartTemplate('template.html');
- * $page->use_cache();
- * ...
- *
- * @access public
- * @desc Output Cache
- */
- function use_cache ( $key = '' )
- {
- if (empty($_POST))
- {
- $this->cache_filename = $this->cache_dir . 'cache_' . md5($_SERVER['REQUEST_URI'] . serialize($key)) . '.ser';
- if (($_SERVER['HTTP_CACHE_CONTROL'] != 'no-cache') && ($_SERVER['HTTP_PRAGMA'] != 'no-cache') && @is_file($this->cache_filename))
- {
- if ((time() - filemtime($this->cache_filename)) < $this->cache_lifetime)
- {
- readfile($this->cache_filename);
- exit;
- }
- }
- ob_start( array( &$this, 'cache_callback' ) );
- }
- }
- /**
- * Output Buffer Callback Function
- *
- * @access private
- * @param string $output
- * @return string $output
- */
- function cache_callback ( $output )
- {
- if ($hd = @fopen($this->cache_filename, 'w'))
- {
- fputs($hd, $output);
- fclose($hd);
- }
- return $output;
- }
- /**
- * Determine Last Filechange Date (if File exists)
- *
- * @access private
- * @param string $filename
- * @return mixed
- * @desc Determine Last Filechange Date
- */
- function mtime ( $filename )
- {
- if (@is_file($filename))
- {
- $ret = filemtime($filename);
- return $ret;
- }
- }
- }
- ?>
|