From 427a5122d55f06c861277297411f7e39a03a703c Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Tue, 26 Apr 2011 02:09:51 +0200 Subject: [PATCH] [feature/template-engine] Fix negative variable expressions compile_tag_if had the flawed approach of adding an isset statement for all variables to the beginning of the if. This fails for negative expressions, and checking those takes a considerable effort. The easier solution is to make the variable expression itself conditional, defaulting to null if it is not set. Thanks to naderman for the solution. PHPBB3-9726 --- phpBB/includes/template_compile.php | 15 ++++----------- tests/template/template_test.php | 2 +- tests/template/templates/basic.html | 3 +++ tests/template/templates/if.html | 2 +- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/phpBB/includes/template_compile.php b/phpBB/includes/template_compile.php index 9a8bc05343..3f8a028e25 100644 --- a/phpBB/includes/template_compile.php +++ b/phpBB/includes/template_compile.php @@ -408,7 +408,7 @@ class phpbb_template_filter extends php_user_filter * some adaptions for our block level methods * @access private */ - private function compile_expression($tag_args, &$vars = array()) + private function compile_expression($tag_args) { $match = array(); preg_match_all('/(?: @@ -553,14 +553,14 @@ class phpbb_template_filter extends php_user_filter default: $token = $this->generate_block_data_ref(substr($varrefs[1], 0, -1), true, $varrefs[2]) . '[\'' . $varrefs[3] . '\']'; - $vars[$token] = true; + $token = '(isset(' . $token . ') ? ' . $token . ' : null)'; break; } } else { $token = ($varrefs[2]) ? '$_tpldata[\'DEFINE\'][\'.\'][\'' . $varrefs[3] . '\']' : '$_rootref[\'' . $varrefs[3] . '\']'; - $vars[$token] = true; + $token = '(isset(' . $token . ') ? ' . $token . ' : null)'; } } @@ -601,17 +601,10 @@ class phpbb_template_filter extends php_user_filter private function compile_tag_if($tag_args, $elseif) { - $vars = array(); - - $tokens = $this->compile_expression($tag_args, $vars); + $tokens = $this->compile_expression($tag_args); $tpl = ($elseif) ? '} else if (' : 'if ('; - if (!empty($vars)) - { - $tpl .= '(isset(' . implode(') && isset(', array_keys($vars)) . ')) && '; - } - $tpl .= implode(' ', $tokens); $tpl .= ') { '; diff --git a/tests/template/template_test.php b/tests/template/template_test.php index 4304035192..0a46ff4d23 100644 --- a/tests/template/template_test.php +++ b/tests/template/template_test.php @@ -91,7 +91,7 @@ class phpbb_template_template_test extends phpbb_test_case array(), array(), array(), - "pass\npass\n", + "pass\npass\npass\n", ), array( 'variable.html', diff --git a/tests/template/templates/basic.html b/tests/template/templates/basic.html index c1dd690260..e5c6f280fb 100644 --- a/tests/template/templates/basic.html +++ b/tests/template/templates/basic.html @@ -16,5 +16,8 @@ fail pass + +pass + diff --git a/tests/template/templates/if.html b/tests/template/templates/if.html index 41ff024779..eed431019e 100644 --- a/tests/template/templates/if.html +++ b/tests/template/templates/if.html @@ -6,6 +6,6 @@ 03 - + 04