mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-11-03 22:01:36 +01:00 
			
		
		
		
	- optimization of {foreach} code size and processing
This commit is contained in:
		@@ -1,16 +1,100 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Foreach Runtime Methods count
 | 
			
		||||
 * Foreach Runtime Methods count(), init(), restore()
 | 
			
		||||
 *
 | 
			
		||||
 * @package    Smarty
 | 
			
		||||
 * @subpackage PluginsInternal
 | 
			
		||||
 * @author     Uwe Tews
 | 
			
		||||
 *
 | 
			
		||||
 **/
 | 
			
		||||
 */
 | 
			
		||||
class Smarty_Internal_Runtime_Foreach
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Stack of saved variables
 | 
			
		||||
     *
 | 
			
		||||
     * @var array
 | 
			
		||||
     */
 | 
			
		||||
    private $stack = array();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Init foreach loop
 | 
			
		||||
     *  - save item and key variables, named foreach property data if defined
 | 
			
		||||
     *  - init item and key variables, named foreach property data if required
 | 
			
		||||
     *  - count total if required
 | 
			
		||||
     *
 | 
			
		||||
     * @param \Smarty_Internal_Template $tpl
 | 
			
		||||
     * @param mixed                     $from       values to loop over
 | 
			
		||||
     * @param string                    $item       variable name
 | 
			
		||||
     * @param bool                      $needTotal  flag if we need to count values
 | 
			
		||||
     * @param null|string               $key        variable name
 | 
			
		||||
     * @param null|string               $name       of named foreach
 | 
			
		||||
     * @param array                     $properties of named foreach
 | 
			
		||||
     *
 | 
			
		||||
     * @return mixed $from
 | 
			
		||||
     */
 | 
			
		||||
    public function init(Smarty_Internal_Template $tpl, $from, $item, $needTotal = false, $key = null, $name = null,
 | 
			
		||||
                         $properties = array())
 | 
			
		||||
    {
 | 
			
		||||
        $saveVars = array();
 | 
			
		||||
        if (isset($tpl->tpl_vars[ $item ])) {
 | 
			
		||||
            $saveVars[ $item ] = $tpl->tpl_vars[ $item ];
 | 
			
		||||
        }
 | 
			
		||||
        if ($key) {
 | 
			
		||||
            if (isset($tpl->tpl_vars[ $key ])) {
 | 
			
		||||
                $saveVars[ $key ] = $tpl->tpl_vars[ $key ];
 | 
			
		||||
            }
 | 
			
		||||
            $tpl->tpl_vars[ $key ] = new Smarty_Variable();
 | 
			
		||||
        }
 | 
			
		||||
        if (!is_array($from) && !is_object($from)) {
 | 
			
		||||
            settype($from, 'array');
 | 
			
		||||
        }
 | 
			
		||||
        $total = $needTotal ? $this->count($from) : 1;
 | 
			
		||||
        $tpl->tpl_vars[ $item ] = new Smarty_Variable();
 | 
			
		||||
        if ($needTotal) {
 | 
			
		||||
            $tpl->tpl_vars[ $item ]->total = $total;
 | 
			
		||||
        }
 | 
			
		||||
        $tpl->tpl_vars[ $item ]->_loop = false;
 | 
			
		||||
        if ($name) {
 | 
			
		||||
            $namedVar = "__smarty_foreach_{$name}";
 | 
			
		||||
            if (isset($tpl->tpl_vars[ $namedVar ])) {
 | 
			
		||||
                $saveVars[ $namedVar ] = $tpl->tpl_vars[ $namedVar ];
 | 
			
		||||
            }
 | 
			
		||||
            $namedProp = array();
 | 
			
		||||
            if (isset($properties[ 'total' ])) {
 | 
			
		||||
                $namedProp[ 'total' ] = $total;
 | 
			
		||||
            }
 | 
			
		||||
            if (isset($properties[ 'iteration' ])) {
 | 
			
		||||
                $namedProp[ 'iteration' ] = 0;
 | 
			
		||||
            }
 | 
			
		||||
            if (isset($properties[ 'index' ])) {
 | 
			
		||||
                $namedProp[ 'index' ] = - 1;
 | 
			
		||||
            }
 | 
			
		||||
            if (isset($properties[ 'show' ])) {
 | 
			
		||||
                $namedProp[ 'show' ] = ($total > 0);
 | 
			
		||||
            }
 | 
			
		||||
            $tpl->tpl_vars[ $namedVar ] = new Smarty_Variable($namedProp);
 | 
			
		||||
        }
 | 
			
		||||
        $this->stack[] = $saveVars;
 | 
			
		||||
 | 
			
		||||
        return $from;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Restore saved variables
 | 
			
		||||
     *
 | 
			
		||||
     * @param \Smarty_Internal_Template $tpl
 | 
			
		||||
     */
 | 
			
		||||
    public function restore(Smarty_Internal_Template $tpl)
 | 
			
		||||
    {
 | 
			
		||||
        foreach (array_pop($this->stack) as $k => $v) {
 | 
			
		||||
            $tpl->tpl_vars[ $k ] = $v;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    *
 | 
			
		||||
     * [util function] counts an array, arrayAccess/traversable or PDOStatement object
 | 
			
		||||
     *
 | 
			
		||||
     * @param  mixed $value
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user