这是代码:
{section name=k loop=$obj->mProduct.attributes}
{* Generate a new select tag? *}
{if $smarty.section.k.first ||
$obj->mProduct.attributes[k].attribute_name !==
$obj->mProduct.attributes[k.index_prev].attribute_name}
{$obj->mProduct.attributes[k].attribute_name}:
<select name="attr_{$obj->mProduct.attributes[k].attribute_name}">
{/if}
{* Generate a new option tag *}
<option value="{$obj->mProduct.attributes[k].attribute_value}">
{$obj->mProduct.attributes[k].attribute_value}
</option>
{* Close the select tag? *}
{if $smarty.section.k.last ||
$obj->mProduct.attributes[k].attribute_name !==
$obj->mProduct.attributes[k.index_next].attribute_name}
</select>
{/if}
{/section}
我不断获得两个以上的选择陈述。
请帮助......
我期待:
Color:<select name="attr_Color">
<option value="White">White</option>
<option value="Black">Black</option>
//....
</select>
Size:<select name="attr_Size">
<option value="XL">XL</option>
<option value="L">L</option>
//....
</select>
但是,我得到的是多个选择标签,而不仅仅是两个:
Color: <select name="attr_Color">
<option value="White">White</option>
</select>
Color: <select name="attr_Color">
<option value="black">black</option>
</select>
//...
Size: <select name="attr_Size">
<option value="l">l</option>
</select>
Size: <select name="attr_Size">
<option value="XL">XL</option>
</select>
//...
我可以用PHP很好地解决这个问题,然而,Smarty 3证明是顽固的。你们应该帮助我。
我可能会迁移到twigs以将表示层与业务逻辑分开。
答案 0 :(得分:0)
首先,将您的标签移到smarty for循环之外。例如:
{* Generate a new select tag? *}
<select name="attr_{$obj->mProduct.attributes[k].attribute_name}">
{section name=k loop=$obj->mProduct.attributes}
{* Generate a new option tag *}
<option value="{$obj->mProduct.attributes[k].attribute_value}">
{$obj->mProduct.attributes[k].attribute_value}
</option>
{/section}
</select>
这会将所有属性返回到一个选择框中。您仍然需要以某种方式按属性名称进行分组。这有点超出了你的问题的范围,但是:
SQL方法
您需要对属性名称执行GROUP BY
DISTINCT
SQL查询以查找所有相关属性类型,然后迭代每种类型的值。
PHP方法 继续以与现在相同的方式查询,但在智能模板中呈现数据之前,请在后端预处理数据:
$attributes = array()
[for each row in sql query]
if ($attributes[$row.name] == null) {
$attributes[$row.name] = array()
}
$array_push($attributes[$row.name], $row.value)
[/end for]
最后,你会有一个嵌套的for循环,它会做这样的事情(伪代码):
[For each attribute_name in names]
<select name="{attribute_name}">
[For each attribute]
<option value="{$obj->mProduct.attributes[k].attribute_value}">
{$obj->mProduct.attributes[k].attribute_value}
</option>
[/end for (attribute)]
</select>
[/end for (names)]
如果需要,可以将整个<select/>
包装在if语句中,以便在没有可供选择的属性时隐藏它。