【发布时间】:2012-01-30 06:47:26
【问题描述】:
所以我在 smarty 中有一个赋值变量:
{assign var=number value=0}
现在我可以使用它来增加它
{$number++}
或
{++$number}
这正是我需要的,唯一的问题是,它会在页面上显示 $number 的值。 有没有办法可以增加值但不显示它?
这不在循环内使用,否则我会使用迭代或索引之类的东西。
【问题讨论】:
所以我在 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}
Extending Smarty With Plugins
【讨论】:
最好使用内置的 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 隐藏它,或者干脆不让它打印 :)
【讨论】:
这样做更干净......
{$number = $number +1}
【讨论】:
如果我必须这样做,我会做如下的事情:{php}$number++{/php} 但是在 smarty 模板中必须使用 php 非常难看。这可能表明有更好的方法来做你计划做的事情。
【讨论】: