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