【问题标题】:How to use a dynamic smarty variable in foreach loop如何在 foreach 循环中使用动态 smarty 变量
【发布时间】:2011-01-17 09:28:44
【问题描述】:

谁能告诉我如何在 smarty foreach 循环中使用动态变量。我正在尝试在 prestashop 中创建一个模块,并且非常接近完成它。 这是我的代码:


//file name index.php
foreach( $subCategories as $s )
{
    $foo  = intval($s['id_category']);
    $k    = new Category($foo);
    $var1 = "subSubCategories.$foo";
    $var1 = $k->getSubCategories(1); 

    $smarty->assign(array('foo'.$foo => $var1)); 
}

//file name:index.tpl

{assign var=foo value=$foo$cat}

//where $cat is a variable that counts the number of categories

{if isset($foo) AND $foo}
    {foreach from=$foo item=subCategories name=homesubCategories}
        <p>{$subCategories.name}</p>
    {/foreach}
{else}
    <p>{l s='test failed'}</p>
{/if}

我已经用尽了我所有的资源和知识,此刻感到很无助。所以请帮帮我。


我正在尝试根据子类别的数量创建动态变量('foo'.$foofoo1foo2 等)。到目前为止,我认为我是成功的。现在转到 tpl 文件,这里我想使用 foreach 访问动态创建的变量(foo2foo3 等)。现在,如果我这样做:{assign var=foo value=$foo3} 我成功地使用相同的 foreach 循环从该子类别中获取值。但是当我这样做时:{assign var=foo value=$foo$catx}$catx 存储类别 id 的值)它失败了。请帮忙。

【问题讨论】:

    标签: variables dynamic smarty


    【解决方案1】:

    我在部分循环中使用这样的代码(对于 Smarty 2):

    {section  name=buildings loop=7 start=1 step=1 max=7}
    <tr>
          {assign var=part_number value="part`$smarty.section.buildings.index`_number"}
          <td class="number">
            <input class="number xshort" name="part{$smarty.section.buildings.index}_number" value="{$data.$part_number}" type="text">
          </td>
    </tr>
    {/section}
    

    如您所见,创建了动态变量 part_number(参见值块中的 反引号)。然后,您可以将其用作 value="{$data.$part_number}"。

    【讨论】:

      【解决方案2】:

      您的$smarty-&gt;assign() 呼叫不正确;你只有一个参数被发送给它,但它是needs two parameters(变量名,后跟值)。根据您的模板代码(循环通过变量 $foo),您的循环在 PHP 中应该是这样的:

      //file name index.php
      $subcats = array();
      foreach($subCategories as $s) {
          $foo = intval($s['id_category']);
          $k = new Category($foo);    
          $subcats[$foo] => $k->getSubCategories(1);
      }
      $smarty->assign('foo', $subcats);
      

      那么看起来您也没有完全正确地使用 Smarty {foreach}。您正在声明 foreach 循环的 name 属性,但随后没有正确使用它。假设$k-&gt;getSubCategories(1) 返回一个字符串,那么聪明的代码就必须是:

      {foreach from=$foo item=subCategories}<p>{$subCategories}</p>{/foreach}
      

      如果$k-&gt;getSubCategories(1) 返回一个带有“homesubCategories”元素的数组(我认为您正在尝试使用您的Smarty 代码),您仍然不需要foreach 上的“名称”值。然后你就这样做:

      {foreach from=$foo item=subCategories}<p>{$subCategories.homesubCategories}</p>{/foreach}
      

      【讨论】:

      • 感谢您的回复。我正在尝试根据子类别的数量创建动态变量('foo'.$foo 即 foo1、foo2 等)。到目前为止,我认为我是成功的。现在转到 tpl 文件,这里我想使用 foreach 访问动态创建的变量(foo2、foo3 等)。现在,如果我这样做: {assign var=foo value=$foo3} 我成功地使用相同的 foreach 循环从该子类别中获取值。但是我这样做:{assign var=foo value=$foo$catx}(其中 $catx 存储类别 id 的值)它失败了。请帮助
      • 尝试用双引号将“值”赋值中的变量括起来,然后将其中的每个变量反引号? (smarty.net/docsv2/en/language.syntax.quotes.tpl)
      • 或者,重新考虑您的数据设计,并将子类别作为数组中的子元素(通过其 ID 号访问),而不是串联变量名称(“动态变量”,如您放它),这将是一个更精简的数据设计。
      【解决方案3】:

      使用$foo = intval($s['id_category']);,您将$foo 定义为整数。 然后你用$smarty-&gt;assign(array('foo'.**$foo** =&gt; $var1));连接字符串

      正确的是:

      $foo = $s['id_category'];
      $smarty->assign(array('foo'.$foo => $var1));
      

      【讨论】:

      • 感谢您的回复。但它似乎并没有解决问题。
      【解决方案4】:

      动态命名的变量通常是一个非常糟糕的设计选择,使一切变得比实际需要的困难得多。

      如果您有一组元素需要循环或索引,请将它们放入数组中;那么你不需要做任何魔法赋值,因为你可以使用普通的foreach循环或数组键访问:

      //file name index.php
      
      // Build the array first, then assign it to Smarty at the end
      $foo_array = array();
      foreach($subCategories as $s)
      {
          $foo = intval($s['id_category']);
          $k = new Category($foo);
      
          // This line is redundant as you over-write on the following line:
          // $var1 = "subSubCategories.$foo";
      
          $var1 = $k->getSubCategories(1);
          $foo_array[ $foo ] = $var1;
      }
      // Assigning one variable, so just pass name and value to $smarty->assign()
      $smarty->assign('foo_array', $foo_array); 
      

      //file name:index.tpl
      {* Look for the entry in the outer array with key "$cat", then loop over it *}
      {foreach from=$foo_array[$cat] item=subCategories}
          <p>{$subCategories.name}</p>
      {/foreach}
      

      【讨论】:

        【解决方案5】:

        可以使用以下语句调用模板中动态创建的变量:

        如果例如$index = 2

        {$foo{$index}}
        

        那么这将调用名称为{$foo2}的变量

        【讨论】:

          猜你喜欢
          • 2016-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-26
          • 2012-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多