How do you increment an assigned variable in smarty without displaying it

前端 未结 4 1718
Happy的楠姐
Happy的楠姐 2020-12-29 18:54

So I have an assigned variable in smarty:

{assign var=number value=0}

Now I can increment it using

{$number++}
相关标签:
4条回答
  • 2020-12-29 19:03

    It's cleaner just to do it like this...

    {$number = $number +1}
    
    0 讨论(0)
  • 2020-12-29 19:03

    If I had to do this I would do something like the following: {php}$number++{/php} but it is very ugly to have to use php in a smarty template. This might suggest that there is a better way of doing what you planned to do.

    0 讨论(0)
  • 2020-12-29 19:10

    Better to use the built in Smarty "counter" >> {counter} element.

    So, in template you can use:

    <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}
    

    It will print for you:

    Run the counter: 1
    Run the counter: 2
    Run the counter: 3
    

    So, at least, you can use it with the print=false option, and you have the counter but it's hidden.

    If you use it the "variable way" (like the upper section write) you also can hide it with html/css or just simply don't let it print :)

    0 讨论(0)
  • 2020-12-29 19:11

    You could do this:

    {assign var=val value=1}
    {assign var=val value=$val+1}
    {$val} // displays 2
    

    The above will be compiled to:

    $this->assign('val', 1);
    $this->assign('val', $this->_tpl_vars['val']+1);
    echo $this->_tpl_vars['val'];
    

    or

    {assign var=var value=1}
    {capture assign=var}{$var+1}{/capture}
    {$var} // displays 2
    

    Which in turn will be compiled as:

    $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'];
    

    another approach would be to write a small plugin:

    // 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']);
       }
    }
    

    The function would then be called like this, notice that step is optional and if not given the variable will be incremented by one:

    {assign var=var value=0}
    {inc var=var step=2}
    {$var} // displays 2
    

    Reference
    Smarty {assign}
    Smarty {capture}
    Extending Smarty With Plugins

    0 讨论(0)
提交回复
热议问题