mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-07 20:08:53 +00:00
[ticket/10970] Paths of the form {FOO}/a/{BAR}/b parsed correctly
A new method to handle this type of path was added and compile_tag_include, compile_tag_include_php and compile_tag_include_js were modified to use it appropriately. Tests were added for these three macros also. PHPBB3-10970
This commit is contained in:
parent
576cd6dd1e
commit
d589623906
10 changed files with 85 additions and 18 deletions
|
@ -361,6 +361,52 @@ 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
|
||||
*/
|
||||
private function parse_dynamic_path($path, $include_type)
|
||||
{
|
||||
$segments = explode('/', $path);
|
||||
$is_expr = true;
|
||||
$str = array();
|
||||
$vars = array();
|
||||
|
||||
foreach ($segments as $segment)
|
||||
{
|
||||
if ($segment[0] === '{')
|
||||
{
|
||||
$var = $this->get_varref($segment, $tmp_is_expr);
|
||||
$is_expr = $is_expr && $tmp_is_expr;
|
||||
$vars[] = "isset($var)";
|
||||
$str[] = "$var . '/'";
|
||||
}
|
||||
else
|
||||
{
|
||||
$str[] = "'$segment/'";
|
||||
}
|
||||
}
|
||||
|
||||
// Remove trailing slash from last element
|
||||
$last = array_pop($str);
|
||||
$str[] = str_replace('/', '', $last);
|
||||
|
||||
if (!$is_expr)
|
||||
{
|
||||
return ' if (' . implode(' && ', $vars) . ") { \$_template->$include_type(" . implode(' . ', $str) . ', true); }';
|
||||
}
|
||||
else
|
||||
{
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compile variables
|
||||
*
|
||||
|
@ -774,15 +820,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 +836,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 +928,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
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -20,11 +20,13 @@ class phpbb_template_template_includejs_test extends phpbb_template_template_tes
|
|||
$scripts = array(
|
||||
'<script src="' . $this->test_path . '/templates/parent_and_child.js?assets_version=1"></script>',
|
||||
'<script src="' . $this->test_path . '/parent_templates/parent_only.js?assets_version=1"></script>',
|
||||
'<script src="' . $this->test_path . '/templates/child_only.js?assets_version=1"></script>'
|
||||
'<script src="' . $this->test_path . '/templates/child_only.js?assets_version=1"></script>',
|
||||
'<script src="' . $this->test_path . '/templates/subdir/parent_only.js?assets_version=1"></script>',
|
||||
'<script src="' . $this->test_path . '/templates/subdir/subsubdir/parent_only.js?assets_version=1"></script>',
|
||||
);
|
||||
|
||||
// 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'), array(), array(), implode('', $scripts), $cache_file);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
1
tests/template/templates/include_variables.html
Normal file
1
tests/template/templates/include_variables.html
Normal file
|
@ -0,0 +1 @@
|
|||
<!-- INCLUDE {SUBDIR}/variable.html -->
|
|
@ -2,4 +2,6 @@
|
|||
<!-- INCLUDEJS {PARENT} -->
|
||||
<!-- DEFINE $TEST = 'child_only.js' -->
|
||||
<!-- INCLUDEJS {$TEST} -->
|
||||
{SCRIPTS}
|
||||
<!-- INCLUDEJS subdir/{PARENT} -->
|
||||
<!-- INCLUDEJS {SUBDIR}/subsubdir/{PARENT} -->
|
||||
{SCRIPTS}
|
||||
|
|
2
tests/template/templates/includephp_variables.html
Normal file
2
tests/template/templates/includephp_variables.html
Normal file
|
@ -0,0 +1,2 @@
|
|||
Path includes variables.
|
||||
<!-- INCLUDEPHP ../tests/template/{TEMPLATES}/_dummy_include.php.inc -->
|
0
tests/template/templates/subdir/parent_only.js
Normal file
0
tests/template/templates/subdir/parent_only.js
Normal file
0
tests/template/templates/subdir/subsubdir/parent_only.js
Normal file
0
tests/template/templates/subdir/subsubdir/parent_only.js
Normal file
1
tests/template/templates/subdir/variable.html
Normal file
1
tests/template/templates/subdir/variable.html
Normal file
|
@ -0,0 +1 @@
|
|||
{VARIABLE}
|
Loading…
Add table
Reference in a new issue