2001-07-24 11:39:00 +00:00
< ? php
2007-10-04 12:03:05 +00:00
/**
2005-04-09 12:26:45 +00:00
*
* @ package phpBB3
* @ version $Id $
2005-10-02 17:49:16 +00:00
* @ copyright ( c ) 2005 phpBB Group , sections ( c ) 2001 ispi of Lincoln Inc
2007-10-04 12:03:05 +00:00
* @ license http :// opensource . org / licenses / gpl - license . php GNU Public License
2005-04-09 12:26:45 +00:00
*
2002-07-14 14:33:30 +00:00
*/
2001-07-24 11:39:00 +00:00
2006-03-19 14:23:21 +00:00
/**
2007-10-04 12:03:05 +00:00
* @ ignore
2006-03-19 14:23:21 +00:00
*/
if ( ! defined ( 'IN_PHPBB' ))
{
exit ;
}
2005-04-09 12:26:45 +00:00
/**
2006-04-17 13:09:50 +00:00
* Base Template class .
2006-06-13 21:06:29 +00:00
* @ package phpBB3
2005-04-09 12:26:45 +00:00
*/
2003-07-13 15:13:59 +00:00
class template
2003-04-23 14:55:13 +00:00
{
2006-04-29 17:19:24 +00:00
/** variable that holds all the data we ' ll be substituting into
* the compiled templates . Takes form :
2006-12-23 18:27:15 +00:00
* --> $this -> _tpldata [ block ][ iteration #][child][iteration#][child2][iteration#][variablename] == value
2006-04-29 17:19:24 +00:00
* if it 's a root-level variable, it' ll be like this :
* --> $this -> _tpldata [ . ][ 0 ][ varname ] == value
*/
2006-12-23 18:27:15 +00:00
var $_tpldata = array ( '.' => array ( 0 => array ()));
var $_rootref ;
2001-08-30 22:20:23 +00:00
2002-07-14 14:33:30 +00:00
// Root dir and hash of filenames for each template handle.
2002-06-22 11:48:10 +00:00
var $root = '' ;
2003-07-17 15:16:25 +00:00
var $cachepath = '' ;
2002-07-14 14:33:30 +00:00
var $files = array ();
2007-07-09 18:27:57 +00:00
var $filename = array ();
2008-07-28 14:24:37 +00:00
var $files_inherit = array ();
var $files_template = array ();
var $inherit_root = '' ;
2009-07-25 10:16:13 +00:00
var $orig_tpl_storedb ;
var $orig_tpl_inherits_id ;
2001-08-30 22:20:23 +00:00
2002-07-14 14:33:30 +00:00
// this will hash handle names to the compiled/uncompiled code for that handle.
2001-07-24 11:39:00 +00:00
var $compiled_code = array ();
2001-08-30 22:20:23 +00:00
2005-12-04 20:25:51 +00:00
/**
* Set template location
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2006-04-29 17:19:24 +00:00
function set_template ()
2001-07-24 11:39:00 +00:00
{
2006-09-14 14:57:29 +00:00
global $phpbb_root_path , $user ;
2003-03-18 14:58:07 +00:00
2005-12-22 16:28:27 +00:00
if ( file_exists ( $phpbb_root_path . 'styles/' . $user -> theme [ 'template_path' ] . '/template' ))
2003-07-13 15:13:59 +00:00
{
2006-04-14 15:10:51 +00:00
$this -> root = $phpbb_root_path . 'styles/' . $user -> theme [ 'template_path' ] . '/template' ;
2008-09-26 13:09:56 +00:00
$this -> cachepath = $phpbb_root_path . 'cache/tpl_' . str_replace ( '_' , '-' , $user -> theme [ 'template_path' ]) . '_' ;
2009-07-25 10:16:13 +00:00
if ( $this -> orig_tpl_storedb === null )
2009-07-24 08:47:10 +00:00
{
$this -> orig_tpl_storedb = $user -> theme [ 'template_storedb' ];
}
2009-07-25 10:16:13 +00:00
if ( $this -> orig_tpl_inherits_id === null )
2009-07-24 08:47:10 +00:00
{
$this -> orig_tpl_inherits_id = $user -> theme [ 'template_inherits_id' ];
}
2009-07-25 10:16:13 +00:00
2009-07-24 08:47:10 +00:00
$user -> theme [ 'template_storedb' ] = $this -> orig_tpl_storedb ;
$user -> theme [ 'template_inherits_id' ] = $this -> orig_tpl_inherits_id ;
2009-06-19 22:07:27 +00:00
2008-07-28 14:24:37 +00:00
if ( $user -> theme [ 'template_inherits_id' ])
{
$this -> inherit_root = $phpbb_root_path . 'styles/' . $user -> theme [ 'template_inherit_path' ] . '/template' ;
}
2003-07-13 15:13:59 +00:00
}
2006-06-21 16:52:10 +00:00
else
{
trigger_error ( 'Template path could not be found: styles/' . $user -> theme [ 'template_path' ] . '/template' , E_USER_ERROR );
}
2001-07-24 11:39:00 +00:00
2006-12-23 18:27:15 +00:00
$this -> _rootref = & $this -> _tpldata [ '.' ][ 0 ];
2001-07-24 11:39:00 +00:00
return true ;
}
2005-12-04 20:25:51 +00:00
/**
* Set custom template location ( able to use directory outside of phpBB )
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2009-09-16 08:11:52 +00:00
function set_custom_template ( $template_path , $template_name , $template_mode = 'template' )
2005-10-09 17:59:27 +00:00
{
2009-07-24 08:47:10 +00:00
global $phpbb_root_path , $user ;
2005-10-09 17:59:27 +00:00
2009-08-20 14:53:25 +00:00
// Make sure $template_path has no ending slash
if ( substr ( $template_path , - 1 ) == '/' )
{
$template_path = substr ( $template_path , 0 , - 1 );
}
2005-10-09 17:59:27 +00:00
$this -> root = $template_path ;
2008-09-26 13:09:56 +00:00
$this -> cachepath = $phpbb_root_path . 'cache/ctpl_' . str_replace ( '_' , '-' , $template_name ) . '_' ;
2009-09-16 08:11:52 +00:00
// As the template-engine is used for more than the template (emails, etc.), we should not set $user->theme in all cases, but only on the real template.
if ( $template_mode == 'template' )
{
$user -> theme [ 'template_storedb' ] = false ;
$user -> theme [ 'template_inherits_id' ] = false ;
}
2006-06-11 18:13:52 +00:00
2009-07-21 10:58:31 +00:00
$this -> _rootref = & $this -> _tpldata [ '.' ][ 0 ];
2005-10-09 17:59:27 +00:00
return true ;
}
2005-12-04 20:25:51 +00:00
/**
* Sets the template filenames for handles . $filename_array
* should be a hash of handle => filename pairs .
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2001-08-30 22:20:23 +00:00
function set_filenames ( $filename_array )
2001-07-24 11:39:00 +00:00
{
2002-11-07 23:21:14 +00:00
if ( ! is_array ( $filename_array ))
2001-07-24 11:39:00 +00:00
{
2001-08-30 22:20:23 +00:00
return false ;
2001-07-24 11:39:00 +00:00
}
2002-11-07 23:21:14 +00:00
foreach ( $filename_array as $handle => $filename )
2001-07-24 11:39:00 +00:00
{
2002-11-07 23:21:14 +00:00
if ( empty ( $filename ))
2002-07-14 14:33:30 +00:00
{
2006-04-29 17:19:24 +00:00
trigger_error ( " template->set_filenames: Empty filename specified for $handle " , E_USER_ERROR );
2002-07-14 14:33:30 +00:00
}
2002-06-22 11:48:10 +00:00
$this -> filename [ $handle ] = $filename ;
2003-07-13 15:13:59 +00:00
$this -> files [ $handle ] = $this -> root . '/' . $filename ;
2009-06-19 22:07:27 +00:00
2008-07-28 14:24:37 +00:00
if ( $this -> inherit_root )
{
$this -> files_inherit [ $handle ] = $this -> inherit_root . '/' . $filename ;
}
2001-07-24 11:39:00 +00:00
}
2009-06-19 22:07:27 +00:00
2001-07-24 11:39:00 +00:00
return true ;
}
2005-12-04 20:25:51 +00:00
/**
* Destroy template data set
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2002-07-14 14:33:30 +00:00
function destroy ()
{
2006-12-23 18:27:15 +00:00
$this -> _tpldata = array ( '.' => array ( 0 => array ()));
2002-07-14 14:33:30 +00:00
}
2006-05-25 19:15:04 +00:00
/**
* Reset / empty complete block
2006-08-22 21:26:06 +00:00
* @ access public
2006-05-25 19:15:04 +00:00
*/
function destroy_block_vars ( $blockname )
{
if ( strpos ( $blockname , '.' ) !== false )
{
// Nested block.
$blocks = explode ( '.' , $blockname );
$blockcount = sizeof ( $blocks ) - 1 ;
$str = & $this -> _tpldata ;
for ( $i = 0 ; $i < $blockcount ; $i ++ )
{
$str = & $str [ $blocks [ $i ]];
$str = & $str [ sizeof ( $str ) - 1 ];
}
unset ( $str [ $blocks [ $blockcount ]]);
}
else
{
// Top-level block.
unset ( $this -> _tpldata [ $blockname ]);
}
return true ;
}
2005-12-04 20:25:51 +00:00
/**
* Display handle
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2004-01-10 12:23:24 +00:00
function display ( $handle , $include_once = true )
2002-07-14 14:33:30 +00:00
{
2007-09-22 19:18:13 +00:00
global $user , $phpbb_hook ;
2007-10-04 12:03:05 +00:00
if ( ! empty ( $phpbb_hook ) && $phpbb_hook -> call_hook ( array ( __CLASS__ , __FUNCTION__ ), $handle , $include_once ))
2007-09-22 19:18:13 +00:00
{
2007-09-23 14:14:49 +00:00
if ( $phpbb_hook -> hook_return ( array ( __CLASS__ , __FUNCTION__ )))
2007-09-22 19:18:13 +00:00
{
2007-09-23 14:14:49 +00:00
return $phpbb_hook -> hook_return_result ( array ( __CLASS__ , __FUNCTION__ ));
2007-09-22 19:18:13 +00:00
}
}
2002-06-22 11:48:10 +00:00
2007-08-17 21:29:20 +00:00
if ( defined ( 'IN_ERROR_HANDLER' ))
{
if (( E_NOTICE & error_reporting ()) == E_NOTICE )
{
error_reporting ( error_reporting () ^ E_NOTICE );
}
}
2003-04-23 14:55:13 +00:00
if ( $filename = $this -> _tpl_load ( $handle ))
{
2004-01-10 12:23:24 +00:00
( $include_once ) ? include_once ( $filename ) : include ( $filename );
2003-04-23 14:55:13 +00:00
}
else
{
eval ( ' ?>' . $this -> compiled_code [ $handle ] . '<?php ' );
2002-06-22 11:48:10 +00:00
}
2002-07-14 14:33:30 +00:00
2001-07-24 11:39:00 +00:00
return true ;
}
2001-08-30 22:20:23 +00:00
2005-12-04 20:25:51 +00:00
/**
2006-06-11 18:13:52 +00:00
* Display the handle and assign the output to a template variable or return the compiled result .
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2006-04-17 13:09:50 +00:00
function assign_display ( $handle , $template_var = '' , $return_content = true , $include_once = false )
2005-12-04 20:25:51 +00:00
{
ob_start ();
$this -> display ( $handle , $include_once );
2005-12-05 18:52:23 +00:00
$contents = ob_get_clean ();
2005-12-04 20:25:51 +00:00
if ( $return_content )
{
return $contents ;
}
$this -> assign_var ( $template_var , $contents );
2006-06-11 18:13:52 +00:00
2005-12-04 20:25:51 +00:00
return true ;
}
2009-06-19 22:07:27 +00:00
2005-12-04 20:25:51 +00:00
/**
* Load a compiled template if possible , if not , recompile it
2006-08-22 21:26:06 +00:00
* @ access private
2005-12-04 20:25:51 +00:00
*/
2003-04-23 14:55:13 +00:00
function _tpl_load ( & $handle )
2001-07-24 11:39:00 +00:00
{
2005-12-04 20:25:51 +00:00
global $user , $phpEx , $config ;
2002-07-14 14:33:30 +00:00
2006-05-07 21:44:23 +00:00
$filename = $this -> cachepath . str_replace ( '/' , '.' , $this -> filename [ $handle ]) . '.' . $phpEx ;
2008-07-28 14:24:37 +00:00
$this -> files_template [ $handle ] = $user -> theme [ 'template_id' ];
2009-06-19 22:07:27 +00:00
2008-07-28 14:24:37 +00:00
$recompile = false ;
if ( ! file_exists ( $filename ) || @ filesize ( $filename ) === 0 )
{
$recompile = true ;
}
else if ( $config [ 'load_tplcompile' ])
{
// No way around it: we need to check inheritance here
if ( $user -> theme [ 'template_inherits_id' ] && ! file_exists ( $this -> files [ $handle ]))
{
$this -> files [ $handle ] = $this -> files_inherit [ $handle ];
$this -> files_template [ $handle ] = $user -> theme [ 'template_inherits_id' ];
}
$recompile = ( @ filemtime ( $filename ) < filemtime ( $this -> files [ $handle ])) ? true : false ;
}
2009-06-19 22:07:27 +00:00
2003-04-18 14:32:32 +00:00
// Recompile page if the original template is newer, otherwise load the compiled version
2003-09-29 00:20:17 +00:00
if ( ! $recompile )
2002-07-14 14:33:30 +00:00
{
2003-04-23 14:55:13 +00:00
return $filename ;
}
2002-07-14 14:33:30 +00:00
2005-12-04 20:25:51 +00:00
global $db , $phpbb_root_path ;
2006-10-22 13:32:33 +00:00
if ( ! class_exists ( 'template_compile' ))
{
include ( $phpbb_root_path . 'includes/functions_template.' . $phpEx );
}
2009-06-19 22:07:27 +00:00
2008-07-28 14:24:37 +00:00
// Inheritance - we point to another template file for this one. Equality is also used for store_db
if ( isset ( $user -> theme [ 'template_inherits_id' ]) && $user -> theme [ 'template_inherits_id' ] && ! file_exists ( $this -> files [ $handle ]))
{
$this -> files [ $handle ] = $this -> files_inherit [ $handle ];
$this -> files_template [ $handle ] = $user -> theme [ 'template_inherits_id' ];
}
2009-06-19 22:07:27 +00:00
2005-12-04 20:25:51 +00:00
$compile = new template_compile ( $this );
2003-07-13 15:13:59 +00:00
2003-04-23 14:55:13 +00:00
// If we don't have a file assigned to this handle, die.
if ( ! isset ( $this -> files [ $handle ]))
{
trigger_error ( " template->_tpl_load(): No file specified for handle $handle " , E_USER_ERROR );
}
2006-03-25 16:19:20 +00:00
// Just compile if no user object is present (happens within the installer)
if ( ! $user )
{
$compile -> _tpl_load_file ( $handle );
return false ;
}
2006-04-14 15:10:51 +00:00
if ( isset ( $user -> theme [ 'template_storedb' ]) && $user -> theme [ 'template_storedb' ])
2003-08-06 15:45:13 +00:00
{
2008-07-28 14:24:37 +00:00
$rows = array ();
$ids = array ();
// Inheritance
if ( isset ( $user -> theme [ 'template_inherits_id' ]) && $user -> theme [ 'template_inherits_id' ])
{
$ids [] = $user -> theme [ 'template_inherits_id' ];
}
$ids [] = $user -> theme [ 'template_id' ];
2009-06-19 22:07:27 +00:00
2008-07-28 14:24:37 +00:00
foreach ( $ids as $id )
{
$sql = ' SELECT *
2007-04-06 14:03:20 +00:00
FROM ' . STYLES_TEMPLATE_DATA_TABLE . '
2008-07-28 14:24:37 +00:00
WHERE template_id = ' . $id . "
2004-08-01 12:31:21 +00:00
AND ( template_filename = '" . $db->sql_escape($this->filename[$handle]) . "'
2007-06-24 12:49:13 +00:00
OR template_included " . $db->sql_like_expression ( $db->any_char . $this->filename [ $handle ] . ':' . $db->any_char ) . ')';
2009-06-19 22:07:27 +00:00
2008-07-28 14:24:37 +00:00
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$rows [ $row [ 'template_filename' ]] = $row ;
}
$db -> sql_freeresult ( $result );
}
2009-06-19 22:07:27 +00:00
2008-07-28 14:24:37 +00:00
if ( sizeof ( $rows ))
2003-08-06 15:45:13 +00:00
{
2008-07-28 14:24:37 +00:00
foreach ( $rows as $row )
2003-08-06 15:45:13 +00:00
{
2008-07-28 14:24:37 +00:00
$file = $this -> root . '/' . $row [ 'template_filename' ];
$force_reload = false ;
if ( $row [ 'template_id' ] != $user -> theme [ 'template_id' ])
{
// make sure that we are not overlooking a file not in the db yet
if ( isset ( $user -> theme [ 'template_inherits_id' ]) && $user -> theme [ 'template_inherits_id' ] && ! file_exists ( $file ))
{
$file = $this -> inherit_root . '/' . $row [ 'template_filename' ];
$this -> files [ $row [ 'template_filename' ]] = $file ;
$this -> files_inherit [ $row [ 'template_filename' ]] = $file ;
$this -> files_template [ $row [ 'template_filename' ]] = $user -> theme [ 'template_inherits_id' ];
}
else if ( isset ( $user -> theme [ 'template_inherits_id' ]) && $user -> theme [ 'template_inherits_id' ])
{
// Ok, we have a situation. There is a file in the subtemplate, but nothing in the DB. We have to fix that.
$force_reload = true ;
$this -> files_template [ $row [ 'template_filename' ]] = $user -> theme [ 'template_inherits_id' ];
}
}
else
{
$this -> files_template [ $row [ 'template_filename' ]] = $user -> theme [ 'template_id' ];
}
2009-06-19 22:07:27 +00:00
2008-07-28 14:24:37 +00:00
if ( $force_reload || $row [ 'template_mtime' ] < filemtime ( $file ))
2003-08-06 15:45:13 +00:00
{
2007-04-06 14:03:20 +00:00
if ( $row [ 'template_filename' ] == $this -> filename [ $handle ])
{
2008-07-28 14:24:37 +00:00
$compile -> _tpl_load_file ( $handle , true );
2007-04-06 14:03:20 +00:00
}
else
{
2008-07-28 14:24:37 +00:00
$this -> files [ $row [ 'template_filename' ]] = $file ;
$this -> filename [ $row [ 'template_filename' ]] = $row [ 'template_filename' ];
$compile -> _tpl_load_file ( $row [ 'template_filename' ], true );
2007-04-06 14:03:20 +00:00
unset ( $this -> compiled_code [ $row [ 'template_filename' ]]);
unset ( $this -> files [ $row [ 'template_filename' ]]);
2007-07-09 18:27:57 +00:00
unset ( $this -> filename [ $row [ 'template_filename' ]]);
2007-04-06 14:03:20 +00:00
}
2003-08-06 15:45:13 +00:00
}
2007-04-06 14:03:20 +00:00
if ( $row [ 'template_filename' ] == $this -> filename [ $handle ])
2003-08-06 15:45:13 +00:00
{
2007-04-06 14:03:20 +00:00
$this -> compiled_code [ $handle ] = $compile -> compile ( trim ( $row [ 'template_data' ]));
$compile -> compile_write ( $handle , $this -> compiled_code [ $handle ]);
2006-06-11 18:13:52 +00:00
}
2007-04-06 14:03:20 +00:00
else
2006-06-11 18:13:52 +00:00
{
2007-04-06 14:03:20 +00:00
// Only bother compiling if it doesn't already exist
if ( ! file_exists ( $this -> cachepath . str_replace ( '/' , '.' , $row [ 'template_filename' ]) . '.' . $phpEx ))
{
$this -> filename [ $row [ 'template_filename' ]] = $row [ 'template_filename' ];
$compile -> compile_write ( $row [ 'template_filename' ], $compile -> compile ( trim ( $row [ 'template_data' ])));
unset ( $this -> filename [ $row [ 'template_filename' ]]);
}
2003-08-06 15:45:13 +00:00
}
}
2007-04-06 14:03:20 +00:00
}
else
{
2008-07-28 14:24:37 +00:00
$file = $this -> root . '/' . $row [ 'template_filename' ];
if ( isset ( $user -> theme [ 'template_inherits_id' ]) && $user -> theme [ 'template_inherits_id' ] && ! file_exists ( $file ))
{
$file = $this -> inherit_root . '/' . $row [ 'template_filename' ];
$this -> files [ $row [ 'template_filename' ]] = $file ;
$this -> files_inherit [ $row [ 'template_filename' ]] = $file ;
$this -> files_template [ $row [ 'template_filename' ]] = $user -> theme [ 'template_inherits_id' ];
}
2007-04-06 14:03:20 +00:00
// Try to load from filesystem and instruct to insert into the styles table...
$compile -> _tpl_load_file ( $handle , true );
return false ;
2003-08-06 15:45:13 +00:00
}
2006-06-11 18:13:52 +00:00
2003-08-06 15:45:13 +00:00
return false ;
}
2005-12-04 20:25:51 +00:00
$compile -> _tpl_load_file ( $handle );
2003-08-06 15:45:13 +00:00
return false ;
}
2005-12-04 20:25:51 +00:00
/**
* Assign key variable pairs from an array
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2002-07-14 14:33:30 +00:00
function assign_vars ( $vararray )
{
2002-11-07 23:21:14 +00:00
foreach ( $vararray as $key => $val )
2002-07-14 14:33:30 +00:00
{
2006-12-23 18:27:15 +00:00
$this -> _rootref [ $key ] = $val ;
2002-07-14 14:33:30 +00:00
}
return true ;
}
2005-12-04 20:25:51 +00:00
/**
* Assign a single variable to a single key
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2002-07-14 14:33:30 +00:00
function assign_var ( $varname , $varval )
{
2006-12-23 18:27:15 +00:00
$this -> _rootref [ $varname ] = $varval ;
2002-07-14 14:33:30 +00:00
return true ;
}
2002-08-22 21:40:51 +00:00
2005-12-04 20:25:51 +00:00
/**
* Assign key variable pairs from an array to a specified block
2006-08-22 21:26:06 +00:00
* @ access public
2005-12-04 20:25:51 +00:00
*/
2001-07-24 11:39:00 +00:00
function assign_block_vars ( $blockname , $vararray )
{
2004-07-08 22:41:04 +00:00
if ( strpos ( $blockname , '.' ) !== false )
2001-07-24 11:39:00 +00:00
{
2001-08-30 22:20:23 +00:00
// Nested block.
2001-07-24 11:39:00 +00:00
$blocks = explode ( '.' , $blockname );
$blockcount = sizeof ( $blocks ) - 1 ;
2002-07-14 14:33:30 +00:00
2004-08-01 12:31:21 +00:00
$str = & $this -> _tpldata ;
for ( $i = 0 ; $i < $blockcount ; $i ++ )
2001-07-24 11:39:00 +00:00
{
2004-08-01 12:31:21 +00:00
$str = & $str [ $blocks [ $i ]];
$str = & $str [ sizeof ( $str ) - 1 ];
}
2002-07-14 14:33:30 +00:00
2006-02-21 10:32:19 +00:00
$s_row_count = isset ( $str [ $blocks [ $blockcount ]]) ? sizeof ( $str [ $blocks [ $blockcount ]]) : 0 ;
$vararray [ 'S_ROW_COUNT' ] = $s_row_count ;
2006-06-11 18:13:52 +00:00
2005-04-11 21:32:22 +00:00
// Assign S_FIRST_ROW
2006-02-21 10:32:19 +00:00
if ( ! $s_row_count )
2005-04-11 21:32:22 +00:00
{
$vararray [ 'S_FIRST_ROW' ] = true ;
}
// Now the tricky part, we always assign S_LAST_ROW and remove the entry before
// This is much more clever than going through the complete template data on display (phew)
$vararray [ 'S_LAST_ROW' ] = true ;
2006-02-21 10:32:19 +00:00
if ( $s_row_count > 0 )
2005-04-11 21:32:22 +00:00
{
2006-02-21 10:32:19 +00:00
unset ( $str [ $blocks [ $blockcount ]][( $s_row_count - 1 )][ 'S_LAST_ROW' ]);
2005-04-11 21:32:22 +00:00
}
2001-07-24 11:39:00 +00:00
// Now we add the block that we're actually assigning to.
// We're adding a new iteration to this block with the given
// variable assignments.
2006-03-12 23:19:55 +00:00
$str [ $blocks [ $blockcount ]][] = $vararray ;
2001-07-24 11:39:00 +00:00
}
else
{
// Top-level block.
2006-02-21 10:32:19 +00:00
$s_row_count = ( isset ( $this -> _tpldata [ $blockname ])) ? sizeof ( $this -> _tpldata [ $blockname ]) : 0 ;
$vararray [ 'S_ROW_COUNT' ] = $s_row_count ;
2005-04-11 21:32:22 +00:00
// Assign S_FIRST_ROW
2006-02-21 10:32:19 +00:00
if ( ! $s_row_count )
2005-04-11 21:32:22 +00:00
{
$vararray [ 'S_FIRST_ROW' ] = true ;
}
// We always assign S_LAST_ROW and remove the entry before
$vararray [ 'S_LAST_ROW' ] = true ;
2006-02-21 10:32:19 +00:00
if ( $s_row_count > 0 )
2005-04-11 21:32:22 +00:00
{
2006-02-21 10:32:19 +00:00
unset ( $this -> _tpldata [ $blockname ][( $s_row_count - 1 )][ 'S_LAST_ROW' ]);
2005-04-11 21:32:22 +00:00
}
2009-06-19 22:07:27 +00:00
2006-06-11 18:13:52 +00:00
// Add a new iteration to this block with the variable assignments we were given.
2006-03-12 23:19:55 +00:00
$this -> _tpldata [ $blockname ][] = $vararray ;
2001-07-24 11:39:00 +00:00
}
2001-08-30 22:20:23 +00:00
2001-07-24 11:39:00 +00:00
return true ;
}
2003-04-18 14:32:32 +00:00
2005-04-09 12:26:45 +00:00
/**
* Change already assigned key variable pair ( one - dimensional - single loop entry )
*
2006-11-17 19:37:57 +00:00
* An example of how to use this function :
* { @ example alter_block_array . php }
2005-04-09 12:26:45 +00:00
*
2006-11-17 19:37:57 +00:00
* @ param string $blockname the blockname , for example 'loop'
* @ param array $vararray the var array to insert / add or merge
* @ param mixed $key Key to search for
2005-04-09 12:26:45 +00:00
*
* array : KEY => VALUE [ the key / value pair to search for within the loop to determine the correct position ]
*
* int : Position [ the position to change or insert at directly given ]
*
* If key is false the position is set to 0
* If key is true the position is set to the last entry
2007-10-04 12:03:05 +00:00
*
2006-11-17 19:37:57 +00:00
* @ param string $mode Mode to execute ( valid modes are 'insert' and 'change' )
2005-04-09 12:26:45 +00:00
*
2007-10-04 12:03:05 +00:00
* If insert , the vararray is inserted at the given position ( position counting from zero ) .
2005-04-09 12:26:45 +00:00
* If change , the current block gets merged with the vararray ( resulting in new key / value pairs be added and existing keys be replaced by the new value ) .
*
* Since counting begins by zero , inserting at the last position will result in this array : array ( vararray , last positioned array )
* and inserting at position 1 will result in this array : array ( first positioned array , vararray , following vars )
*
2006-11-17 19:37:57 +00:00
* @ return bool false on error , true on success
2006-08-22 21:26:06 +00:00
* @ access public
2005-04-09 12:26:45 +00:00
*/
2004-10-30 17:11:58 +00:00
function alter_block_array ( $blockname , $vararray , $key = false , $mode = 'insert' )
{
if ( strpos ( $blockname , '.' ) !== false )
{
// Nested blocks are not supported
return false ;
}
2009-06-19 22:07:27 +00:00
2004-10-30 17:11:58 +00:00
// Change key to zero (change first position) if false and to last position if true
if ( $key === false || $key === true )
{
2005-12-27 08:50:42 +00:00
$key = ( $key === false ) ? 0 : sizeof ( $this -> _tpldata [ $blockname ]);
2004-10-30 17:11:58 +00:00
}
// Get correct position if array given
if ( is_array ( $key ))
{
// Search array to get correct position
list ( $search_key , $search_value ) = @ each ( $key );
$key = NULL ;
foreach ( $this -> _tpldata [ $blockname ] as $i => $val_ary )
{
if ( $val_ary [ $search_key ] === $search_value )
{
$key = $i ;
break ;
}
}
// key/value pair not found
if ( $key === NULL )
{
return false ;
}
}
2006-06-11 18:13:52 +00:00
2004-10-30 17:11:58 +00:00
// Insert Block
if ( $mode == 'insert' )
{
// Make sure we are not exceeding the last iteration
2005-12-27 08:50:42 +00:00
if ( $key >= sizeof ( $this -> _tpldata [ $blockname ]))
2004-10-30 17:11:58 +00:00
{
$key = sizeof ( $this -> _tpldata [ $blockname ]);
2005-12-27 08:50:42 +00:00
unset ( $this -> _tpldata [ $blockname ][( $key - 1 )][ 'S_LAST_ROW' ]);
$vararray [ 'S_LAST_ROW' ] = true ;
2004-10-30 17:11:58 +00:00
}
2005-12-27 08:50:42 +00:00
else if ( $key === 0 )
{
unset ( $this -> _tpldata [ $blockname ][ 0 ][ 'S_FIRST_ROW' ]);
$vararray [ 'S_FIRST_ROW' ] = true ;
}
2004-10-30 17:11:58 +00:00
// Re-position template blocks
for ( $i = sizeof ( $this -> _tpldata [ $blockname ]); $i > $key ; $i -- )
{
$this -> _tpldata [ $blockname ][ $i ] = $this -> _tpldata [ $blockname ][ $i - 1 ];
$this -> _tpldata [ $blockname ][ $i ][ 'S_ROW_COUNT' ] = $i ;
}
// Insert vararray at given position
$vararray [ 'S_ROW_COUNT' ] = $key ;
2006-03-12 23:19:55 +00:00
$this -> _tpldata [ $blockname ][ $key ] = $vararray ;
2006-06-11 18:13:52 +00:00
2004-10-30 17:11:58 +00:00
return true ;
}
2006-06-11 18:13:52 +00:00
2004-10-30 17:11:58 +00:00
// Which block to change?
if ( $mode == 'change' )
{
2005-12-27 08:50:42 +00:00
if ( $key == sizeof ( $this -> _tpldata [ $blockname ]))
{
$key -- ;
}
2006-03-12 23:19:55 +00:00
$this -> _tpldata [ $blockname ][ $key ] = array_merge ( $this -> _tpldata [ $blockname ][ $key ], $vararray );
2004-10-30 17:11:58 +00:00
return true ;
}
2006-05-26 15:04:27 +00:00
return false ;
2004-10-30 17:11:58 +00:00
}
2005-12-04 20:25:51 +00:00
/**
2007-01-21 18:33:45 +00:00
* Include a separate template
2006-08-22 21:26:06 +00:00
* @ access private
2005-12-04 20:25:51 +00:00
*/
2003-04-18 14:32:32 +00:00
function _tpl_include ( $filename , $include = true )
{
2003-04-23 14:55:13 +00:00
$handle = $filename ;
2003-04-18 14:32:32 +00:00
$this -> filename [ $handle ] = $filename ;
2003-07-13 15:13:59 +00:00
$this -> files [ $handle ] = $this -> root . '/' . $filename ;
2008-07-28 14:24:37 +00:00
if ( $this -> inherit_root )
{
$this -> files_inherit [ $handle ] = $this -> inherit_root . '/' . $filename ;
}
2003-04-18 14:32:32 +00:00
2008-07-28 14:24:37 +00:00
$filename = $this -> _tpl_load ( $handle );
2003-08-10 18:33:25 +00:00
2003-04-23 14:55:13 +00:00
if ( $include )
{
2003-09-29 00:20:17 +00:00
global $user ;
if ( $filename )
2003-07-11 23:28:56 +00:00
{
2006-09-24 15:07:08 +00:00
include ( $filename );
2003-09-29 00:20:17 +00:00
return ;
2003-07-11 23:28:56 +00:00
}
2003-09-29 00:20:17 +00:00
eval ( ' ?>' . $this -> compiled_code [ $handle ] . '<?php ' );
2003-04-18 14:32:32 +00:00
}
}
2009-06-19 22:07:27 +00:00
/**
* Include a php - file
* @ access private
*/
function _php_include ( $filename )
{
global $phpbb_root_path ;
$file = $phpbb_root_path . $filename ;
if ( ! file_exists ( $file ))
{
// trigger_error cannot be used here, as the output already started
echo 'template->_php_include(): File ' . htmlspecialchars ( $file ) . ' does not exist or is empty' ;
return ;
}
include ( $file );
}
2001-07-24 11:39:00 +00:00
}
2001-08-26 14:04:27 +00:00
2002-06-22 11:48:10 +00:00
?>