Tag: 主从表

  • 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的语法还是稍微复杂了一些。