此代码不断生成两个以上的选择标记

时间:2017-04-29 13:10:02

标签: php smarty

这是代码:

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

我不断获得两个以上的选择陈述。

请帮助......

here is the picture of the database,

我期待:

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以将表示层与业务逻辑分开。

1 个答案:

答案 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语句中,以便在没有可供选择的属性时隐藏它。