如何在smarty中增加指定变量而不显示它

Fra*_*wis 41 php smarty

所以我在smarty中有一个指定的变量:

{assign var=number value=0}
Run Code Online (Sandbox Code Playgroud)

现在我可以使用它来增加它

{$number++}
Run Code Online (Sandbox Code Playgroud)

要么

{++$number}
Run Code Online (Sandbox Code Playgroud)

这正是我需要的,唯一的问题是,它在页面上显示$ number的值.有没有办法可以增加值但不显示它?

这不是在循环内部使用,否则我会使用迭代或索引之类的东西.

Cyc*_*ode 73

你可以这样做:

{assign var=val value=1}
{assign var=val value=$val+1}
{$val} // displays 2
Run Code Online (Sandbox Code Playgroud)

以上内容将编译为:

$this->assign('val', 1);
$this->assign('val', $this->_tpl_vars['val']+1);
echo $this->_tpl_vars['val'];
Run Code Online (Sandbox Code Playgroud)

要么

{assign var=var value=1}
{capture assign=var}{$var+1}{/capture}
{$var} // displays 2
Run Code Online (Sandbox Code Playgroud)

反过来将编译为:

$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'];
Run Code Online (Sandbox Code Playgroud)

另一种方法是编写一个小插件:

// 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']);
   }
}
Run Code Online (Sandbox Code Playgroud)

然后会像这样调用该函数,注意这step是可选的,如果没有给定,变量将增加1:

{assign var=var value=0}
{inc var=var step=2}
{$var} // displays 2
Run Code Online (Sandbox Code Playgroud)

参考
Smarty {assign}
Smarty {capture}
使用插件扩展Smarty


tra*_*per 15

这样做比较干净......

{$number = $number +1}
Run Code Online (Sandbox Code Playgroud)

  • 它不会显示它. (4认同)

hun*_*rus 5

最好使用内置的 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 Code Online (Sandbox Code Playgroud)

它将为您打印:

Run the counter: 1
Run the counter: 2
Run the counter: 3
Run Code Online (Sandbox Code Playgroud)

因此,至少,您可以将它与print=false选项一起使用,并且您拥有计数器但它是隐藏的。

如果您以“可变方式”(如上部分写)使用它,您也可以用 html/css 隐藏它,或者只是不让它打印:)