diff options
Diffstat (limited to 'libs/sysplugins/smarty_internal_compile_foreach.php')
| -rw-r--r-- | libs/sysplugins/smarty_internal_compile_foreach.php | 200 |
1 files changed, 106 insertions, 94 deletions
diff --git a/libs/sysplugins/smarty_internal_compile_foreach.php b/libs/sysplugins/smarty_internal_compile_foreach.php index 6ad1e07e..5a196cb4 100644 --- a/libs/sysplugins/smarty_internal_compile_foreach.php +++ b/libs/sysplugins/smarty_internal_compile_foreach.php @@ -1,54 +1,72 @@ <?php /** * Smarty Internal Plugin Compile Foreach - * + * * Compiles the {foreach} {foreachelse} {/foreach} tags - * + * * @package Smarty * @subpackage Compiler - * @author Uwe Tews + * @author Uwe Tews */ /** * Smarty Internal Plugin Compile Foreach Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase { - // attribute definitions + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $required_attributes = array('from', 'item'); - public $optional_attributes = array('name', 'key'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('name', 'key'); + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ public $shorttag_order = array('from','item','key','name'); /** * Compiles code for the {foreach} tag - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @param array $parameter array with compilation parameter + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; - $tpl = $compiler->template; + $tpl = $compiler->template; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); $from = $_attr['from']; $item = $_attr['item']; - - if (substr_compare("\$_smarty_tpl->getVariable($item)", $from,0, strlen("\$_smarty_tpl->getVariable($item)")) == 0) { - $this->compiler->trigger_template_error("item variable {$item} may not be the same variable as at 'from'", $this->compiler->lex->taglineno); - } + if (substr_compare("\$_smarty_tpl->tpl_vars[$item]", $from,0, strlen("\$_smarty_tpl->tpl_vars[$item]")) == 0) { + $compiler->trigger_template_error("item variable {$item} may not be the same variable as at 'from'", $compiler->lex->taglineno); + } if (isset($_attr['key'])) { $key = $_attr['key']; } else { $key = null; - } + } - $this->_open_tag('foreach', array('foreach', $this->compiler->nocache, $item, $key)); + $this->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key)); // maybe nocache because of nocache variables - $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; + $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; if (isset($_attr['name'])) { $name = $_attr['name']; @@ -57,163 +75,157 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase { } else { $name = null; $has_name = false; - } - $ItemVarName = '$' . trim($item, '\'"') . '@'; + } + $ItemVarName = '$' . trim($item, '\'"') . '@'; // evaluates which Smarty variables and properties have to be computed if ($has_name) { - $usesSmartyFirst = strpos($tpl->template_source, $SmartyVarName . 'first') !== false; - $usesSmartyLast = strpos($tpl->template_source, $SmartyVarName . 'last') !== false; - $usesSmartyIndex = strpos($tpl->template_source, $SmartyVarName . 'index') !== false; - $usesSmartyIteration = strpos($tpl->template_source, $SmartyVarName . 'iteration') !== false; - $usesSmartyShow = strpos($tpl->template_source, $SmartyVarName . 'show') !== false; - $usesSmartyTotal = strpos($tpl->template_source, $SmartyVarName . 'total') !== false; + $usesSmartyFirst = strpos($tpl->source->content, $SmartyVarName . 'first') !== false; + $usesSmartyLast = strpos($tpl->source->content, $SmartyVarName . 'last') !== false; + $usesSmartyIndex = strpos($tpl->source->content, $SmartyVarName . 'index') !== false; + $usesSmartyIteration = strpos($tpl->source->content, $SmartyVarName . 'iteration') !== false; + $usesSmartyShow = strpos($tpl->source->content, $SmartyVarName . 'show') !== false; + $usesSmartyTotal = strpos($tpl->source->content, $SmartyVarName . 'total') !== false; } else { $usesSmartyFirst = false; $usesSmartyLast = false; $usesSmartyTotal = false; $usesSmartyShow = false; - } + } - $usesPropFirst = $usesSmartyFirst || strpos($tpl->template_source, $ItemVarName . 'first') !== false; - $usesPropLast = $usesSmartyLast || strpos($tpl->template_source, $ItemVarName . 'last') !== false; - $usesPropIndex = $usesPropFirst || strpos($tpl->template_source, $ItemVarName . 'index') !== false; - $usesPropIteration = $usesPropLast || strpos($tpl->template_source, $ItemVarName . 'iteration') !== false; - $usesPropShow = strpos($tpl->template_source, $ItemVarName . 'show') !== false; - $usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->template_source, $ItemVarName . 'total') !== false; + $usesPropFirst = $usesSmartyFirst || strpos($tpl->source->content, $ItemVarName . 'first') !== false; + $usesPropLast = $usesSmartyLast || strpos($tpl->source->content, $ItemVarName . 'last') !== false; + $usesPropIndex = $usesPropFirst || strpos($tpl->source->content, $ItemVarName . 'index') !== false; + $usesPropIteration = $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'iteration') !== false; + $usesPropShow = strpos($tpl->source->content, $ItemVarName . 'show') !== false; + $usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'total') !== false; // generate output code $output = "<?php "; $output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable;\n"; - $compiler->local_var[$item] = true; if ($key != null) { $output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n"; - $compiler->local_var[$key] = true; - } + } $output .= " \$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array');}\n"; if ($usesPropTotal) { $output .= " \$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n"; - } + } if ($usesPropIteration) { $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration=0;\n"; - } + } if ($usesPropIndex) { $output .= " \$_smarty_tpl->tpl_vars[$item]->index=-1;\n"; - } + } if ($usesPropShow) { $output .= " \$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->tpl_vars[$item]->total > 0);\n"; - } + } if ($has_name) { if ($usesSmartyTotal) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['total'] = \$_smarty_tpl->tpl_vars[$item]->total;\n"; - } + } if ($usesSmartyIteration) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']=0;\n"; - } + } if ($usesSmartyIndex) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']=-1;\n"; - } + } if ($usesSmartyShow) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['show']=(\$_smarty_tpl->tpl_vars[$item]->total > 0);\n"; - } - } - if ($usesPropTotal) { - $output .= "if (\$_smarty_tpl->tpl_vars[$item]->total > 0){\n"; - } else { - $output .= "if (\$_smarty_tpl->_count(\$_from) > 0){\n"; - } - $output .= " foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n"; + } + } + $output .= "\$_loop = false;\nforeach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n\$_loop = true;\n"; if ($key != null) { $output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n"; - } + } if ($usesPropIteration) { $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration++;\n"; - } + } if ($usesPropIndex) { $output .= " \$_smarty_tpl->tpl_vars[$item]->index++;\n"; - } + } if ($usesPropFirst) { $output .= " \$_smarty_tpl->tpl_vars[$item]->first = \$_smarty_tpl->tpl_vars[$item]->index === 0;\n"; - } + } if ($usesPropLast) { $output .= " \$_smarty_tpl->tpl_vars[$item]->last = \$_smarty_tpl->tpl_vars[$item]->iteration === \$_smarty_tpl->tpl_vars[$item]->total;\n"; - } + } if ($has_name) { if ($usesSmartyFirst) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['first'] = \$_smarty_tpl->tpl_vars[$item]->first;\n"; - } + } if ($usesSmartyIteration) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']++;\n"; - } + } if ($usesSmartyIndex) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']++;\n"; - } + } if ($usesSmartyLast) { $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['last'] = \$_smarty_tpl->tpl_vars[$item]->last;\n"; - } - } + } + } $output .= "?>"; return $output; - } -} + } +} /** * Smarty Internal Plugin Compile Foreachelse Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase { + /** * Compiles code for the {foreachelse} tag - * - * @param array $args array with attributes from parser + * + * @param array $args array with attributes from parser * @param object $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); + + list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach')); + $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key)); - list($_open_tag, $nocache, $item, $key) = $this->_close_tag(array('foreach')); - $this->_open_tag('foreachelse', array('foreachelse', $nocache, $item, $key)); + return "<?php }\nif (!\$_loop) {\n?>"; + } - return "<?php }} else { ?>"; - } -} +} /** * Smarty Internal Plugin Compile Foreachclose Class + * + * @package Smarty + * @subpackage Compiler */ class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase { + /** * Compiles code for the {/foreach} tag - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @param array $parameter array with compilation parameter + * + * @param array $args array with attributes from parser + * @param object $compiler compiler object + * @param array $parameter array with compilation parameter * @return string compiled code */ public function compile($args, $compiler, $parameter) { - $this->compiler = $compiler; // check and get attributes - $_attr = $this->_get_attributes($args); + $_attr = $this->getAttributes($compiler, $args); // must endblock be nocache? - if ($this->compiler->nocache) { - $this->compiler->tag_nocache = true; - } + if ($compiler->nocache) { + $compiler->tag_nocache = true; + } - list($_open_tag, $this->compiler->nocache, $item, $key) = $this->_close_tag(array('foreach', 'foreachelse')); - unset($compiler->local_var[$item]); - if ($key != null) { - unset($compiler->local_var[$key]); - } + list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse')); + + return "<?php } ?>"; + } - if ($_open_tag == 'foreachelse') - return "<?php } ?>"; - else - return "<?php }} ?>"; - } -} +} ?>
\ No newline at end of file |
