| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | <?php/** * Smarty Internal Plugin Compile Foreach * * Compiles the {foreach} {foreachelse} {/foreach} tags * * @package Smarty * @subpackage Compiler * @author Uwe Tews *//** * Smarty Internal Plugin Compile Foreach Class * * @package Smarty * @subpackage Compiler */class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {    /**     * Attribute definition: Overwrites base class.     *     * @var array     * @see Smarty_Internal_CompileBase     */    public $required_attributes = array('from', 'item');    /**     * 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     * @return string compiled code     */    public function compile($args, $compiler, $parameter)    {        $tpl = $compiler->template;        // check and get attributes        $_attr = $this->getAttributes($compiler, $args);        $from = $_attr['from'];        $item = $_attr['item'];        if (!strncmp("\$_smarty_tpl->tpl_vars[$item]", $from, strlen($item) + 24)) {            $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->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key));        // maybe nocache because of nocache variables        $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;        if (isset($_attr['name'])) {            $name = $_attr['name'];            $has_name = true;            $SmartyVarName = '$smarty.foreach.' . trim($name, '\'"') . '.';        } else {            $name = null;            $has_name = false;        }        $ItemVarName = '$' . trim($item, '\'"') . '@';        // evaluates which Smarty variables and properties have to be computed        if ($has_name) {            $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->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; \$_smarty_tpl->tpl_vars[$item]->_loop = false;\n";        if ($key != null) {            $output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n";        }        $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";            }        }        $output .= "foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n\$_smarty_tpl->tpl_vars[$item]->_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 object $compiler compiler object     * @param array  $parameter array with compilation parameter     * @return string compiled code     */    public function compile($args, $compiler, $parameter)    {        // check and get attributes        $_attr = $this->getAttributes($compiler, $args);        list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach'));        $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key));        return "<?php }\nif (!\$_smarty_tpl->tpl_vars[$item]->_loop) {\n?>";    }}/** * 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     * @return string compiled code     */    public function compile($args, $compiler, $parameter)    {        // check and get attributes        $_attr = $this->getAttributes($compiler, $args);        // must endblock be nocache?        if ($compiler->nocache) {            $compiler->tag_nocache = true;        }        list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse'));        return "<?php } ?>";    }}?>
 |