Smarty中用section完成主从表循环

在我的“任氏有无轩”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的语法还是稍微复杂了一些。

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *