diff options
| author | Fyorl <gaelreth@gmail.com> | 2012-07-07 22:43:52 +0100 |
|---|---|---|
| committer | Fyorl <gaelreth@gmail.com> | 2012-07-08 20:41:00 +0100 |
| commit | d5896239068e1063970f398a12ffb5a0707fb286 (patch) | |
| tree | 2cecbff20e71e466412cadbb7f49c52044a0b244 | |
| parent | 576cd6dd1e45171e998d6aa13ab74b73939ce084 (diff) | |
| download | forums-d5896239068e1063970f398a12ffb5a0707fb286.tar forums-d5896239068e1063970f398a12ffb5a0707fb286.tar.gz forums-d5896239068e1063970f398a12ffb5a0707fb286.tar.bz2 forums-d5896239068e1063970f398a12ffb5a0707fb286.tar.xz forums-d5896239068e1063970f398a12ffb5a0707fb286.zip | |
[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
| -rw-r--r-- | phpBB/includes/template/filter.php | 70 | ||||
| -rw-r--r-- | tests/template/includephp_test.php | 12 | ||||
| -rw-r--r-- | tests/template/template_includejs_test.php | 6 | ||||
| -rw-r--r-- | tests/template/template_test.php | 7 | ||||
| -rw-r--r-- | tests/template/templates/include_variables.html | 1 | ||||
| -rw-r--r-- | tests/template/templates/includejs.html | 4 | ||||
| -rw-r--r-- | tests/template/templates/includephp_variables.html | 2 | ||||
| -rw-r--r-- | tests/template/templates/subdir/parent_only.js | 0 | ||||
| -rw-r--r-- | tests/template/templates/subdir/subsubdir/parent_only.js | 0 | ||||
| -rw-r--r-- | tests/template/templates/subdir/variable.html | 1 |
10 files changed, 85 insertions, 18 deletions
diff --git a/phpBB/includes/template/filter.php b/phpBB/includes/template/filter.php index ad2e35de6a..a8985a771c 100644 --- a/phpBB/includes/template/filter.php +++ b/phpBB/includes/template/filter.php @@ -362,6 +362,52 @@ 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 + */ + 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 * * @param string $text_blocks Variable reference in source template @@ -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 diff --git a/tests/template/includephp_test.php b/tests/template/includephp_test.php index 626735f15f..236621adec 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..d8c7170e94 100644 --- a/tests/template/template_includejs_test.php +++ b/tests/template/template_includejs_test.php @@ -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); } } 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 @@ -184,6 +184,13 @@ class phpbb_template_template_test extends phpbb_template_template_test_case 'value', ), array( + 'include_variables.html', + array('SUBDIR' => 'subdir', 'VARIABLE' => 'value'), + array(), + array(), + 'value', + ), + array( 'loop_vars.html', array(), array('loop' => array(array('VARIABLE' => 'x'), array('VARIABLE' => 'y')), 'loop.inner' => array(array(), 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 @@ +<!-- INCLUDE {SUBDIR}/variable.html --> diff --git a/tests/template/templates/includejs.html b/tests/template/templates/includejs.html index 8a2587d76b..dbcf6e04a8 100644 --- a/tests/template/templates/includejs.html +++ b/tests/template/templates/includejs.html @@ -2,4 +2,6 @@ <!-- INCLUDEJS {PARENT} --> <!-- DEFINE $TEST = 'child_only.js' --> <!-- INCLUDEJS {$TEST} --> -{SCRIPTS}
\ No newline at end of file +<!-- INCLUDEJS subdir/{PARENT} --> +<!-- INCLUDEJS {SUBDIR}/subsubdir/{PARENT} --> +{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. +<!-- INCLUDEPHP ../tests/template/{TEMPLATES}/_dummy_include.php.inc --> 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 --- /dev/null +++ b/tests/template/templates/subdir/parent_only.js 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 --- /dev/null +++ b/tests/template/templates/subdir/subsubdir/parent_only.js 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} |
