Как вы увеличиваете назначенную переменную в Smarty, не отображая ее - PullRequest
39 голосов
/ 30 декабря 2011

Итак, у меня есть назначенная переменная в smarty:

{assign var=number value=0}

Теперь я могу увеличить ее, используя

{$number++}

или

{++$number}

Что именноМне нужно, только проблема в том, что он отображает значение $ number на странице.Есть ли способ увеличить значение, но не отобразить его?

Это не используется внутри цикла, иначе я бы использовал что-то вроде итерации или индекса.

Ответы [ 4 ]

72 голосов
/ 30 декабря 2011

Вы можете сделать это:

{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 {назначить}
Smarty {плен}
Расширение Smarty с помощью плагинов

14 голосов
/ 10 мая 2013

Это чище, просто делать это так ...

{$number = $number +1}
4 голосов
/ 13 марта 2014

Лучше использовать встроенный в Smarty "counter" >> {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 или просто не дать ему напечатать :)

0 голосов
/ 30 декабря 2011

Если бы мне пришлось это сделать, я бы сделал что-то вроде следующего: {php}$number++{/php}, но очень уродливо использовать php в шаблоне smarty. Это может указывать на то, что есть лучший способ сделать то, что вы планировали сделать.

...