在我的“任氏有无轩”WEB界面中,有一个是读书页面。这个页面列出了我非但读过、而且写过相关评论的书籍,各个评论将链接到对应的BLOG文章去。 显然,这是一个很典型的“一对多”的主从表循环。原来我是简单的用嵌套循环,现在既然用了Smarty引擎,我就改用了Smarty中的section语法。
=======================
Smarty中的section语法说来不复杂——特别是在不嵌套的时候:
<?php
//从PHP脚本中assign()一个数组给Smarty:
$data = array(1000,1001,1002);
$smarty->assign('custid',$data);
?>
输出数组的模板:
{* 本例将打印出$custid数组的所有值 *}
{section name=customer loop=$custid}
id: {$custid[customer]}
{/section}
{* 逆序打印所有$custid数组中的值 *}
{section name=foo loop=$custid step=-1}
{$custid[foo]}
{/section}
语法是自明的,这里不多做解释。如果牵涉到主从表的嵌套循环,那么语法会稍微复杂一些:
{section name=reading loop=$readings}
//循环显示外层循环的内容
{section name=reading_detail loop=$reading_details[reading]}
{$reading_details[reading][reading_detail].reviewid} <a
href={$reading_details[reading][reading_detail].uri}>
{$reading_details[reading][reading_detail].title}
</a>
{$reading_details[reading][reading_detail].datein}
{/section}
{/section}
可见,外层循环(主循环)还是保持基本语法不变,内层的语法中需要特别注意loop=$reading_details[reading]这个loop变量的控制,以及循环显示内层循环的内容时对索引的引用控制。 当然,我使用的是一种最直截了当的方法。在对应的PHP文件中,对各个循环变量可以使用一个类似的嵌套循环来赋值:
$i=0;
$arr1=array();
$arr2=array();
foreach ($result1 as $master)
{
$arr[$i]['aField']=$master['aField'];
// 更多的外层赋值
$j=0;
foreach ($result2 as $detail)
{
$arr[$i][$j]['anotherField']=$detail['anotherField'];
// 更多的内层赋值
$j++;
}
$i++;
}
这样就可以完成两个循环变量的初始化,然后再用Smarty赋值给模板变量即可。 Smarty中的section是非常强大的循环控制语句。任何需要使用Smarty进行模板操作的人,必须掌握其语法。也许,它的唯一不足也在于此:对于一个MVC完全隔离,前端界面可能由根本不懂计算机编程的设计人员完成的前端来说,section的语法还是稍微复杂了一些。
Leave a Reply