diff options
author | emkael <emkael@tlen.pl> | 2018-10-18 02:40:38 +0200 |
---|---|---|
committer | emkael <emkael@tlen.pl> | 2018-10-18 02:40:38 +0200 |
commit | eab8a101e7a3fcbb41e01a574985e06c5a3775de (patch) | |
tree | 60f201da5984b0c3638d10da02bba42b61aa3177 /lib/smarty3/sysplugins/smarty_internal_compile_break.php | |
parent | 7f38be342c1495aeca418286c15c25c18ac9e142 (diff) |
Updating Smarty
Diffstat (limited to 'lib/smarty3/sysplugins/smarty_internal_compile_break.php')
-rw-r--r-- | lib/smarty3/sysplugins/smarty_internal_compile_break.php | 70 |
1 files changed, 55 insertions, 15 deletions
diff --git a/lib/smarty3/sysplugins/smarty_internal_compile_break.php b/lib/smarty3/sysplugins/smarty_internal_compile_break.php index 0555ecc..1ee8d75 100644 --- a/lib/smarty3/sysplugins/smarty_internal_compile_break.php +++ b/lib/smarty3/sysplugins/smarty_internal_compile_break.php @@ -33,45 +33,85 @@ class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase public $shorttag_order = array('levels'); /** + * Tag name may be overloaded by Smarty_Internal_Compile_Continue + * + * @var string + */ + public $tag = 'break'; + + /** * Compiles code for the {break} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return string compiled code * @throws \SmartyCompilerException */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) + { + list($levels, $foreachLevels) = $this->checkLevels($args, $compiler); + $output = "<?php "; + if ($foreachLevels > 0 && $this->tag === 'continue') { + $foreachLevels--; + } + if ($foreachLevels > 0) { + /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */ + $foreachCompiler = $compiler->getTagCompiler('foreach'); + $output .= $foreachCompiler->compileRestore($foreachLevels); + } + $output .= "{$this->tag} {$levels};?>"; + return $output; + } + + /** + * check attributes and return array of break and foreach levels + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * + * @return array + * @throws \SmartyCompilerException + */ + public function checkLevels($args, Smarty_Internal_TemplateCompilerBase $compiler) { static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true); // check and get attributes $_attr = $this->getAttributes($compiler, $args); - if ($_attr[ 'nocache' ] === true) { $compiler->trigger_template_error('nocache option not allowed', null, true); } - if (isset($_attr[ 'levels' ])) { if (!is_numeric($_attr[ 'levels' ])) { $compiler->trigger_template_error('level attribute must be a numeric constant', null, true); } - $_levels = $_attr[ 'levels' ]; + $levels = $_attr[ 'levels' ]; } else { - $_levels = 1; + $levels = 1; } - $level_count = $_levels; + $level_count = $levels; $stack_count = count($compiler->_tag_stack) - 1; + $foreachLevels = 0; + $lastTag = ''; while ($level_count > 0 && $stack_count >= 0) { if (isset($_is_loopy[ $compiler->_tag_stack[ $stack_count ][ 0 ] ])) { - $level_count --; + $lastTag = $compiler->_tag_stack[ $stack_count ][ 0 ]; + if ($level_count === 0) { + break; + } + $level_count--; + if ($compiler->_tag_stack[ $stack_count ][ 0 ] === 'foreach') { + $foreachLevels++; + } } - $stack_count --; + $stack_count--; } - if ($level_count != 0) { - $compiler->trigger_template_error("cannot break {$_levels} level(s)", null, true); + if ($level_count !== 0) { + $compiler->trigger_template_error("cannot {$this->tag} {$levels} level(s)", null, true); } - - return "<?php break {$_levels};?>"; + if ($lastTag === 'foreach' && $this->tag === 'break' && $foreachLevels > 0) { + $foreachLevels--; + } + return array($levels, $foreachLevels); } } |