aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/template
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/includes/template')
-rw-r--r--phpBB/includes/template/compile.php10
-rw-r--r--phpBB/includes/template/filter.php63
-rw-r--r--phpBB/includes/template/locator.php52
-rw-r--r--phpBB/includes/template/template.php59
4 files changed, 111 insertions, 73 deletions
diff --git a/phpBB/includes/template/compile.php b/phpBB/includes/template/compile.php
index 82b301c1a2..22da21820e 100644
--- a/phpBB/includes/template/compile.php
+++ b/phpBB/includes/template/compile.php
@@ -58,6 +58,9 @@ class phpbb_template_compile
*/
public function compile_file_to_file($source_file, $compiled_file)
{
+ $lock = new phpbb_lock_flock($compiled_file);
+ $lock->acquire();
+
$source_handle = @fopen($source_file, 'rb');
$destination_handle = @fopen($compiled_file, 'wb');
@@ -66,16 +69,15 @@ class phpbb_template_compile
return false;
}
- @flock($destination_handle, LOCK_EX);
-
$this->compile_stream_to_stream($source_handle, $destination_handle);
@fclose($source_handle);
- @flock($destination_handle, LOCK_UN);
@fclose($destination_handle);
phpbb_chmod($compiled_file, CHMOD_READ | CHMOD_WRITE);
+ $lock->release();
+
clearstatcache();
return true;
@@ -118,7 +120,7 @@ class phpbb_template_compile
*
* @param resource $source_stream Source stream
* @param resource $dest_stream Destination stream
- * @return void
+ * @return null
*/
private function compile_stream_to_stream($source_stream, $dest_stream)
{
diff --git a/phpBB/includes/template/filter.php b/phpBB/includes/template/filter.php
index ad2e35de6a..66d28242a3 100644
--- a/phpBB/includes/template/filter.php
+++ b/phpBB/includes/template/filter.php
@@ -209,7 +209,7 @@ class phpbb_template_filter extends php_user_filter
*/
- $data = preg_replace('~(?<!^)(<\?php(?:(?<!\?>).)+(?<!/\*\*/)\?>)$~m', "$1\n", $data);
+ $data = preg_replace('~(?<!^)(<\?php.+(?<!/\*\*/)\?>)$~m', "$1\n", $data);
$data = str_replace('/**/?>', "?>\n", $data);
$data = str_replace('?><?php', '', $data);
return $data;
@@ -362,6 +362,43 @@ class phpbb_template_filter extends php_user_filter
}
/**
+ * Parse paths of the form {FOO}/a/{BAR}/b
+ *
+ * Note: this method assumes at least one variable in the path, this should
+ * be checked before this method is called.
+ *
+ * @param string $path The path to parse
+ * @param string $include_type The type of template function to call
+ * @return string An appropriately formatted string to include in the
+ * template or an empty string if an expression like S_FIRST_ROW was
+ * incorrectly used
+ */
+ private function parse_dynamic_path($path, $include_type)
+ {
+ $matches = array();
+ $replace = array();
+ $is_expr = true;
+
+ preg_match_all('#\{((?:' . self::REGEX_NS . '\.)*)(\$)?(' . self::REGEX_VAR . ')\}#', $path, $matches);
+ foreach ($matches[0] as $var_str)
+ {
+ $tmp_is_expr = false;
+ $var = $this->get_varref($var_str, $tmp_is_expr);
+ $is_expr = $is_expr && $tmp_is_expr;
+ $replace[] = "' . $var . '";
+ }
+
+ if (!$is_expr)
+ {
+ return " \$_template->$include_type('" . str_replace($matches[0], $replace, $path) . "', true);";
+ }
+ else
+ {
+ return '';
+ }
+ }
+
+ /**
* Compile variables
*
* @param string $text_blocks Variable reference in source template
@@ -774,15 +811,9 @@ class phpbb_template_filter extends php_user_filter
private function compile_tag_include($tag_args)
{
// Process dynamic includes
- if ($tag_args[0] == '{')
+ if (strpos($tag_args, '{') !== false)
{
- $var = $this->get_varref($tag_args, $is_expr);
-
- // Make sure someone didn't try to include S_FIRST_ROW or similar
- if (!$is_expr)
- {
- return "if (isset($var)) { \$_template->_tpl_include($var); }";
- }
+ return $this->parse_dynamic_path($tag_args, '_tpl_include');
}
return "\$_template->_tpl_include('$tag_args');";
@@ -796,6 +827,11 @@ class phpbb_template_filter extends php_user_filter
*/
private function compile_tag_include_php($tag_args)
{
+ if (strpos($tag_args, '{') !== false)
+ {
+ return $this->parse_dynamic_path($tag_args, '_php_include');
+ }
+
return "\$_template->_php_include('$tag_args');";
}
@@ -883,14 +919,9 @@ class phpbb_template_filter extends php_user_filter
private function compile_tag_include_js($tag_args)
{
// Process dynamic includes
- if ($tag_args[0] == '{')
+ if (strpos($tag_args, '{') !== false)
{
- $var = $this->get_varref($tag_args, $is_expr);
- if (!$is_expr)
- {
- return " \$_template->_js_include($var, true);";
- }
- return '';
+ return $this->parse_dynamic_path($tag_args, '_js_include');
}
// Locate file
diff --git a/phpBB/includes/template/locator.php b/phpBB/includes/template/locator.php
index 01c79eec4e..42db91efb2 100644
--- a/phpBB/includes/template/locator.php
+++ b/phpBB/includes/template/locator.php
@@ -99,12 +99,54 @@ interface phpbb_template_locator
public function get_source_file_for_handle($handle, $find_all = false);
/**
- * Locates source file path, accounting for styles tree and verifying that
- * the path exists.
+ * Obtains a complete filesystem path for a file in a style.
*
- * Unlike previous functions, this function works without template handle
- * and it can search for more than one file. If more than one file name is
- * specified, it will return location of file that it finds first.
+ * This function traverses the style tree (selected style and
+ * its parents in order, if inheritance is being used) and finds
+ * the first file on the filesystem matching specified relative path,
+ * or the first of the specified paths if more than one path is given.
+ *
+ * This function can be used to determine filesystem path of any
+ * file under any style, with the consequence being that complete
+ * relative to the style directory path must be provided as an argument.
+ *
+ * In particular, this function can be used to locate templates
+ * and javascript files.
+ *
+ * For locating templates get_first_template_location should be used
+ * as it prepends the configured template path to the template basename.
+ *
+ * Note: "selected style" is whatever style the style resource locator
+ * is configured for.
+ *
+ * The return value then will be a path, relative to the current
+ * directory or absolute, to the first existing file in the selected
+ * style or its closest parent.
+ *
+ * If the selected style does not have the file being searched,
+ * (and if inheritance is involved, none of the parents have it either),
+ * false will be returned.
+ *
+ * Multiple files can be specified, in which case the first file in
+ * the list that can be found on the filesystem is returned.
+ *
+ * If multiple files are specified and inheritance is involved,
+ * first each of the specified files is checked in the selected style,
+ * then each of the specified files is checked in the immediate parent,
+ * etc.
+ *
+ * Specifying true for $return_default will cause the function to
+ * return the first path which was checked for existence in the event
+ * that the template file was not found, instead of false.
+ * This is always a path in the selected style itself, not any of its
+ * parents.
+ *
+ * If $return_full_path is false, then instead of returning a usable
+ * path (when the file is found) the file's path relative to the style
+ * directory will be returned. This is the same path as was given to
+ * the function as a parameter. This can be used to check which of the
+ * files specified in $files exists. Naturally this requires passing
+ * more than one file in $files.
*
* @param array $files List of files to locate.
* @param bool $return_default Determines what to return if file does not
diff --git a/phpBB/includes/template/template.php b/phpBB/includes/template/template.php
index b7c3e00dee..5396ddbfad 100644
--- a/phpBB/includes/template/template.php
+++ b/phpBB/includes/template/template.php
@@ -36,7 +36,7 @@ class phpbb_template
* Stores template data used during template rendering.
* @var phpbb_template_context
*/
- public $context;
+ private $context;
/**
* Path of the cache directory for the template
@@ -75,26 +75,21 @@ class phpbb_template
private $locator;
/**
- * Location of templates directory within style directories
- * @var string
- */
- public $template_path = 'template/';
-
- /**
* Constructor.
*
* @param string $phpbb_root_path phpBB root path
* @param user $user current user
* @param phpbb_template_locator $locator template locator
+ * @param phpbb_template_context $context template context
*/
- public function __construct($phpbb_root_path, $php_ext, $config, $user, phpbb_template_locator $locator)
+ public function __construct($phpbb_root_path, $php_ext, $config, $user, phpbb_template_locator $locator, phpbb_template_context $context)
{
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
$this->config = $config;
$this->user = $user;
$this->locator = $locator;
- $this->template_path = $this->locator->template_path;
+ $this->context = $context;
}
/**
@@ -248,7 +243,7 @@ class phpbb_template
* If template cache is writable the compiled php code will be stored
* on filesystem and template will not be subsequently recompiled.
* If template cache is not writable template source will be recompiled
- * every time it is needed. DEBUG_EXTRA define and load_tplcompile
+ * every time it is needed. DEBUG define and load_tplcompile
* configuration setting may be used to force templates to be always
* recompiled.
*
@@ -266,7 +261,7 @@ class phpbb_template
{
$output_file = $this->_compiled_file_for_handle($handle);
- $recompile = defined('DEBUG_EXTRA') ||
+ $recompile = defined('DEBUG') ||
!file_exists($output_file) ||
@filesize($output_file) === 0;
@@ -457,42 +452,6 @@ class phpbb_template
}
/**
- * Locates source template path, accounting for styles tree and verifying that
- * the path exists.
- *
- * @param string or array $files List of templates to locate. If there is only
- * one template, $files can be a string to make code easier to read.
- * @param bool $return_default Determines what to return if template does not
- * exist. If true, function will return location where template is
- * supposed to be. If false, function will return false.
- * @param bool $return_full_path If true, function will return full path
- * to template. If false, function will return template file name.
- * This parameter can be used to check which one of set of template
- * files is available.
- * @return string or boolean Source template path if template exists or $return_default is
- * true. False if template does not exist and $return_default is false
- */
- public function locate($files, $return_default = false, $return_full_path = true)
- {
- // add tempalte path prefix
- $templates = array();
- if (is_string($files))
- {
- $templates[] = $this->template_path . $files;
- }
- else
- {
- foreach ($files as $file)
- {
- $templates[] = $this->template_path . $file;
- }
- }
-
- // use resource locator to find files
- return $this->locator->get_first_file_location($templates, $return_default, $return_full_path);
- }
-
- /**
* Include JS file
*
* @param string $file file name
@@ -504,7 +463,11 @@ class phpbb_template
// Locate file
if ($locate)
{
- $file = $this->locator->get_first_file_location(array($file), true, true);
+ $located = $this->locator->get_first_file_location(array($file), false, true);
+ if ($located)
+ {
+ $file = $located;
+ }
}
else if ($relative)
{