如何在 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 中增加分配的变量而不显示它的主要内容,如果未能解决你的问题,请参考以下文章