diff --git a/phpBB/includes/template/filter.php b/phpBB/includes/template/filter.php
index abee32c8f7..66d28242a3 100644
--- a/phpBB/includes/template/filter.php
+++ b/phpBB/includes/template/filter.php
@@ -361,6 +361,43 @@ class phpbb_template_filter extends php_user_filter
return $text_blocks;
}
+ /**
+ * 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
*
@@ -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/template.php b/phpBB/includes/template/template.php
index 5d3ce4c82b..36d7bc5307 100644
--- a/phpBB/includes/template/template.php
+++ b/phpBB/includes/template/template.php
@@ -538,7 +538,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)
{
diff --git a/tests/template/includephp_test.php b/tests/template/includephp_test.php
index f008a734eb..c93a53e2ad 100644
--- a/tests/template/includephp_test.php
+++ b/tests/template/includephp_test.php
@@ -23,6 +23,18 @@ class phpbb_template_includephp_test extends phpbb_template_template_test_case
$this->assertEquals("Path is relative to board root.\ntesting included php", $this->display('test'), "Testing INCLUDEPHP");
}
+ public function test_includephp_variables()
+ {
+ $this->setup_engine(array('tpl_allow_php' => true));
+
+ $cache_file = $this->template->cachepath . 'includephp_variables.html.php';
+
+ $this->run_template('includephp_variables.html', array('TEMPLATES' => 'templates'), array(), array(), "Path includes variables.\ntesting included php", $cache_file);
+
+ $this->template->set_filenames(array('test' => 'includephp_variables.html'));
+ $this->assertEquals("Path includes variables.\ntesting included php", $this->display('test'), "Testing INCLUDEPHP");
+ }
+
public function test_includephp_absolute()
{
$path_to_php = dirname(__FILE__) . '/templates/_dummy_include.php.inc';
diff --git a/tests/template/template_includejs_test.php b/tests/template/template_includejs_test.php
index a8f9a9037f..22b020208b 100644
--- a/tests/template/template_includejs_test.php
+++ b/tests/template/template_includejs_test.php
@@ -20,11 +20,14 @@ class phpbb_template_template_includejs_test extends phpbb_template_template_tes
$scripts = array(
'',
'',
- ''
+ '',
+ '',
+ '',
+ '',
);
// Run test
$cache_file = $this->template->cachepath . 'includejs.html.php';
- $this->run_template('includejs.html', array('PARENT' => 'parent_only.js'), array(), array(), implode('', $scripts), $cache_file);
+ $this->run_template('includejs.html', array('PARENT' => 'parent_only.js', 'SUBDIR' => 'subdir', 'EXT' => 'js'), array(), array(), implode('', $scripts), $cache_file);
}
}
diff --git a/tests/template/template_test.php b/tests/template/template_test.php
index f8677ed913..83995cb4ac 100644
--- a/tests/template/template_test.php
+++ b/tests/template/template_test.php
@@ -183,6 +183,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(),
'value',
),
+ array(
+ 'include_variables.html',
+ array('SUBDIR' => 'subdir', 'VARIABLE' => 'value'),
+ array(),
+ array(),
+ 'value',
+ ),
array(
'loop_vars.html',
array(),
diff --git a/tests/template/templates/include_variables.html b/tests/template/templates/include_variables.html
new file mode 100644
index 0000000000..8371a061b5
--- /dev/null
+++ b/tests/template/templates/include_variables.html
@@ -0,0 +1 @@
+
diff --git a/tests/template/templates/includejs.html b/tests/template/templates/includejs.html
index 8a2587d76b..ef73700eeb 100644
--- a/tests/template/templates/includejs.html
+++ b/tests/template/templates/includejs.html
@@ -2,4 +2,7 @@
-{SCRIPTS}
\ No newline at end of file
+
+
+
+{SCRIPTS}
diff --git a/tests/template/templates/includephp_variables.html b/tests/template/templates/includephp_variables.html
new file mode 100644
index 0000000000..6106efc86a
--- /dev/null
+++ b/tests/template/templates/includephp_variables.html
@@ -0,0 +1,2 @@
+Path includes variables.
+
diff --git a/tests/template/templates/subdir/parent_only.js b/tests/template/templates/subdir/parent_only.js
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/template/templates/subdir/subsubdir/parent_only.js b/tests/template/templates/subdir/subsubdir/parent_only.js
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/template/templates/subdir/variable.html b/tests/template/templates/subdir/variable.html
new file mode 100644
index 0000000000..f68f91597c
--- /dev/null
+++ b/tests/template/templates/subdir/variable.html
@@ -0,0 +1 @@
+{VARIABLE}