【问题标题】:Arrange elements into columns with Smarty使用 Smarty 将元素排列到列中
【发布时间】:2009-03-19 11:34:52
【问题描述】:
我有一个生成元素数组的 php 页面。为简单起见,假设它包含按数字顺序排列的数字 1-5。这些数字需要相等(或尽可能接近相等)分成两列(使用 html 表),如下所示:
1 4
2 5
3
列数将来可能会发生变化。由于这是表示级别的更改,我认为它应该是可以通过仅在模板文件中进行更改来实现的。这向我表明,应该由 Smarty 处理将元素划分为列。
有没有办法通过 Smarty(以及如何)实现这一点,或者我应该让 php 文件完成所有工作?
【问题讨论】:
标签:
php
smarty
template-engine
【解决方案1】:
在 smarty 中可以做到这一点,但是由于 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>
【解决方案2】:
这是我使用 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>