如何在foreach循环中使用动态智能变量

时间:2011-01-17 09:28:45

标签: variables dynamic smarty

任何人都可以告诉我如何在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'.$foo,即foo1foo2等等,具体取决于子类别的数量。我认为在这一点上我是成功的。现在转到tpl文件,在这里我想使用foreach访问动态创建的变量(foo2foo3等)。现在,如果我这样做:{assign var=foo value=$foo3}我成功使用相同的foreach循环从此子类别中获取值。但是当我这样做时:{assign var=foo value=$foo$catx}(其中$catx存储类别ID的值)它失败了。请帮忙。

5 个答案:

答案 0 :(得分:2)

我在section循环中使用这样的代码(对于 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}”。

答案 1 :(得分:0)

使用$foo = intval($s['id_category']);,您将$foo定义为整数。 然后用$smarty->assign(array('foo'.**$foo** => $var1));

连接字符串

正确的是:

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

答案 2 :(得分:0)

您的$smarty->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->getSubCategories(1)返回一个字符串,那么聪明的代码就必须是:

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

如果$k->getSubCategories(1)返回一个带有'homesubCategories'元素的数组(我认为你试图使用你的Smarty代码),你仍然不需要'name'值。的foreach。那你就做了:

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

答案 3 :(得分:0)

动态命名变量通常是一个非常糟糕的设计选择,使一切变得更加困难。

如果你有一组元素需要循环或索引,将它们放在一个数组中;然后你不需要做任何神奇的任务,因为你可以使用普通的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}

答案 4 :(得分:0)

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

例如$index = 2

{$foo{$index}}

然后这将调用名为{$foo2}

的变量