Smarty是什么?
为什么要使用?
用例和工作流程
语法对比
模板继承
最佳实践
快速入门
{foreach}
用于循环遍历数据数组。 {foreach}
具有比 {section}
循环更简单、更简洁的语法,并且还可以循环遍历关联数组。
{foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}
此 foreach 语法不接受任何已命名的属性。此语法在 Smarty 3 中是新的,但 Smarty 2.x 语法 {foreach from=$myarray key="mykey" item="myitem"}
仍受支持。
{foreach}
循环可以嵌套。
array
变量通常是值数组,它决定了 {foreach}
将循环的次数。您还可以传递一个整数以进行任意循环。
当 array
变量中没有值时,{foreachelse}
将被执行。
{foreach}
构造是 {break}
、{continue}
。
除了指定 key
变量,您还可以通过 {$item@key}
访问循环项的当前键(请参见以下示例)。
$var@property
语法对 Smarty 3 而言是新的,不过,当使用 Smarty 2 {foreach from=$myarray key="mykey" item="myitem"}
样式语法时,$smarty.foreach.name.property
语法仍然受支持。
虽然你可以使用语法 {foreach $myArray as $myKey => $myValue}
获取数组键,但在 foreach 循环内,键始终可用作 $myValue@key
。
选项参数
名称 | 描述 |
---|---|
nocache | 禁用 {foreach} 循环的缓存 |
示例 7.30。一个简单的 {foreach}
循环
<?php $arr = array('red', 'green', 'blue'); $smarty->assign('myColors', $arr); ?>
模板以无序列表的形式输出 $myColors
<ul> {foreach $myColors as $color} <li>{$color}</li> {/foreach} </ul>
上述示例将输出
<ul> <li>red</li> <li>green</li> <li>blue</li> </ul>
示例 7.31。演示额外的 key
变量
<?php $people = array('fname' => 'John', 'lname' => 'Doe', 'email' => '[email protected]'); $smarty->assign('myPeople', $people); ?>
模板以键/值对输出 $myArray
。
<ul> {foreach $myPeople as $value} <li>{$value@key}: {$value}</li> {/foreach} </ul>
上述示例将输出
<ul> <li>fname: John</li> <li>lname: Doe</li> <li>email: [email protected]</li> </ul>
示例 7.32。使用嵌套 item
和 key
的 {foreach}
将一个数组分配给 Smarty,键包含每个循环值的关键。
<?php $smarty->assign('contacts', array( array('phone' => '555-555-1234', 'fax' => '555-555-5678', 'cell' => '555-555-0357'), array('phone' => '800-555-4444', 'fax' => '800-555-3333', 'cell' => '800-555-2222') )); ?>
输出 $contact
的模板。
{* key always available as a property *} {foreach $contacts as $contact} {foreach $contact as $value} {$value@key}: {$value} {/foreach} {/foreach} {* accessing key the PHP syntax alternate *} {foreach $contacts as $contact} {foreach $contact as $key => $value} {$key}: {$value} {/foreach} {/foreach}
上述示例任意一个都将输出
phone: 555-555-1234 fax: 555-555-5678 cell: 555-555-0357 phone: 800-555-4444 fax: 800-555-3333 cell: 800-555-2222
示例 7.33。带有 {foreachelse} 的数据库示例
循环针对搜索结果的一个数据库 (PDO) 示例。此示例循环针对一个 PHP 迭代器,而不是一个数组 ()。
<?php include('Smarty.class.php'); $smarty = new Smarty; $dsn = 'mysql:host=localhost;dbname=test'; $login = 'test'; $passwd = 'test'; // setting PDO to use buffered queries in mysql is // important if you plan on using multiple result cursors // in the template. $db = new PDO($dsn, $login, $passwd, array( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); $res = $db->prepare("select * from users"); $res->execute(); $res->setFetchMode(PDO::FETCH_LAZY); // assign to smarty $smarty->assign('res',$res); $smarty->display('index.tpl');?> ?>
{foreach $res as $r} {$r.id} {$r.name} {foreachelse} .. no results .. {/foreach}
上述示例假设结果包含名为 id
和 name
的列。
迭代器与循环遍历普通旧数组相比有什么优势?对于数组而言,所有结果在被循环遍历之前都累积到内存中。对于迭代器而言,每个结果在循环内被加载/释放。这节省了处理时间和内存,特别适用于非常大的数据集。
index
包含当前数组索引,从零开始。
示例 7.34。index
示例
{* output empty row on the 4th iteration (when index is 3) *} <table> {foreach $items as $i} {if $i@index eq 3} {* put empty table row *} <tr><td>nbsp;</td></tr> {/if} <tr><td>{$i.label}</td></tr> {/foreach} </table>
iteration
包含当前循环迭代,并且始终从一(1)开始,这与 index
不同。它在每次迭代时增量一(1)。
示例 7.35。iteration
示例:被除以
““被除以””操作符可以被用来检测特定的迭代。此处,我们对每 4 次迭代加粗显示姓名。
{foreach $myNames as $name} {if $name@iteration is div by 4} <b>{$name}</b> {/if} {$name} {/foreach}
示例 7.36。iteration
示例:偶数/奇数迭代
““被偶数除””和““被奇数除””操作符可用于在特定次数的迭代内交替显示某项内容。选择偶数或奇数控制哪一项率先出现。此处,我们在每次 3 次迭代时切换字体颜色。
{foreach $myNames as $name} {if $name@iteration is even by 3} <span style="color: #000">{$name}</span> {else} <span style="color: #eee">{$name}</span> {/if} {/foreach}
这将输出类似于以下内容
<span style="color: #000">...</span> <span style="color: #000">...</span> <span style="color: #000">...</span> <span style="color: #eee">...</span> <span style="color: #eee">...</span> <span style="color: #eee">...</span> <span style="color: #000">...</span> <span style="color: #000">...</span> <span style="color: #000">...</span> <span style="color: #eee">...</span> <span style="color: #eee">...</span> <span style="color: #eee">...</span> ...
first
为 TRUE
,如果当前 {foreach}
迭代为初始迭代。这里我们在第一次迭代中显示一个表格头行。
示例 7.37. first
属性示例
{* show table header at first iteration *} <table> {foreach $items as $i} {if $i@first} <tr> <th>key</td> <th>name</td> </tr> {/if} <tr> <td>{$i@key}</td> <td>{$i.name}</td> </tr> {/foreach} </table>
last
设置为 TRUE
,如果当前 {foreach}
迭代为最终迭代。这里我们在最后一次迭代中显示一条水平线。
示例 7.38. last
属性示例
{* Add horizontal rule at end of list *} {foreach $items as $item} <a href="#{$item.id}">{$item.name}</a>{if $item@last}<hr>{else},{/if} {foreachelse} ... no items to loop ... {/foreach}
show show
属性可以在 {foreach}
循环执行后用来检测数据是否已被显示。 show
是一个布尔值。
示例 7.39. show
属性示例
<ul> {foreach $myArray as $name} <li>{$name}</li> {/foreach} </ul> {if $name@show} do something here if the array contained data {/if}
total
包含此 {foreach}
将循环的迭代次数。这可以在 {foreach}
内部或之后使用。
示例 7.40. total
属性示例
{* show number of rows at end *} {foreach $items as $item} {$item.name}<hr/> {if $item@last} <div id="total">{$item@total} items</div> {/if} {foreachelse} ... no items to loop ... {/foreach}