count($from); } } else { settype($from, 'array'); } } if (!isset($total)) { $total = empty($from) ? 0 : ($needTotal ? count($from) : 1); } if ($tpl->hasVariable($item)) { $saveVars['item'] = [ $item, $tpl->getVariable($item)->getValue(), ]; } $tpl->assign($item,null); if ($total === 0) { $from = null; } else { if ($key) { if ($tpl->hasVariable($key)) { $saveVars['key'] = [ $key, clone $tpl->getVariable($key), ]; } $tpl->assign($key, null); } } if ($needTotal) { $tpl->getVariable($item)->total = $total; } if ($name) { $namedVar = "__smarty_foreach_{$name}"; if ($tpl->hasVariable($namedVar)) { $saveVars['named'] = [ $namedVar, clone $tpl->getVariable($namedVar), ]; } $namedProp = []; 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->assign($namedVar, $namedProp); } $this->stack[] = $saveVars; return $from; } /** * [util function] counts an array, arrayAccess/traversable or PDOStatement object * * @param mixed $value * * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 * for empty elements * @throws \Exception */ public function count($value): int { if ($value instanceof \IteratorAggregate) { // Note: getIterator() returns a Traversable, not an Iterator // thus rewind() and valid() methods may not be present return iterator_count($value->getIterator()); } elseif ($value instanceof \Iterator) { return $value instanceof \Generator ? 1 : iterator_count($value); } elseif ($value instanceof \Countable) { return count($value); } return count((array) $value); } /** * Restore saved variables * * will be called by {break n} or {continue n} for the required number of levels * * @param \Smarty\Template $tpl * @param int $levels number of levels */ public function restore(Template $tpl, $levels = 1) { while ($levels) { $saveVars = array_pop($this->stack); if (!empty($saveVars)) { if (isset($saveVars['item'])) { $tpl->getVariable($saveVars['item'][0])->setValue($saveVars['item'][1]); } if (isset($saveVars['key'])) { $tpl->setVariable($saveVars['key'][0], $saveVars['key'][1]); } if (isset($saveVars['named'])) { $tpl->setVariable($saveVars['named'][0], $saveVars['named'][1]); } } $levels--; } } }