使用Smarty将元素排列成列

时间:2009-03-19 11:34:52

标签: php smarty template-engine

我有一个生成元素数组的php页面。为简单起见,我们假设它按数字顺序包含数字1-5。这些数字需要相等(或尽可能接近相等)分成两列(使用html表),如下所示:

1   4
2   5
3

列数可能会在将来发生变化。由于这是对表示级别的更改,因此我认为它应该是可以通过仅在模板文件中进行更改来实现的。这告诉我,Smarty应该将元素划分为列。

有没有办法用Smarty(以及如何)实现这一点,还是应该让php文件完成所有工作?

2 个答案:

答案 0 :(得分:5)

可以巧妙地做到这一点,但由于HTML和CSS实际上并不支持列,所以很难做到。它涉及计算数组中有多少项,并首先使用{section}标签抓住项目的前半部分(向上舍入),并将它们显示在一列中,然后单独的{section}抓住第二列将项目的一半(四舍五入)放在第二列中。

对于{section},您可以指定要开始的数组索引以及所需的项目数。如果将数组中的项目数设置为另一个变量,则可以计算它。

您可以尝试这样的代码 - 但我担心我没有测试过这些计算,所以它可能是错误的......

<td>
  {section name=myitem loop=$items max=(($itemcount/2)+0.499)}
    {$items[myitem]}
  {/section}
</td>
<td>
  {section name=myitem loop=$items start=(($itemcount/2)+0.499)}
    {$items[myitem]}
  {/section}
</td>

答案 1 :(得分:0)

这里我的解决方案使用foreach和迭代:

<ul>
{foreach from=$items item=item name=firstFE}
            {if $smarty.foreach.firstFE.index lt ($items|@count / 2)}
               <li>{$item->title}</li>
            {/if}
{/foreach}
</ul><ul>
{foreach from=$items item=item name=secFE}
            {if $smarty.foreach.secFE.index gte ($items|@count / 2)}
               <li>{$item->title}</li>
            {/if}
{/foreach}
</ul>