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

j'ai Donc attribué une variable smarty:

{assign var=number value=0}

maintenant je peux l'incrémenter en utilisant

{$number++}

ou

{++$number}

ce qui est exactement ce dont j'ai besoin, seul problème est, il affiche la valeur de $number sur la page. Y a-t-il un moyen d'augmenter la valeur sans l'afficher?

ceci n'est pas utilisé à l'intérieur d'une boucle sinon j'utiliserais quelque chose comme itération ou index.

38
demandé sur Cyclonecode 2011-12-30 03:48:42

4 réponses

Vous pourriez faire ceci:

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

Le dessus sera compilé à:

$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

Qui sera compilé en tant que:

$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 elle n'est pas donnée la variable sera incrémentée par 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

69
répondu Cyclonecode 2018-06-29 09:10:21

C'est plus propre juste le faire comme cela...

{$number = $number +1}
13
répondu trapper 2013-08-27 09:16:04

Mieux vaut utiliser le construit en Smarty "compteur" >> {counter} élément.

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 va imprimer pour vous:

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

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

Si vous l'utilisez de la "variable" (comme la section supérieure écrire) vous pouvez également masquer à l'aide de html/css, ou tout simplement ne pas laisser d'impression :)

4
répondu huncyrus 2015-09-20 11:06:53

Si je devais faire ce que je voudrais faire quelque chose comme ce qui suit: {php}$number++{/php} mais c'est moche de devoir utiliser php dans un template smarty. Ceci pourrait suggérer qu'il existe une meilleure façon de faire ce que vous aviez prévu de faire.

0
répondu ridecar2 2011-12-29 23:53:13