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