Поэтому у меня есть назначенная переменная в smarty:
{assign var=number value=0}
Теперь я могу увеличить его, используя
{$number++}
или
{++$number}
Это именно то, что мне нужно, только проблема, она отображает значение $ number на странице. Есть ли способ увеличить значение, но не отобразить его?
Это не используется внутри цикла, иначе я бы использовал что-то вроде итерации или индекса.
Вы можете сделать это:
{assign var=val value=1} {assign var=val value=$val+1} {$val} // displays 2
Вышеуказанное будет составлено для:
$this->assign('val', 1); $this->assign('val', $this->_tpl_vars['val']+1); echo $this->_tpl_vars['val'];
или
{assign var=var value=1} {capture assign=var}{$var+1}{/capture} {$var} // displays 2
Который, в свою очередь, будет скомпилирован как:
$this->assign('var', 1); ob_start(); echo $this->_tpl_vars['var']+1; $this->_smarty_vars['capture']['default'] = ob_get_contents(); $this->assign('var', ob_get_contents()); ob_end_clean(); echo $this->_tpl_vars['var'];
Другим подходом было бы написать небольшой плагин:
// plugins/function.inc.php function smarty_function_inc($params, Smarty &$smarty) { $params['step'] = empty($params['step']) ? 1 : intval($params['step']); if(empty($params['var'])) { trigger_error("inc: missing 'var' parameter"); return; } if(!in_array($params['var'], array_keys($smarty->_tpl_vars))) { trigger_error("inc: trying to increment unassigned variable ".$params['var']); return; } if(isset($smarty->_tpl_vars[$params['var']])) { $smarty->assign($params['var'], $smarty->_tpl_vars[$params['var']] + $params['step']); } }
Затем функция будет вызвана так, обратите внимание, что step
является необязательным, и если не указано, переменная будет увеличиваться на единицу:
{assign var=var value=0} {inc var=var step=2} {$var} // displays 2
Справка
Smarty {assign}
Smarty {capture}
Расширение Smarty с помощью плагинов
Это просто, чтобы сделать это вот так …
{$number = $number +1}
Лучше использовать встроенный элемент «счетчик» Smarty >> {counter}
.
Итак, в шаблоне вы можете использовать:
<div>Some text, html code, whatever... </div> {* init the counter! *} {counter start=0 print=false} {* now the tpl doesn't show the "0" number *} {* 3x run :D *} {some_cyclic_stuff_like_foreach_or_section} Run the counter: {counter} {/some_cyclic_stuff_like_foreach_or_section}
Он будет печатать для вас:
Run the counter: 1 Run the counter: 2 Run the counter: 3
Таким образом, по крайней мере, вы можете использовать его с параметром print=false
, и у вас есть счетчик, но он скрыт.
Если вы используете его «переменный способ» (например, надпись в верхнем разделе), вы также можете скрыть его с помощью html / css или просто не позволяйте ему печатать 🙂
Если бы мне пришлось это сделать, я бы сделал что-то вроде следующего: {php}$number++{/php}
но очень уродливо использовать php в шаблоне smarty. Это может означать, что есть лучший способ сделать то, что вы планировали делать.