web-dev-qa-db-ja.com

表示されずにsmartyで割り当てられた変数をどのようにインクリメントしますか

だから私はsmartyで割り当てられた変数を持っています:

{assign var=number value=0}

今、私はそれを使用してそれをインクリメントすることができます

{$number++}

または

{++$number}

これはまさに私が必要なものですが、唯一の問題は、ページに$ numberの値を表示することです。値を増やしても表示しない方法はありますか?

これはループ内では使用されません。そうでない場合は、反復やインデックスなどを使用します。

41
Francis Lewis

これを行うことができます:

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

上記は次のようにコンパイルされます。

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

または

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

次のようにコンパイルされます:

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

別のアプローチは、小さなプラグインを書くことです。

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

関数は次のように呼び出されます。stepはオプションであり、指定されない場合、変数は1ずつ増加します。

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

参照
Smarty {assign}
Smarty {capture}
プラグインによるSmartyの拡張

73
Cyclonecode

このようにするだけできれいになります...

{$number = $number +1}
15
trapper

組み込みのSmarty "counter" >> {counter}要素を使用する方が良いです。

したがって、テンプレートでは次を使用できます。

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

それはあなたのために印刷されます:

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

したがって、少なくとも、print=falseオプションで使用でき、カウンターはありますが、非表示になっています。

「可変的な方法」(上のセクションの書き込みのように)で使用する場合は、html/cssで非表示にするか、単に印刷させないようにすることもできます。

4
huncyrus