Smarty模板进阶教程(二)

By | 2011 年 12 月 31 日

Smarty模板进阶教程(二)

上一篇教程我们学习了变量调节器,这一节我们来看一些Smarty内定的函数。

首先我们通过一个例子来学习一个很重要的内定函数:模板控制(if / elseif / else/ endif )

通常我们在使用表格进行多行数据输出时,会考虑一行隔一行的设置不同的行背景色,下面我们就来用if实现:

<html>
<head><title>模板中的流程控制</title><head>
<body>
<table border="1">
{assign var="tbColor" value="#D4D0C8"}
色彩:{$tbColor}<br>{section name=loop loop=$News}
{if $tbColor == "#D4D0C8"}
<tr bgcolor="{$tbColor}">
{assign var="tbColor" value="#EEEEEE"}
{else $tbColor == "#EEEEEE"}
<tr bgcolor = "{$tbColor}">
{assign var="tbColor" value="#D4D0C8"}
{/if}
<td>{$News[loop].newsID}</td>
<td>{$News[loop].newsTitle}</td>
<tr>
{/section}
</table>
</body>
</html>

第二步是设计php脚本:

<?php
require_once ("./lib/smarty/Smarty.class.php");
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
$smarty->config_dir = './configs/';
$smarty->cache_dir = './cache/';
$smarty->caching = false;

$array[]= array("newsID"=>"001", "newsTitle"=>"第1条新闻"); 
$array[]= array("newsID"=>"002", "newsTitle"=>"第2条新闻");
$array[]= array("newsID"=>"003", "newsTitle"=>"第3条新闻");
$array[]= array("newsID"=>"004", "newsTitle"=>"第4条新闻");
$array[]= array("newsID"=>"005", "newsTitle"=>"第5条新闻");
$array[]= array("newsID"=>"006", "newsTitle"=>"第6条新闻");
$array[]= array("newsID"=>"007", "newsTitle"=>"第7条新闻");
$array[]= array("newsID"=>"008", "newsTitle"=>"第8条新闻"); 

$smarty->assign("News", $array);

$smarty->display("example5.tpl");
?>

最终输出效果就成为:
<html>
<head><title>模板中的流程控制</title><head>
<body>
<table border="1">

<tr bgcolor="#D4D0C8">

<td>001</td>
<td>第1条新闻</td>
</tr>
<tr bgcolor = "#EEEEEE">

<td>002</td>
<td>第2条新闻</td>
</tr>
<tr bgcolor="#D4D0C8">

<td>003</td>
<td>第3条新闻</td>
</tr>
<tr bgcolor = "#EEEEEE">

<td>004</td>
<td>第4条新闻</td>
</tr>
<tr bgcolor="#D4D0C8">

<td>005</td>
<td>第5条新闻</td>
</tr>
<tr bgcolor = "#EEEEEE">

<td>006</td>
<td>第6条新闻</td>
</tr>
<tr bgcolor="#D4D0C8">

<td>007</td>
<td>第7条新闻</td>
</tr>
<tr bgcolor = "#EEEEEE">

<td>008</td>
<td>第8条新闻</td>
</tr>
</table>
</body>
</html>

这个例子先使用{assign var="tbColor" value="#D4D0C8"}来设置一个内部变量,然后通过
{if $tbColor == "#D4D0C8"}
<tr bgcolor="{$tbColor}">
{assign var="tbColor" value="#EEEEEE"}
{else $tbColor == "#EEEEEE"}
<tr bgcolor = "{$tbColor}">
{assign var="tbColor" value="#D4D0C8"}
{/if}

来判断并改变变量值来交替表格的背景色。

此例子只为演示if的使用,实际上这个功能可以使用cycle来更简单地实现,代码如下:
{section name=loop loop=$News}
<tr bgcolor="{cycle values="#D4D0C8,#EEEEEE"}">
<td>{$News[loop].newsID}</td>
<td>{$News[loop].newsTitle}</td>
<tr>
{/section}

下面我们使用模板内置流程控制语句来进行一行多个单元格内容的输出,也就是表格的每行输出多条记录:

<html>
<head><title>一行输出多条记录</title></head>
<body>
<table>
<tr>
{section name=loop loop=$News step=1}
{if $smarty.section.loop.index % 4 == 0}
</tr>
<tr>
{/if}
<td>{$News[loop].newsID}</td>
<td>{$News[loop].newsTitle}</td>
{/section}
</tr>
</table>
</body>
</html>

脚本如下:

<?php
require_once ("./lib/smarty/Smarty.class.php");
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
$smarty->config_dir = './configs/';
$smarty->cache_dir = './cache/';
$smarty->caching = false;

$array[]= array("newsID"=>"001", "newsTitle"=>"第1条新闻"); 
$array[]= array("newsID"=>"002", "newsTitle"=>"第2条新闻");
$array[]= array("newsID"=>"003", "newsTitle"=>"第3条新闻");
$array[]= array("newsID"=>"004", "newsTitle"=>"第4条新闻");
$array[]= array("newsID"=>"005", "newsTitle"=>"第5条新闻");
$array[]= array("newsID"=>"006", "newsTitle"=>"第6条新闻");
$array[]= array("newsID"=>"007", "newsTitle"=>"第7条新闻");
$array[]= array("newsID"=>"008", "newsTitle"=>"第8条新闻"); 

$smarty->assign("News", $array);

$smarty->display("example5.tpl");
?>

最终输出就是表格共两行,每行显示4条新闻的内容,如下所示:
<html>
<head><title>一行输出多条记录</title></head>
<body>
<table>
<tr>

</tr>
<tr>
<td>001</td>
<td>第1条新闻</td>

<td>002</td>
<td>第2条新闻</td>

<td>003</td>
<td>第3条新闻</td>

<td>004</td>
<td>第4条新闻</td>

</tr>
<tr>
<td>005</td>
<td>第5条新闻</td>

<td>006</td>
<td>第6条新闻</td>

<td>007</td>
<td>第7条新闻</td>

<td>008</td>
<td>第8条新闻</td>

</tr>
</table>
</body>
</html>

简单说明一下:
{section}{/section}指的是一个循环部分,关键句:{if $smarty.section.loop.index % 4 == 0}
$smarty.section.loop指出$smarty的实例中的section段有一个叫loop的部分, 它有一个属性叫index, 它的表示当前循环的索引值,从0开始递增,我们把它%4后与0相比较,也就是说,如果当前的索引值是4的倍数,它就输出一个</tr><tr>,否则执行下面的部分。
估计大家发现了一个小缺点,就是第一行输出了一个空行的<tr> </tr>,这是因为一上来的0满足了条件,怎么能避免这个情况呢,很简单,把一开始这个作特殊处理,可以使用 $smarty.section.loop.first,这个属性表示的是section的一开始,我们把
{if $smarty.section.loop.index % 4 == 0}
改成
{if $smarty.section.loop.index % 4 == 0 and not $smarty.section.loop.first}就可以消除一开始的空行了。

下面是一些内建函数的列表,具体使用大家可以查阅Smarty手册。

capture 捕获模板输出的数据并将其存储到一个变量里,而不是把它们输出到页面
config_load 用于从配置文件中加载变量
foreach,foreachelse 除 section 之外处理循环的另一种方案
include 用于在当前模板中包含其它模板。当前模板中的变量在被包含的模板中可用
include_php 用于在模板中包含 php 脚本
insert 类似于 inluce 函数,不同之处是 insert 所包含的内容不会被缓存,每次调用该模板都会重新执行该函数
if,elseif,else 流程控制
ldelim,rdelim 用于输出分隔符,也就是大括号 "{" 和 "}"。模板引擎总是尝试解释大括号内的内容,因此如果需要输出大括号,请使用此方法
literal Literal 标签区域内的数据将被当作文本处理,此时模板将忽略其内部的所有字符信息。该特性用于显示有可能包含大括号等字符信息的 javascript 脚本
php php 标签允许在模板中直接嵌入 php 脚本
section,sectionelse 用于遍历数组中的数据。 section 标签必须成对出现. 必须设置 name 和 loop 属性,可以嵌套但必须保证嵌套的 name 唯一
strip 在输出前去除任何位于 {strip}{/strip} 标记中数据的首尾空格和回车。这样可以保证模板容易理解且不用担心多余的空格导致问题

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据