如何在 smarty 中增加分配的变量而不显示它

Posted

技术标签:

【中文标题】如何在 smarty 中增加分配的变量而不显示它【英文标题】:How do you increment an assigned variable in smarty without displaying it 【发布时间】:2012-01-30 06:47:26 【问题描述】:

所以我在 smarty 中有一个赋值变量:

assign var=number value=0

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

$number++

++$number

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

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

【问题讨论】:

【参考方案1】:

你可以这样做:

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 assignSmarty captureExtending Smarty With Plugins

【讨论】:

正是我想要的。我更喜欢使用捕获的第二个。谢谢。【参考方案2】:

最好使用内置的 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 隐藏它,或者干脆不让它打印 :)

【讨论】:

原始帖子指出“这不在循环内使用”。您似乎在使用循环。【参考方案3】:

这样做更干净......

$number = $number +1

【讨论】:

是的,但这会显示它(这不是预期的结果) 它不会显示它。【参考方案4】:

如果我必须这样做,我会做如下的事情:php$number++/php 但是在 smarty 模板中必须使用 php 非常难看。这可能表明有更好的方法来做你计划做的事情。

【讨论】:

我也想到了这一点,并让它与 PHP 一起工作得很好,但我不确定如何增加通过 smarty 分配的变量,所以我最终在整个模板的几个地方使用了 php分配变量,然后根据需要增加它,然后再实际使用它 - 它有点难看,但如果我没有更好的解决方案,我会回到那个。 您是否有理由不能在 php 中完成所有的工作并分配大量变量/数组?你要做的就是为模板做很多工作,完全违背了使用 smarty 的目的。 我忘记在这里输入的一点信息是我在模板中使用了一个while循环。在您的最新评论之后,我意识到我可以增加 while 标签中的数字 while $number++

以上是关于如何在 smarty 中增加分配的变量而不显示它的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Smarty 中定义具有随机值的变量

如何使用 PHP 和 Smarty 同时获取数据并在浏览器中显示?

Smarty模本引擎

smarty

iOS如何显示具有资产库路径的图像而不将它们绑定到实例变量

Smarty模板中使用getpostrequestcookiessession变量的方法