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.
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
C'est plus propre juste de le faire comme ça ...
{$number = $number +1}
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 :)
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.