aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/template/template.php
diff options
context:
space:
mode:
authorOleg Pudeyev <oleg@bsdpower.com>2011-07-30 17:06:22 -0400
committerOleg Pudeyev <oleg@bsdpower.com>2011-07-30 17:06:22 -0400
commit05b71ca04e8584428d335512a199e8c71c53a74f (patch)
tree1e11932df5698ba4b1fadb938f9fdd98bf7f9695 /phpBB/includes/template/template.php
parent4126a571aceca6266b565a0ef1f85cef5230a521 (diff)
downloadforums-05b71ca04e8584428d335512a199e8c71c53a74f.tar
forums-05b71ca04e8584428d335512a199e8c71c53a74f.tar.gz
forums-05b71ca04e8584428d335512a199e8c71c53a74f.tar.bz2
forums-05b71ca04e8584428d335512a199e8c71c53a74f.tar.xz
forums-05b71ca04e8584428d335512a199e8c71c53a74f.zip
[feature/template-engine] Factor template locator out of template class.
Template locator is responsible for maintaining mapping from template handles to filenames and paths, and provides resolution services using these mappings. Template locator is aware of template inheritance and is capable of checking template file existence on the filesystem. PHPBB3-9726
Diffstat (limited to 'phpBB/includes/template/template.php')
-rw-r--r--phpBB/includes/template/template.php143
1 files changed, 25 insertions, 118 deletions
diff --git a/phpBB/includes/template/template.php b/phpBB/includes/template/template.php
index d2d035b3b5..4ac15ae500 100644
--- a/phpBB/includes/template/template.php
+++ b/phpBB/includes/template/template.php
@@ -38,28 +38,10 @@ class phpbb_template
private $context;
/**
- * @var string Root dir for template.
- */
- private $root = '';
-
- /**
* @var string Path of the cache directory for the template
*/
public $cachepath = '';
- /**
- * @var array Hash of handle => file path pairs
- */
- public $files = array();
-
- /**
- * @var array Hash of handle => filename pairs
- */
- public $filename = array();
-
- public $files_inherit = array();
- public $inherit_root = '';
-
public $orig_tpl_inherits_id;
/**
@@ -83,6 +65,11 @@ class phpbb_template
private $user;
/**
+ * @var locator template locator
+ */
+ private $locator;
+
+ /**
* Constructor.
*
* @param string $phpbb_root_path phpBB root path
@@ -94,6 +81,7 @@ class phpbb_template
$this->phpEx = $phpEx;
$this->config = $config;
$this->user = $user;
+ $this->locator = new phpbb_template_locator();
}
/**
@@ -101,23 +89,12 @@ class phpbb_template
*/
public function set_template()
{
- $template_path = $this->user->theme['template_path'];
+ $template_path = $style_name = $this->user->theme['template_path'];
+ $this->locator->set_template_path($style_name);
+
if (file_exists($this->phpbb_root_path . 'styles/' . $template_path . '/template'))
{
- $this->root = $this->phpbb_root_path . 'styles/' . $template_path . '/template';
$this->cachepath = $this->phpbb_root_path . 'cache/tpl_' . str_replace('_', '-', $template_path) . '_';
-
- if ($this->orig_tpl_inherits_id === null)
- {
- $this->orig_tpl_inherits_id = $this->user->theme['template_inherits_id'];
- }
-
- $this->user->theme['template_inherits_id'] = $this->orig_tpl_inherits_id;
-
- if ($this->user->theme['template_inherits_id'])
- {
- $this->inherit_root = $this->phpbb_root_path . 'styles/' . $this->user->theme['template_inherit_path'] . '/template';
- }
}
else
{
@@ -138,32 +115,13 @@ class phpbb_template
* @param string $template_name Name of template
* @param string $fallback_template_path Path to fallback template
*/
- public function set_custom_template($template_path, $template_name, $fallback_template_path = false)
+ public function set_custom_template($template_path, $style_name, $fallback_template_path = false)
{
- // Make sure $template_path has no ending slash
- if (substr($template_path, -1) == '/')
- {
- $template_path = substr($template_path, 0, -1);
- }
+ $this->locator->set_custom_template($template_path, $style_name, $fallback_template_path);
+ $template_name = $style_name;
- $this->root = $template_path;
$this->cachepath = $this->phpbb_root_path . 'cache/ctpl_' . str_replace('_', '-', $template_name) . '_';
- if ($fallback_template_path !== false)
- {
- if (substr($fallback_template_path, -1) == '/')
- {
- $fallback_template_path = substr($fallback_template_path, 0, -1);
- }
-
- $this->inherit_root = $fallback_template_path;
- $this->orig_tpl_inherits_id = true;
- }
- else
- {
- $this->orig_tpl_inherits_id = false;
- }
-
$this->context = new phpbb_template_context();
return true;
@@ -176,21 +134,7 @@ class phpbb_template
*/
public function set_filenames(array $filename_array)
{
- foreach ($filename_array as $handle => $filename)
- {
- if (empty($filename))
- {
- trigger_error("template->set_filenames: Empty filename specified for $handle", E_USER_ERROR);
- }
-
- $this->filename[$handle] = $filename;
- $this->files[$handle] = $this->root . '/' . $filename;
-
- if ($this->inherit_root)
- {
- $this->files_inherit[$handle] = $this->inherit_root . '/' . $filename;
- }
- }
+ $this->locator->set_filenames($filename_array);
return true;
}
@@ -328,31 +272,25 @@ class phpbb_template
*/
private function _tpl_load($handle)
{
- if (!isset($this->filename[$handle]))
- {
- trigger_error("template->_tpl_load(): No file specified for handle $handle", E_USER_ERROR);
- }
+ $virtual_source_file = $this->locator->get_virtual_source_file_for_handle($handle);
+ $source_file = null;
// reload this setting to have the values they had when this object was initialised
// using set_template or set_custom_template, they might otherwise have been overwritten
// by other template class instances in between.
$this->user->theme['template_inherits_id'] = $this->orig_tpl_inherits_id;
- $compiled_path = $this->cachepath . str_replace('/', '.', $this->filename[$handle]) . '.' . $this->phpEx;
+ $compiled_path = $this->cachepath . str_replace('/', '.', $virtual_source_file) . '.' . $this->phpEx;
$recompile = defined('DEBUG_EXTRA') ||
!file_exists($compiled_path) ||
@filesize($compiled_path) === 0 ||
- ($this->config['load_tplcompile'] && @filemtime($compiled_path) < @filemtime($this->files[$handle]));
+ ($this->config['load_tplcompile'] && @filemtime($compiled_path) < @filemtime($source_file));
if (!$recompile && $this->config['load_tplcompile'])
{
- // No way around it: we need to check inheritance here
- if ($this->user->theme['template_inherits_id'] && !file_exists($this->files[$handle]))
- {
- $this->files[$handle] = $this->files_inherit[$handle];
- }
- $recompile = (@filemtime($compiled_path) < @filemtime($this->files[$handle])) ? true : false;
+ $source_file = $this->locator->get_source_file_for_handle($handle);
+ $recompile = (@filemtime($compiled_path) < @filemtime($source_file)) ? true : false;
}
// Recompile page if the original template is newer, otherwise load the compiled version
@@ -361,14 +299,11 @@ class phpbb_template
return new phpbb_template_renderer_include($compiled_path, $this);
}
- // Inheritance - we point to another template file for this one.
- if (isset($this->user->theme['template_inherits_id']) && $this->user->theme['template_inherits_id'] && !file_exists($this->files[$handle]))
+ if ($source_file === null)
{
- $this->files[$handle] = $this->files_inherit[$handle];
+ $source_file = $this->locator->get_source_file_for_handle($handle);
}
- $source_file = $this->_source_file_for_handle($handle);
-
$compile = new phpbb_template_compile($this->config['tpl_allow_php']);
$output_file = $this->_compiled_file_for_handle($handle);
@@ -389,36 +324,14 @@ class phpbb_template
}
/**
- * Resolves template handle $handle to source file path.
- * @param string $handle Template handle (i.e. "friendly" template name)
- * @return string Source file path
- */
- private function _source_file_for_handle($handle)
- {
- // If we don't have a file assigned to this handle, die.
- if (!isset($this->files[$handle]))
- {
- trigger_error("_source_file_for_handle(): No file specified for handle $handle", E_USER_ERROR);
- }
-
- $source_file = $this->files[$handle];
-
- // Try and open template for reading
- if (!file_exists($source_file))
- {
- trigger_error("_source_file_for_handle(): File $source_file does not exist", E_USER_ERROR);
- }
- return $source_file;
- }
-
- /**
* Determines compiled file path for handle $handle.
* @param string $handle Template handle (i.e. "friendly" template name)
* @return string Compiled file path
*/
private function _compiled_file_for_handle($handle)
{
- $compiled_file = $this->cachepath . str_replace('/', '.', $this->filename[$handle]) . '.' . $this->phpEx;
+ $source_file = $this->locator->get_filename_for_handle($handle);
+ $compiled_file = $this->cachepath . str_replace('/', '.', $source_file) . '.' . $this->phpEx;
return $compiled_file;
}
@@ -496,15 +409,9 @@ class phpbb_template
*/
public function _tpl_include($filename, $include = true)
{
- $handle = $filename;
- $this->filename[$handle] = $filename;
- $this->files[$handle] = $this->root . '/' . $filename;
- if ($this->inherit_root)
- {
- $this->files_inherit[$handle] = $this->inherit_root . '/' . $filename;
- }
+ $this->locator->set_filenames(array($filename => $filename));
- $renderer = $this->_tpl_load($handle);
+ $renderer = $this->_tpl_load($filename);
if ($renderer)
{