可以做到任何{section}做到的功能, 而且更简单和有更清晰的语法。一般更推荐使用{foreach}语法.

    Note

    {section}不能用于循环关联数组,它仅能循环数字索引的、连续下标的 (0,1,2,…)数组。 要循环关联数组,请使用。

    可选标记:

    名称 说明
    nocache 关闭{section}缓存
    • nameloop是必须的参数。

    • {section}name可以是任意字符,如数字、字母或下划线等,和 PHP 变量一样的命名规则。

    • {section}可以嵌套,而且嵌套的{section}名称必须唯一。

    • loop一般是数组,决定了{section}的循环次数。 同时你也可以传递一个整数指定循环次数。

    • 当在{section}内显示变量时, {section}name必须给变量名称加上[方括号].

    • 如果loop属性为空,{sectionelse}将执行。

    • {section}同时还有自己的属性。 这些属性都是通过: 来使用,其中“name”是name属性.

    • {section}的内置属性有: index, , index_next, , first, , rownum, , show, .


    Example 7.63. 简单的{section}例子

    赋值一个数组

    模板将输出该数组

    1. {* this example will print out all the values of the $custid array *}
    2. {section name=customer loop=$custid}
    3. {section customer $custid} {* short-hand *}
    4. id: {$custid[customer]}<br />
    5. {/section}
    6. <hr />
    7. {* print out all the values of the $custid array reversed *}
    8. {section name=foo loop=$custid step=-1}
    9. {section foo $custid step=-1} {* short-hand *}
    10. {$custid[foo]}<br />
    11. {/section}
    12.  

    输出:

    1. id: 1000<br />
    2. id: 1001<br />
    3. id: 1002<br />
    4. <hr />
    5. id: 1002<br />
    6. id: 1001<br />
    7. id: 1000<br />
    8.  


    Example 7.64. {section}不使用赋值数组

    1. {section name=foo start=10 loop=20 step=2}
    2. {$smarty.section.foo.index}
    3. {/section}
    4. <hr />
    5. {section name=bar loop=21 max=6 step=-2}
    6. {$smarty.section.bar.index}
    7. {/section}
    8.  

    输出:

    1. 10 12 14 16 18
    2. <hr />
    3. 20 18 16 14 12 10
    4.  


    Example 7.65. 给{section}设置名称

    name属性可以是任意字符,请参见PHP 变量定义. 它是用于引用{section}的数据.

    1. {section name=anything loop=$myArray}
    2. {$myArray[anything].foo}
    3. {$name[anything]}
    4. {$address[anything].bar}
    5. {/section}
    6.  


    Example 7.66. {section}中使用关联数组

    下面是使用{section}来输出关联数组的例子。 这里是在PHP代码中赋值$contacts 数组到Smarty。

    1. <?php
    2. $data = array(
    3. array('name' => 'John Smith', 'home' => '555-555-5555',
    4. 'cell' => '666-555-5555', 'email' => 'john@myexample.com'),
    5. array('name' => 'Jack Jones', 'home' => '777-555-5555',
    6. 'cell' => '888-555-5555', 'email' => 'jack@myexample.com'),
    7. array('name' => 'Jane Munson', 'home' => '000-555-5555',
    8. 'cell' => '123456', 'email' => 'jane@myexample.com')
    9. );
    10. $smarty->assign('contacts',$data);
    11. ?>
    12.  

    该模板用于显示$contacts

    1. {section name=customer loop=$contacts}
    2. <p>
    3. name: {$contacts[customer].name}<br />
    4. home: {$contacts[customer].home}<br />
    5. cell: {$contacts[customer].cell}<br />
    6. e-mail: {$contacts[customer].email}
    7. </p>
    8. {/section}
    9.  
    1. <p>
    2. name: John Smith<br />
    3. home: 555-555-5555<br />
    4. cell: 666-555-5555<br />
    5. e-mail: john@myexample.com
    6. </p>
    7. <p>
    8. name: Jack Jones<br />
    9. home phone: 777-555-5555<br />
    10. cell phone: 888-555-5555<br />
    11. e-mail: jack@myexample.com
    12. </p>
    13. <p>
    14. name: Jane Munson<br />
    15. home phone: 000-555-5555<br />
    16. cell phone: 123456<br />
    17. e-mail: jane@myexample.com
    18. </p>
    19.  


    Example 7.67. {section}的loop属性的演示例子

    例子假定$custid, $name$address三个数组中对应的值都有着相同的数字下标。 首先从PHP代码中赋值到Smarty

    1. <?php
    2.  
    3. $id = array(1001,1002,1003);
    4. $smarty->assign('custid',$id);
    5. $fullnames = array('John Smith','Jack Jones','Jane Munson');
    6. $smarty->assign('name',$fullnames);
    7.  
    8. $addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
    9. $smarty->assign('address',$addr);
    10.  
    11. ?>
    12.  

    loop值仅是指定循环的次数。 你可以在{section}中给它设置任何的变量。 在多个数组循环时比较有用。 你可以传递一个数组来让其计算总数而指定循环次数,也可以直接指定一个循环次数的整数。

    1. {section name=customer loop=$custid}
    2. <p>
    3. id: {$custid[customer]}<br />
    4. name: {$name[customer]}<br />
    5. address: {$address[customer]}
    6. </p>
    7. {/section}
    8.  

    输出:


    Example 7.68. {section}嵌套

    {section}可以嵌套任意的深度。通过嵌套{section}你可以处理多维数组。 下面是例子的.php文件。

    1. <?php
    2.  
    3. $id = array(1001,1002,1003);
    4. $smarty->assign('custid',$id);
    5.  
    6. $fullnames = array('John Smith','Jack Jones','Jane Munson');
    7. $smarty->assign('name',$fullnames);
    8.  
    9. $addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
    10. $smarty->assign('address',$addr);
    11.  
    12. $types = array(
    13. array( 'home phone', 'cell phone', 'e-mail'),
    14. array( 'home phone', 'web'),
    15. array( 'cell phone')
    16. );
    17. $smarty->assign('contact_type', $types);
    18.  
    19. $info = array(
    20. array('555-555-5555', '666-555-5555', 'john@myexample.com'),
    21. array( '123-456-4', 'www.example.com'),
    22. array( '0457878')
    23. );
    24. $smarty->assign('contact_info', $info);
    25.  
    26. ?>
    27.  

    在这个模板里, $contact_type[customer]是客户联系信息的数组

    1. {section name=customer loop=$custid}
    2. <hr>
    3. id: {$custid[customer]}<br />
    4. name: {$name[customer]}<br />
    5. address: {$address[customer]}<br />
    6. {section name=contact loop=$contact_type[customer]}
    7. {$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
    8. {/section}
    9. {/section}
    10.  

    输出:

    1. <hr>
    2. id: 1000<br />
    3. name: John Smith<br />
    4. address: 253 N 45th<br />
    5. home phone: 555-555-5555<br />
    6. cell phone: 666-555-5555<br />
    7. e-mail: john@myexample.com<br />
    8. <hr>
    9. id: 1001<br />
    10. name: Jack Jones<br />
    11. address: 417 Mulberry ln<br />
    12. home phone: 123-456-4<br />
    13. web: www.example.com<br />
    14. <hr>
    15. id: 1002<br />
    16. name: Jane Munson<br />
    17. address: 5605 apple st<br />
    18. cell phone: 0457878<br />
    19.  


    Example 7.69. {sectionelse}的数据库例子

    数据库查找的结果(如 ADODB 或 PEAR) 传递到 Smarty

    1. <?php
    2. $sql = 'select id, name, home, cell, email from contacts '
    3. ."where name like '$foo%' ";
    4. $smarty->assign('contacts', $db->getAll($sql));
    5. ?>
    6.  

    模板将以表格形式显示数据结果

    1. <table>
    2. <tr><th>&nbsp;</th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
    3. {section name=co loop=$contacts}
    4. <tr>
    5. <td><a href="view.php?id={$contacts[co].id}">view<a></td>
    6. <td>{$contacts[co].name}</td>
    7. <td>{$contacts[co].home}</td>
    8. <td>{$contacts[co].cell}</td>
    9. <td>{$contacts[co].email}</td>
    10. <tr>
    11. {sectionelse}
    12. <tr><td colspan="5">No items found</td></tr>
    13. {/section}
    14. </table>
    15.  

    .index

    index是当前数组的索引值,从0开始,或者从设定的start值开始。它将每次循环增加1或者增加指定的step值。

    说明

    如果 stepstart都没有被指定,那么它会和属性很像, 只不过它是从0开始,而iteration是从1开始.


    Example 7.70. {section} index 属性

    说明

    $custid[customer.index]$custid[customer] 是一样的.

    1. {section name=customer loop=$custid}
    2. {$smarty.section.customer.index} id: {$custid[customer]}<br />
    3. {/section}
    4.  

    输出:

    1. 0 id: 1000<br />
    2. 1 id: 1001<br />
    3. 2 id: 1002<br />
    4.  

    index_prev上一次循环的索引值。在第一次循环的时候,它是-1.

    .index_next

    index_next是下一次循环的索引值。 在最后一次循环时,它会比当前索引加1,或者加上指定的step属性值。


    Example 7.71. index, index_nextindex_prev 属性

    1. <?php
    2. $data = array(1001,1002,1003,1004,1005);
    3. $smarty->assign('rows',$data);
    4. ?>
    5.  

    在表格中显示数组

    1. {* $rows[row.index] and $rows[row] are identical in meaning *}
    2. <table>
    3. <tr>
    4. <th>index</th><th>id</th>
    5. <th>index_next</th><th>next_id</th>
    6. </tr>
    7. {section name=row loop=$rows}
    8. <tr>
    9. <td>{$smarty.section.row.index}</td><td>{$rows[row]}</td>
    10. <td>{$smarty.section.row.index_prev}</td><td>{$rows[row.index_prev]}</td>
    11. <td>{$smarty.section.row.index_next}</td><td>{$rows[row.index_next]}</td>
    12. </tr>
    13. {/section}
    14. </table>
    15.  

    输出:

    1. index id index_prev prev_id index_next next_id
    2. 0 1001 -1 1 1002
    3. 1 1002 0 1001 2 1003
    4. 2 1003 1 1002 3 1004
    5. 3 1004 2 1003 4 1005
    6. 4 1005 3 1004 5
    7.  

    .iteration

    iteration是当前的循环次数,从1开始。

    Note


    Example 7.72. iteration属性

    模板将按step=2来显示$arr的数组元素

    1. {section name=cu loop=$arr start=5 step=2}
    2. iteration={$smarty.section.cu.iteration}
    3. index={$smarty.section.cu.index}
    4. id={$custid[cu]}<br />
    5. {/section}
    6.  

    输出:

    1. iteration=1 index=5 id=3005<br />
    2. iteration=2 index=7 id=3007<br />
    3. iteration=3 index=9 id=3009<br />
    4. iteration=4 index=11 id=3011<br />
    5. iteration=5 index=13 id=3013<br />
    6. iteration=6 index=15 id=3015<br />
    7.  

    这里是另一个例子,使用iteration属性来显示表格, 并且每五行显示一次表头。

    1. <table>
    2. {section name=co loop=$contacts}
    3. {if $smarty.section.co.iteration is div by 5}
    4. <tr><th>&nbsp;</th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
    5. {/if}
    6. <tr>
    7. <td><a href="view.php?id={$contacts[co].id}">view<a></td>
    8. <td>{$contacts[co].name}</td>
    9. <td>{$contacts[co].home}</td>
    10. <td>{$contacts[co].cell}</td>
    11. <td>{$contacts[co].email}</td>
    12. <tr>
    13. {/section}
    14. </table>
    15.  

    一个用iteration属性来交替显示文章每三行颜色的例子

    1. <table>
    2. {section name=co loop=$contacts}
    3. {if $smarty.section.co.iteration is even by 3}
    4. <span style="color: #ffffff">{$contacts[co].name}</span>
    5. {else}
    6. <span style="color: #dddddd">{$contacts[co].name}</span>
    7. {/if}
    8. {/section}
    9. </table>
    10.  

    Note

    "is div by"语法是PHP取模运算的一个变种。取模运算{if $smarty.section.co.iteration % 5 == 1}也是可用的。

    你还可以用"is odd by"来反转交替。

    .first

    如果当前的循环是第一次,first将被设成 TRUE

    .last

    如果当前的循环是最后一次,那么last将为 TRUE


    Example 7.73. {section} 属性 firstlast

    例子循环了 $customers数组,在循环最前面输出头部区域,在底端输出底部区域的内容。 同时也使用了 属性.

    1. {section name=customer loop=$customers}
    2. {if $smarty.section.customer.first}
    3. <table>
    4. <tr><th>id</th><th>customer</th></tr>
    5. {/if}
    6.  
    7. <tr>
    8. <td>{$customers[customer].id}}</td>
    9. <td>{$customers[customer].name}</td>
    10. </tr>
    11.  
    12. {if $smarty.section.customer.last}
    13. <tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
    14. </table>
    15. {/if}
    16. {/section}
    17.  

    .rownum

    rownum是当前循环的次数,从1开始。它是 的别名。

    .loop

    loop 是最后一次{section}循环的下标。 它可以在{section}循环中或者循环后使用。


    Example 7.74. {section} 属性 loop

    1. {section name=customer loop=$custid}
    2. {$smarty.section.customer.index} id: {$custid[customer]}<br />
    3. {/section}
    4. There are {$smarty.section.customer.loop} customers shown above.
    5.  

    输出:

    1. 0 id: 1000<br />
    2. 1 id: 1001<br />
    3. 2 id: 1002<br />
    4. There are 3 customers shown above.
    5.  

    show是一个布尔值参数。如果设置为FALSE,section将不会被显示。 如果有{sectionelse}显示,它们将被交替显示。


    Example 7.75. show 属性

    布尔值 $show_customer_info 可以在PHP程序赋值并传递到模板中, 可以控制section的显示与否。

    1. {section name=customer loop=$customers show=$show_customer_info}
    2. {$smarty.section.customer.rownum} id: {$customers[customer]}<br />
    3. {/section}
    4.  
    5. {if $smarty.section.customer.show}
    6. the section was shown.
    7. {else}
    8. the section was not shown.
    9. {/if}
    10.  

    输出:

    1. 1 id: 1000<br />
    2. 2 id: 1001<br />
    3. 3 id: 1002<br />
    4.  
    5. the section was shown.
    6.  

    .total

    total{section}的总数。 它可以在{section}循环中或者循环后使用。


    Example 7.76. total例子

    1. {section name=customer loop=$custid step=2}
    2. {$smarty.section.customer.index} id: {$custid[customer]}<br />
    3. {/section}
    4. There are {$smarty.section.customer.total} customers shown above.
    5.  

    参见, {for}, 和 $smarty.section.