mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-07 20:08:53 +00:00
[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
This commit is contained in:
parent
f0b97cfdcf
commit
427a5122d5
4 changed files with 9 additions and 13 deletions
|
@ -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 .= ') { ';
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ class phpbb_template_template_test extends phpbb_test_case
|
|||
array(),
|
||||
array(),
|
||||
array(),
|
||||
"pass\npass\n<!-- DUMMY var -->",
|
||||
"pass\npass\npass\n<!-- DUMMY var -->",
|
||||
),
|
||||
array(
|
||||
'variable.html',
|
||||
|
|
|
@ -16,5 +16,8 @@ fail
|
|||
<!-- BEGINELSE -->
|
||||
pass
|
||||
<!-- END empty -->
|
||||
<!-- IF not S_EMPTY -->
|
||||
pass
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- DUMMY var -->
|
||||
|
|
|
@ -6,6 +6,6 @@
|
|||
03
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF (S_VALUE > S_OTHER_VALUE) -->
|
||||
<!-- IF S_VALUE and S_OTHER_VALUE and (S_VALUE > S_OTHER_VALUE) -->
|
||||
04
|
||||
<!-- ENDIF -->
|
||||
|
|
Loading…
Add table
Reference in a new issue