web-dev-qa-db-fra.com

Comment incrémenter une variable assignée dans smarty sans l'afficher

J'ai donc une variable assignée dans smarty:

{assign var=number value=0}

Maintenant je peux l'incrémenter en utilisant

{$number++}

ou

{++$number}

C’est exactement ce dont j’ai besoin, le seul problème est qu’il affiche la valeur de $ number sur la page ... Est-ce qu’il ya un moyen d’incrémenter la valeur mais de ne pas l’afficher?

Ceci n'est pas utilisé dans une boucle, sinon j'utiliserais quelque chose comme l'itération ou l'index.

39
Francis Lewis

Vous pourriez faire ceci:

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

Ce qui précède sera compilé pour:

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

ou

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

Ce qui à son tour sera compilé comme:

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

une autre approche serait d'écrire un petit 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']);
   }
}

La fonction serait alors appelée comme ceci, notez que step est optionnel et si non donné la variable sera incrémentée de un:

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

Référence
Smarty {assign}
Smarty {capture}
Extension de Smarty avec des plugins

71
Cyclonecode

C'est plus propre juste de le faire comme ça ...

{$number = $number +1}
13
trapper

Il est préférable d’utiliser le "compteur" Smarty >> >> {counter} intégré.

Donc, dans le modèle, vous pouvez utiliser: 

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

Il imprimera pour vous: 

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

Donc, au moins, vous pouvez l’utiliser avec l’option print=false et vous avez le compteur mais il est caché. 

Si vous l'utilisez de la "manière variable" (comme la section supérieure en écriture), vous pouvez aussi le cacher avec html/css ou tout simplement ne pas le laisser imprimer :) 

4
huncyrus

Si je devais faire cela, je ferais quelque chose comme ceci: {php}$number++{/php} mais il est très moche de devoir utiliser php dans un template smarty Cela pourrait suggérer qu'il existe une meilleure façon de faire ce que vous aviez prévu de faire.

0
ridecar2