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

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

{assign var=number value=0}

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

{$number++}

{++$number}

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

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

【问题讨论】:

    标签: php smarty


    【解决方案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 {assign}
    Smarty {capture}
    Extending 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++
    猜你喜欢
    • 2011-06-03
    • 2013-04-17
    • 2015-03-20
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多