Tutorialspoint Smarty 教程

来源：易百教程

Smarty教程™

Smarty是一个php模板引擎。更准确的说,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法。可以描述为应用程序员和美工扮演了不同的角色,因为在大多数情况下 ,他们不可能是同一个人。例如,你正在创建一个用于浏览新闻的网页,新闻标题,标签栏,作者和内容等都是内容要素,他们并不包含应该怎样去呈现。在Smarty的程序里,这些被忽略了。模板设计者们编辑模板,组合使用html标签和模板标签去格式化这些要素的输出(html表格,背景色,字体大小,样式表,等等)。有一天程序员想要改变文章检索的方式(也就是程序逻辑的改变)。这个改变不影响模板设计者,内容仍将准确的输出到模板。同样的,哪天美工吃多了想要完全重做界面,也不会影响到程序逻辑。因此,程序员可以改变逻辑而不需要重新构建模板,模板设计者可以改变模板而不影响到逻辑。

    现在简短的说一下什么是smarty不做的。smarty不尝试将逻辑完全和模板分开。如果逻辑程序严格的用于页面表现,那么它在模板里不会出现问题。有个建议:让应用程序逻辑远离模板, 页面表现逻辑远离应用程序逻辑。这将在以后使内容更容易管理,程序更容易升级。

   Smarty的特点之一是"模板编译"。意思是Smarty读取模板文件然后用他们创建php脚本。这些脚本创建以后将被执行。因此并没有花费模板文件的语法解析,同时每个模板可以享受到诸如Zend加速器(http://www.zend.com) 或者PHP加速器(http://www.php-accelerator.co.uk)。这样的php编译器高速缓存解决方案。

Smaty的一些特点:

非常非常的快!

用php分析器干这个苦差事是有效的

不需要多余的模板语法解析,仅仅是编译一次

仅对修改过的模板文件进行重新编译

可以编辑'自定义函数'和自定义'变量',因此这种模板语言完全可以扩展

可以自行设置模板定界符,所以你可以使用{}, {{}}, <!--{}-->, 等等

诸如 if/elseif/else/endif 语句可以被传递到php语法解析器,所以 {if ...} 表达式是简单的或者是复合的,随你喜欢啦

如果允许的话,section之间可以无限嵌套

引擎是可以定制的.可以内嵌php代码到你的模板文件中,虽然这可能并不需要(不推荐)

内建缓存支持

独立模板文件

可自定义缓存处理函数

插件体系结构

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty教程

Smarty安装 - Smarty教程™

安装Smarty发行版在/libs/目录里的库文件(就是解压了). 这些php文件你可不能乱画哦.这些文件被所有应用程序共享,也只能在你升级到新版的smarty的时候得到更新。

Smarty手册范例 2-1.Smarty库文件

Smarty.class.php
Smarty_Compiler.class.php
Config_File.class.php
debug.tpl
/core/*.php (all of them)
/plugins/*.php (all of them)

Smarty使用一个叫做'SMARTY_DIR'的php常量作为它的系统库目录。基本上,如果你的应用程序可以找到 Smarty.class.php文件,你不需要设置SMARTY_DIR,Smarty将会自己运作。但是,如果 Smarty.class.php没有在你的include_path(php.ini里的一项设置)里,或者没有在你的应用程序里设置它的绝对路径的时候,你就必须手动配置SMARTY_DIR 了(大多数程序都如此)SMARTY_DIR必须包含结尾斜杠。

这里是你在你的php脚本里创建一个smarty的应用实例的例子:

require('Smarty.class.php');
$smarty = new Smarty;

试着运行一下以上脚本,如果你发现"未找到Smarty.class.php 文件"的错误时,你应该这样做:

Smarty手册范例 2-3.加入库文件目录的绝对路径

require('/usr/local/lib/php/Smarty/Smarty.class.php');
$smarty = new Smarty;

Smarty手册范例 2-4.在include_path加入库文件目录

// Edit your php.ini file, add the Smarty library
// directory to the include_path and restart web server.
// Then the following should work:
require('Smarty.class.php');
$smarty = new Smarty;

Smarty手册范例 2-5.手工设置SMARTY_DIR常量

define('SMARTY_DIR','/usr/local/lib/php/Smarty/');
require(SMARTY_DIR.'Smarty.class.php');
$smarty = new Smarty;

现在库文件已经搞定,该是设置为你的应用程序配置其他有关Smarty的目录的时候了。Smarty要求4个目录,默认下命名为:tempalates, templates_c, configs and cache。每个都是可以自定义的,可以修改Smarty类属性: $template_dir, $compile_dir, $config_dir, and $cache_dir respectively。强烈推荐你为每个用到smarty的应用程序设置单一的目录!

确定你已经知道了你的web服务器文件根目录。在我们的例子里,文件根目录是:"/web/www.mydomain.com/docs/"Smarty的4个目录 只可以被那些库文件访问,不可以被网络上的浏览器访问的目录。因此为避免任何安全问题,要求将那4个目录和网页文件目录(就是浏览器看的)分开来。

在我们的安装例子里,我们将为一个留言板程序配置smarty环境。我们挑选应用程序只为了实现目录命名约定。你可以对任何程序使用相同的环境,只要将"guestbook"改成你要的名字就可以了。我们将把Smarty目录放在 "/web/www.mydomain.com/smarty/guestbook/"下。

在你的文档目录下至少得有一个文件,这个文件可以被浏览器访问.我们叫它 "index.php"好了.把它放到"/guestbook/"目录下.

技术提示：建立web服务器很方便，这个文件可以被web服务器自动识别。如果你访问"http://www.mydomain.com/guestbook/"，你不需要在URL上输入"index.php"，index.php脚本就可以被执行。在Apache服务器中，可以通过在DirectoryIndex的后面添加"index.php" 文件(用反斜杠分开每个入口)来完成设置。

现在我们看看这些文件结构:

Smarty手册范例 2-6.例子的文件结构

/usr/local/lib/php/Smarty/Smarty.class.php
/usr/local/lib/php/Smarty/Smarty_Compiler.class.php
/usr/local/lib/php/Smarty/Config_File.class.php
/usr/local/lib/php/Smarty/debug.tpl
/usr/local/lib/php/Smarty/core/*.php
/usr/local/lib/php/Smarty/plugins/*.php

/web/www.mydomain.com/smarty/guestbook/templates/
/web/www.mydomain.com/smarty/guestbook/templates_c/
/web/www.mydomain.com/smarty/guestbook/configs/
/web/www.mydomain.com/smarty/guestbook/cache/

/web/www.mydomain.com/docs/guestbook/index.php

Smarty的 $compile_dir 和$cache_dir必须可写。通常是user "nobody" 和 group "nobody"。如果是 OSX用户,默认为user "web" 和 group "web"。如果你在使用Apache,你可以看看httpd.conf 文件 (通常在"/usr/local/apache/conf/"目录下)哪些user和group正在被使用。

Smarty手册范例 2-7 文件权限设置

chown nobody:nobody /web/www.mydomain.com/smarty/guestbook/templates_c/
chmod 770 /web/www.mydomain.com/smarty/guestbook/templates_c/

chown nobody:nobody /web/www.mydomain.com/smarty/guestbook/cache/
chmod 770 /web/www.mydomain.com/smarty/guestbook/cache/

技术提示: 
chmod 770相当安全了,它只让user "nobody" 和 group "nobody" 读/写 访问。如果你要对任何人开放读取访问权限(大多是为了你自己查看文件),你可以使用 775。

我们需要创建index.tpl文件让smarty载入.这个文件放在 $template_dir目录里。

Smarty手册范例 2-8 编辑/web/www.mydomain.com/smarty/templates/index.tpl

{* Smarty *}

Hello, {$name}!

技术提示:
{* Smarty *} 是一个模板注释。虽然并不是必须的,但是这可以很好的锻炼你在模板文件里加入注释的习惯。它可以使文件便于识别。例如，一些文本编辑器可以识别这个文件,并加以语法高亮显示。

现在来编辑index.php。我们将创建一个Smarty的实例,指派模板变量,显示 index.tpl文件。在我们的例子的环境里, "/usr/local/lib/php/Smarty"已经包括在了 include_path里了。

Smarty手册范例 2-9.编辑/web/www.mydomain.com/docs/guestbook/index.php

// load Smarty library
require('Smarty.class.php');

$smarty = new Smarty;

$smarty->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
$smarty->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
$smarty->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
$smarty->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';

$smarty->assign('name','Ned');

$smarty->display('index.tpl');

技术提示:
在我们的例子里,已经设置了所有Smarty目录的绝对目录。如果 '/web/www.mydomain.com/smarty/guestbook/' 已经包括在 include_path里了,那么这些设置则没有必要。但是,从经验和通用性看来,为避免发生错误,还是配置一下为好。

现在在浏览器打开 index.php,你应该看到"Hello, Porky!"

你现在已经完成了Smarty的基本设置,恭喜!!

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty安装

Smarty扩展设置 - Smarty教程™

扩展设置

这是基本安装的继续,请先阅读那个文件!

一个更灵活一点的配置Smarty的方法是扩展类,和初始化你的smarty环境。
为了避免重复地配置路径,我们可以在一个文件里配置这些变量。
我们创建一个目录 "/php/includes/guestbook/" 建立一个文件"setup.php"
同样先设置好smarty路径。

例2-10.编辑 /php/includes/guestbook/setup.php

// load Smarty library
require('Smarty.class.php');

// The setup.php file is a good place to load
// required application library files, and you
// can do that right here. An example:
// require('guestbook/guestbook.lib.php');是一个很好的加载应用程序的类库文件(就是扩展类)
//例如你可以在index文件里包含它

class Smarty_GuestBook extends Smarty {

 function Smarty_GuestBook() {

 		// Class Constructor. These automatically get set with each new instance.
 //类构造函数.创建实例的时候自动配置

		$this->Smarty();

		$this->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
		$this->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
		$this->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
		$this->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';

		$this->caching = true;
		$this->assign('app_name','Guest Book');
 }

}

现在我们针对setup文件更改一下index文件

Smarty手册范例 2-11.编辑/web/www.mydomain.com/docs/guestbook/index.php

require('guestbook/setup.php');

$smarty = new Smarty_GuestBook;

$smarty->assign('name','Ned');

$smarty->display('index.tpl');

现在你看到创建一个使用smarty的实例有多么的简单.从Smarty_GuestBook开始,重新构建我们的应用程序吧^_^

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty扩展设置

Smarty注释代码 - Smarty教程™

所有的smarty模板标签都被加上了定界符.
默认情况下是 { 和},但它们是可被改变的.

例如,我们假定你在使用默认定界符.
在smarty里,所有定界符以外的内容都是静态输出的,或者称之为不可改变.
当smarty遇到了模板标签,将尝试解释他们,然后再以恰当的方式输出 .

Comments[注释]

模板注释被*号包围,例如 {* this is a comment *} 
smarty注释不会在模板文件的最后输出中出现.
它只是模板内在的注释.

例 3-1.注释

{* Smarty *}

{* include the header file here *}
{include file="header.tpl"}

{include file=$includeFile}

{include file=#includeFile#}

{* display dropdown lists *}
<SELECT name=company>
{html_options values=$vals selected=$selected output=$output}
</SELECT>

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty注释代码

Smarty函数 - Smarty教程™

函数

每一个smarty标签输出一个变量或者调用某种函数.
在定界符内 函数(用'{'包住)和其属性(用界符包住)将被处理和输出.例如: 
{funcname attr1="val" attr2="val"}.

例 3-2.函数语法

{config_load file="colors.conf"}

{include file="header.tpl"}

{if $highlight_name}
	Welcome, <font color="{#fontColor#}">{$name}!</font>
{else}
	Welcome, {$name}!
{/if}

{include file="footer.tpl"}

在模板里无论是内建函数还是自定义函数都有相同的语法.
内建函数将在smarty内部工作,例如 {if} , {section} and {strip} .他们不能被修改.
自定义函数通过插件机制起作用,它们是附加函数. 只要你喜欢,可以随意修改.你也可以自行添加.
例如 {html_options} 和 {html_select_date}

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty函数

Smarty属性 - Smarty教程™

Attributes

[属性]

大多数函数都带有自己的属性以便于明确说明或者修改他们的行为. 
smarty函数的属性很像HTML中的属性. 
静态数值不需要加引号,但是字符串建议使用引号. 
如果用变量作属性,它们也不能加引号.

一些属性用到了布尔值(真或假).
它们不需要加引号,可以是true,on,yes或者false,off,no.

例 3-3.函数属性语法

{include file="header.tpl"}

{include file=$includeFile}

{include file=#includeFile#}

{html_select_date display_days=yes}

<SELECT name=company>
{html_options values=$vals selected=$selected output=$output}
</SELECT>

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty属性

Smarty双引号里值的嵌入 - Smarty教程™

双引号里值的嵌入

Smarty可以识别嵌入在双引号中的变量，只要此变量只包含数字、字母、下划线和中括号[].对于其他的符号(句号、对象相关的，等等)此变量必须用两个'`'(此符号和‘ ~ '在同一个键上，一般在ESC键下面一个键上)包住。

例 3-4.双引号里值的嵌入语法

SYNTAX EXAMPLES:
{func var="test $foo test"} <-- sees $foo
{func var="test $foo_bar test"} <-- sees $foo_bar
{func var="test $foo[0] test"} <-- sees $foo[0]
{func var="test $foo[bar] test"} <-- sees $foo[bar]
{func var="test $foo.bar test"} <-- sees $foo (not $foo.bar)
{func var="test `$foo.bar` test"} <-- sees $foo.bar

PRACTICAL EXAMPLES:
{include file="subdir/$tpl_name.tpl"} <-- will replace $tpl_name with value
{cycle values="one,two,`$smarty.config.myval`"} <-- must have backticks

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty双引号里值的嵌入

Smarty数学运算 - Smarty教程™

数学运算可以直接应用到变量

Example 3-5. math examples

例 3-5.数学运算的例子

{$foo+1}

{$foo*$bar}

{* some more complicated examples *}

{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}

{if ($foo+$bar.test%$baz*134232+10+$b+10)}

{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}

{assign var="foo" value="`$foo+$bar`"}

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty数学运算

Smarty变量 - Smarty教程™

变量

内容列表

$template_dir [模板目录变量]

[从PHP分配的变量]

[从配置文件读取的变量]

[{$smarty} 保留变量]

Smarty有几种不同类型的变量.

变量 的类型取决于它的前缀是什么符号(或者被什么符号包围)

Smarty的变量可以直接被输出或者作为函数属性和修饰符(modifiers)的参数,或者用于内部的条件表达式等等.

如果要输出一个变量,只要用定界符将它括起来就可以.例如:

{$Name}

{$Contacts[row].Phone}

<body bgcolor="{#bgcolor#}">

从PHP分配的变量

内容列表

关联数组

数组下标

对象

调用从PHP分配的变量需在前加"$"符号.(译注：同php一样)
调用模板内的assign函数分配的变量也是这样.(译注：也是用$加变量名来调用)

例 4-1.分配的变量

index.php:

$smarty = new Smarty;
$smarty->assign('firstname', 'Doug');
$smarty->assign('lastLoginDate', 'January 11th, 2001');
$smarty->display('index.tpl');

index.tpl:

Hello {$firstname}, glad to see you could make it.
<p>
Your last login was on {$lastLoginDate}.

OUTPUT:

Hello Doug, glad to see you could make it.
<p>
Your last login was on January 11th, 2001.

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty变量

Smarty从配置文件读取的变量 - Smarty教程™

从配置文件读取的变量

配置文件中的变量需要通过用两个"#"或者是smarty的保留变量 $smarty.config.来调用(下节将讲到)
第二种语法在变量作为属性值并被引号括住的时候非常有用.
(译注：举个例子 {include file="#includefile#"} 这样#includefile#将被当作字符处理，而不表示配置文件变量，
　　　　但可以这样表示 {include file="`$smarty.config.includefile`"}不要忘了加``)

例 4-5.从配置文件引用的变量

foo.conf:

pageTitle = "This is mine"
bodyBgColor = "#eeeeee"
tableBorderSize = "3"
tableBgColor = "#bbbbbb"
rowBgColor = "#cccccc"

index.tpl:

{config_load file="foo.conf"}
<html>
<title>{#pageTitle#}</title>
<body bgcolor="{#bodyBgColor#}">
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
<tr bgcolor="{#rowBgColor#}">
	<td>First</td>
	<td>Last</td>
	<td>Address</td>
</tr>
</table>
</body>
</html>

index.tpl: (alternate syntax)

{config_load file="foo.conf"}
<html>
<title>{$smarty.config.pageTitle}</title>
<body bgcolor="{$smarty.config.bodyBgColor}">
<table border="{$smarty.config.tableBorderSize}" bgcolor="{$smarty.config.tableBgColor}">
<tr bgcolor="{$smarty.config.rowBgColor}">
	<td>First</td>
	<td>Last</td>
	<td>Address</td>
</tr>
</table>
</body>
</html>

OUTPUT: (same for both examples)

<html>
<title>This is mine</title>
<body bgcolor="#eeeeee">
<table border="3" bgcolor="#bbbbbb">
<tr bgcolor="#cccccc">
	<td>First</td>
	<td>Last</td>
	<td>Address</td>
</tr>
</table>
</body>
</html>

配置文件的变量只有在它们被加载以后才能使用.
这个过程将在以后 {config_load} . 的章节里说明.

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty从配置文件读取的变量

Smarty变量调节器 - Smarty教程™

变量调节器

内容列表

capitalize

count_characters

count_paragraphs

count_sentences

count_words

date_format

default

escape

indent

lower

nl2br

regex_replace

replace

spacify

string_format

strip

strip_tags

truncate

upper

wordwrap

变量调节器用于变量，自定义函数和字符串。 请使用‘|’符号和调节器名称应用调节器。 变量调节器由赋予的参数值决定其行为。 参数由‘：’符号分开。

例 5-1.调节器的例子

{* Uppercase the title *}

<h2>{$title|upper}</h2>

{* Truncate the topic to 40 characters use ... at the end *}
Topic: {$topic|truncate:40:"..."}

{* format a literal string *}
{"now"|date_format:"%Y/%m/%d"}

{* apply modifier to a custom function *}
{mailto|upper address="me@domain.dom"}

如果你给数组变量应用单值变量的调节，结果是数组的每个值都被调节。 如果你只想要调节器用一个值调节整个数组，你必须在调节器名字前加上@符号。 例如： {$articleTitle|@count}(这将会在 $articleTitle 数组里输出元素的数目)

capitalize

将变量里的所有单词首字大写。

Example 5-2. capitalize
例 5-2.首字大写

index.php:

$smarty = new Smarty;
$smarty->assign('articleTitle', 'Police begin campaign to rundown jaywalkers.');
$smarty->display('index.tpl');

index.tpl:

{$articleTitle}
{$articleTitle|capitalize}

OUTPUT:

Police begin campaign to rundown jaywalkers.
Police Begin Campaign To Rundown Jaywalkers.

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty变量调节器

Smarty组合修改器 - Smarty教程™

组合修改器

对于同一个变量，你可以使用多个修改器。它们将从左到右按照设定好的顺序被依次组合使用。使用时必须要用"|"字符作为它们之间的分隔符。

Example 6-1. combining modifiers

例 6-1.组合修改器

index.php:

$smarty = new Smarty;
$smarty->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
$smarty->display('index.tpl');

index.tpl:

{$articleTitle}
{$articleTitle|upper|spacify}
{$articleTitle|lower|spacify|truncate}
{$articleTitle|lower|truncate:30|spacify}
{$articleTitle|lower|spacify|truncate:30:". . ."}

OUTPUT:

Smokers are Productive, but Death Cuts Efficiency.
S M O K E R S A R E P R O D U C T I V E , B U T D E A T H C U T S E F F I C I E N C Y .
s m o k e r s a r e p r o d u c t i v e , b u t d e a t h c u t s...
s m o k e r s a r e p r o d u c t i v e , b u t . . .
s m o k e r s a r e p. . .

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty组合修改器

Smarty foreach,foreachelse - Smarty教程™

foreach,foreachelse

Table of Contents目录

iteration 用于显示当前循环的执行次数[待考]

first : 当前 foreach 循环第一次执行时 first 被设置成 true.

last : 当前 foreach 循环执行到最后一遍时 last 被设置成 true.

show: 是 foreach 的一个参数. 取值为布尔值 true 或 false. 如果指定为 false 该循环不显示，如果循环指定了 foreachelse 子句，该子句显示与否也取决于 show 的取值.

total: 用于显示循环执行的次数，可以在循环中或循环执行后调用.

Attribute Name | Type | Required | Default | 描述
from | string | Yes | n/a | The name of the array you are looping through
item | string | Yes | n/a | The name of the variable that is the current element
key | string | No | n/a | The name of the variable that is the current key
name | string | No | n/a | The name of the foreach loop for accessing foreach properties

属性 | 类型 | 是否必须 | 缺省值 | 描述
from | string | Yes | n/a | 待循环数组的名称
item | string | Yes | n/a | 当前处理元素的变量名称
key | string | No | n/a | 当前处理元素的键名
name | string | No | n/a | 该循环的名称，用于访问该循环

foreach 是除 section 之外处理循环的另一种方案(根据不同需要选择不同的方案).
foreach 用于处理简单数组(数组中的元素的类型一致)，它的格式比 section 简单许多，缺点是只能处理简单数组.
foreach 必须和 /foreach 成对使用，且必须指定 from 和 item 属性.
name 属性可以任意指定(字母、数字和下划线的组合).
foreach 可以嵌套，但必须保证嵌套中的 foreach 名称唯一.
from 属性(通常是数组)决定循环的次数.
foreachelse 语句在 from 变量没有值的时候被执行.

Example 7-4. foreach

例 7-4. foreach 演示

{* this example will print out all the values of the $custid array *}
{* 该例将输出数组 $custid 中的所有元素的值 *}
{foreach from=$custid item=curr_id}
	id: {$curr_id}<br>
{/foreach}

OUTPUT:

id: 1000<br>
id: 1001<br>
id: 1002<br>

Example 7-5. foreach key
例 7-5. foreach 键的演示

{* The key contains the key for each looped value

assignment looks like this:

$smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell" => "3"),
 array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234")));
*}
{* 键就是数组的下标，请参看关于数组的解释 *}

{foreach name=outer item=contact from=$contacts}
 {foreach key=key item=item from=$contact}
 {$key}: {$item}<br>
 {/foreach}
{/foreach}

OUTPUT:

phone: 1<br>
fax: 2<br>
cell: 3<br>
phone: 555-4444<br>
fax: 555-3333<br>
cell: 760-1234<br>

foreach 循环有自己的变量名，使用该变量名可以访问该循环. 使用方法为{$smarty.foreach.foreachname.varname}，其中 foreachname 即在 foreach 中指定的 name 属性.

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty foreach,foreachelse

Smarty include - Smarty教程™

include

Attribute Name | Type | Required | Default | 描述
file | string | Yes | n/a | The name of the template file to include
assign | string | No | n/a | The name of the variable that the output of include will be assigned to
[var ...] | [var type] | No | n/a | variable to pass local to template

属性 | 类型 | 是否必须 | 缺省值 | 描述
file | string | Yes | n/a | 待包含的模板文件名
assign | string | No | n/a | 该属性指定一个变量保存待包含模板的输出
[var ...] | [var type] | No | n/a | 传递给待包含模板的本地参数，只在待包含模板中有效

Include 标签用于在当前模板中包含其它模板. 当前模板中的变量在被包含的模板中可用. 必须指定 file 属性，该属性指明模板资源的位置.

如果设置了 assign 属性，该属性对应的变量名用于保存待包含模板的输出，这样待包含模板的输出就不会直接显示了。

Example 7-6. function include
例 7-6. include 函数演示

{include file="header.tpl"}

{* body of template goes here *}

{include file="footer.tpl"}

可以在属性中传递参数给待包含模板. 传递给待包含模板的参数只在待包含模板中可见. 如果传递的参数在待包含模板中有同名变量，那么该变量被传递的参数替代.

Example 7-7. function include passing variables
例 7-7. 带传递参数的 include 函数演示

{include file="header.tpl" title="Main Menu" table_bgcolor="#c0c0c0"}

{* body of template goes here *}

{include file="footer.tpl" logo="http://my.domain.com/logo.gif"}

包含 $template_dir 文件夹之外的模板请使用 模板资源 说明的格式.

Example 7-8. function include template resource examples
例 7-8. 使用外部模板资源的 include 函数演示

{* absolute filepath *}
{include file="/usr/local/include/templates/header.tpl"}

{* absolute filepath (same thing) *}
{include file="file:/usr/local/include/templates/header.tpl"}

{* windows absolute filepath (MUST use "file:" prefix) *}
{include file="file:C:/www/pub/templates/header.tpl"}

{* include from template resource named "db" *}
{include file="db:header.tpl"}

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty include

Smarty include_php - Smarty教程™

include_php

Attribute Name | Type | Required | Default | 描述
file | string | Yes | n/a | The name of the php file to include
once | boolean | No | true | whether or not to include the php file more than once if included multiple times
assign | string | No | n/a | The name of the variable that the output of include_php will be assigned to

属性 | 类型 | 是否必须 | 缺省值 | 描述
file | string | Yes | n/a | 待包含php文件的名称
once | boolean | No | true | 如果待包含php文件已被包含是否仍然包含(类似php中的include_once函数)
assign | string | No | n/a | 该属性指定一个变量保存待包含php文件的输出

inluce_php 函数用于在模板中包含 php 脚本. 如果设置了安全模式，被包含的脚本必须位于 $trusted_dir 路径下. include_php 函数必须设置 file 属性，该属性指明被包含 php 文件的路径，可以是 $trusted_dir 的相对路径，也可以是绝对路径.

include_php 是解决模板部件化的好方法，它使得 php 代码从模板文件中被分离出来. 举个例子：假设有一个从数据库中动态取出数据用于显示站点导航的模板，你可以将得数据内容的 php 逻辑部分分离出来保存在一个单独的文件夹下，并在模板开始的位置包含该 php 脚本. 那么就可以在任何地方包含此模板而不用担心之前数据库信息是否已被程序取出.

即使是在模板中多次地调用 php 文件，默认情况下它们只被包含一次. 你可以设置 once 属性从而指明每次调用都重新包含该文件. 如果将 once 属性设置为 false，每次调用该文件都将被重新包含.

如果设置了 assign 属性，该属性对应的变量名用于保存待包含 php 的输出，这样待包含 php 文件的输出就不会直接显示了。

在待包含 php 文件中可以通过 $this 访问 smarty 对象.

Example 7-9. function include_php
例 7-9. include_php 函数演示

load_nav.php
-------------

<?php

	// load in variables from a mysql db and assign them to the template
	// 从mysql数据库中取得数据，将数据赋给模板变量
	require_once("MySQL.class.php");
	$sql = new MySQL;
	$sql->query("select * from site_nav_sections order by name",SQL_ALL);
	$this->assign('sections',$sql->record);

?>

index.tpl
---------

{* absolute path, or relative to $trusted_dir *}
{* 绝对路径或 $trusted_dir 的相对路径 *}
{include_php file="/path/to/load_nav.php"}

{foreach item="curr_section" from=$sections}
	<a href="{$curr_section.url}">{$curr_section.name}</a><br>
{/foreach}

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty include_php

Smarty insert - Smarty教程™

insert

Attribute Name | Type | Required | Default | 描述
name | string | Yes | n/a | The name of the insert function (insert_name)
assign | string | No | n/a | The name of the template variable the output will be assigned to
script | string | No | n/a | The name of the php script that is included before the insert function is called
[var ...] | [var type] | No | n/a | variable to pass to insert function

属性 | 类型 | 是否必须 | 缺省值 | 描述
name | string | Yes | n/a | 插入函数的名称
assign | string | No | n/a | 该属性指定一个变量保存待插入函数输出
script | string | No | n/a | 插入函数前需要先包含的php脚本名称
[var ...] | [var type] | No | n/a | 传递给待插入函数的本地参数

Insert 函数类似欲 inluce 函数，不同之处是 insert 所包含的内容不会被缓存，每次调用该模板都会重新执行该函数.

例如你在页面上端使用一个带有广告条位置的模板，广告条可以包含任何HTML、图象、FLASH等混合信息. 因此这里不能使用一个静态的链接，同时我们也不希望该广告条被缓存. 这就需要在 insert 函数指定：#banner_location_id# 和 #site_id# 值(从配置文件中取)，同时需要一个函数取广告条的内容信息.

例 7-10. insert 函数演示

{* example of fetching a banner *}
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}

在此例中，我们使用了 getBanner 作为 name 属性，同时传递了 #banner_location_id# 和 #site_id# 两个参数. 接下来 Smarty 在你的 php 程序中搜索名为 insert_getBanner() 的函数，#banner_location_id# 和 #site_id# 的值被组合成一个数组作为函数的第一个参数传递给该函数. 为了避免函数命名混乱，所有的 insert 函数都必须以 insert_ 开头. 你的 insert_getBanner() 函数根据传递的参数执行并返回执行的结果. 这些结果就显示在模板中调用该函数的位置. 在此例中 Smarty 调用该函数类似insert_getBanner(array("lid"=>"12345","sid"=>67890"));并将返回的结果显示在调用的位置.

如果设置了 assign 属性，该属性对应的变量名用于保存待包含函数的输出，这样待包含函数的输出就不会直接显示了.注意：赋给模板变量的输出信息在缓存的时候同样无效.

如果指定了 script 属性，在调用函数并执行前将先包含(只包含一次)script指定的 php 脚本. 这是为了防止被调用的函数不存在，先调用包含该函数的 php 脚本将避免该情况.

Smart 对象作为函数的第二个参数被传递，在待包含函数中可以通过 $this 访问并修改 smarty 对象信息.

技术要点: 使模板的一部分不被缓存. 如果打开了缓存, insert 函数却不会被缓存，每次调用页面它们都会被动态加载，即使是在缓存页面中. 该特性可以广泛应用于广告条、投票、实时天气预报、搜索结果、反馈信息等区域.

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty insert

Smarty if,elseif,else - Smarty教程™

if,elseif,else

Smarty 中的 if 语句和 php 中的 if 语句一样灵活易用，并增加了几个特性以适宜模板引擎. if 必须于 /if 成对出现. 可以使用 else 和 elseif 子句. 可以使用以下条件修饰词：eq、ne、neq、gt、lt、lte、le、gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by、==、!=、>、<、<=、>=. 使用这些修饰词时必须和变量或常量用空格格开.

Example 7-11. if statements
例 7-11. if 语句演示

{if $name eq "Fred"}
	Welcome Sir.
{elseif $name eq "Wilma"}
	Welcome Ma'am.
{else}
	Welcome, whatever you are.
{/if}

{* an example with "or" logic *}
{if $name eq "Fred" or $name eq "Wilma"}
	...
{/if}

{* same as above *}
{if $name == "Fred" || $name == "Wilma"}
	...
{/if}

{* the following syntax will NOT work, conditional qualifiers
 must be separated from surrounding elements by spaces *}
{if $name=="Fred" || $name=="Wilma"}
	...
{/if}

{* parenthesis are allowed *}
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
	...
{/if}

{* you can also embed php function calls *}
{if count($var) gt 0}
	...
{/if}

{* test if values are even or odd *}
{if $var is even}
	...
{/if}
{if $var is odd}
	...
{/if}
{if $var is not odd}
	...
{/if}

{* test if var is divisible by 4 *}
{if $var is div by 4}
	...
{/if}

{* test if var is even, grouped by two. i.e.,
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc. *}
{if $var is even by 2}
	...
{/if}

{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
{if $var is even by 3}
	...
{/if}

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty if,elseif,else

Smarty literal - Smarty教程™

literal

Literal 标签区域内的数据将被当作文本处理，此时模板将忽略其内部的所有字符信息. 该特性用于显示有可能包含大括号等字符信息的 javascript 脚本. 当这些信息处于 {literal}{/literal} 标签中时，模板引擎将不分析它们，而直接显示.

Example 7-13. literal tags
例 7-13. literal 标签演示

{literal}
	<script language=javascript>

 	<!--
 	function isblank(field) {
 	if (field.value == '')
 	{ return false; }
 	else
 	{
 	document.loginform.submit();
 	return true;
 	}
 	}
 	// -->

	</script>
{/literal}

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty literal

Smarty section,sectionelse - Smarty教程™

section,sectionelse

Table of Contents目录

index

index_

previndex_

nextiteration

first

las

trow

num

loop

show

total

Attribute Name | Type | Required | Default | 描述
name | string | Yes | n/a | The name of the section
loop | [$variable_name] | Yes | n/a | The name of the variable to determine # of loop iterations

start
integer
No
0
The index position that the section will begin looping. If the value is negative, the start position is calculated from the end of the array. For example, if there are seven values in the loop array and start is -2, the start index is 5. Invalid values (values outside of the length of the loop array) are automatically truncated to the closest valid value.

step | integer | No | 1 | The step value that will be used to traverse the loop array. For example, step=2 will loop on index 0,2,4, etc. If step is negative, it will step through the array backwards.
max | integer | No | 1 | Sets the maximum number of times the section will loop.
show | boolean | No | true | determines whether or not to show this section

属性 | 类型 | 是否必须 | 缺省值 | 描述
name | string | Yes | n/a | 该循环的名称
loop | [$variable_name] | Yes | n/a | 决定循环次数的变量名称
start | integer | No | 0 | 循环执行的初始位置. 如果该值为负数，开始位置从数组的尾部算起. 例如：如果数组中有7个元素，指定start为-2，那么指向当前数组的索引为5. 非法值(超过了循环数组的下限)将被自动调整为最接近的合法值.
step | integer | No | 1 | 该值决定循环的步长. 例如指定step=2将只遍历下标为0、2、4等的元素. 如果step为负值，那么遍历数组的时候从后向前遍历.
max | integer | No | 1 | 设定循环最大执行次数.
show | boolean | No | true | 决定是否显示该循环.

模板的 section 用于遍历数组中的数据. section 标签必须成对出现. 必须设置 name 和 loop 属性. 名称可以是包含字母、数字和下划线的任意组合. 可以嵌套但必须保证嵌套的 name 唯一. 变量 loop (通常是数组)决定循环执行的次数. 当需要在 section 循环内输出变量时，必须在变量后加上中括号包含着的 name 变量. sectionelse 当 loop 变量无值时被执行.

Example 7-15. section
例 7-15. section 函数演示

{* this example will print out all the values of the $custid array *}
{section name=customer loop=$custid}
	id: {$custid[customer]}<br>
{/section}

OUTPUT:

id: 1000<br>
id: 1001<br>
id: 1002<br>

例 7-16.loop 变量演示

{* the loop variable only determines the number of times to loop.
 you can access any variable from the template within the section.
 This example assumes that $custid, $name and $address are all
 arrays containing the same number of values *}
{section name=customer loop=$custid}
	id: {$custid[customer]}<br>
	name: {$name[customer]}<br>
	address: {$address[customer]}<br>
	<p>
{/section}

OUTPUT:

id: 1000<br>
name: John Smith<br>
address: 253 N 45th<br>
<p>
id: 1001<br>
name: Jack Jones<br>
address: 417 Mulberry ln<br>
<p>
id: 1002<br>
name: Jane Munson<br>
address: 5605 apple st<br>
<p>

例 7-17. section 名称演示

{* the name of the section can be anything you like,
 and it is used to reference the data within the section *}
{section name=mydata loop=$custid}
	id: {$custid[mydata]}<br>
	name: {$name[mydata]}<br>
	address: {$address[mydata]}<br>
	<p>
{/section}

例 7-18. 嵌套 section 演示

{* sections can be nested as deep as you like. With nested sections,
 you can access complex data structures, such as multi-dimensional
 arrays. In this example, $contact_type[customer] is an array of
 contact types for the current customer. *}
{section name=customer loop=$custid}
	id: {$custid[customer]}<br>
	name: {$name[customer]}<br>
	address: {$address[customer]}<br>
	{section name=contact loop=$contact_type[customer]}
		{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br>
	{/section}
	<p>
{/section}

OUTPUT:

id: 1000<br>
name: John Smith<br>
address: 253 N 45th<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: john@mydomain.com<br>
<p>
id: 1001<br>
name: Jack Jones<br>
address: 417 Mulberry ln<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jack@mydomain.com<br>
<p>
id: 1002<br>
name: Jane Munson<br>
address: 5605 apple st<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jane@mydomain.com<br>
<p>

例 7-19. section 遍历多维数组演示

{* This is an example of printing an associative array
 of data within a section *}
{section name=customer loop=$contacts}
	name: {$contacts[customer].name}<br>
	home: {$contacts[customer].home}<br>
	cell: {$contacts[customer].cell}<br>
	e-mail: {$contacts[customer].email}<p>
{/section}

OUTPUT:

name: John Smith<br>
home: 555-555-5555<br>
cell: 555-555-5555<br>
e-mail: john@mydomain.com<p>
name: Jack Jones<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jack@mydomain.com<p>
name: Jane Munson<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jane@mydomain.com<p>

例 7-20. sectionelse 演示

{* sectionelse will execute if there are no $custid values *}
{section name=customer loop=$custid}
	id: {$custid[customer]}<br>
{sectionelse}
	there are no values in $custid.
{/section}

Section 循环也有可供调用的变量名. 通过如下方式调用{$smarty.section.sectionname.varname}.

注意：Smarty 1.5.0 版中，section 名称属性变量的格式由{%sectionname.varname%}变成 {$smarty.section.sectionname.varname}，老版本的格式依然支持，但在手册的例子中只提供新的格式.

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty section,sectionelse

Smarty自定义函数 - Smarty教程™

自定义函数

assign

counter

cycle

debug

eval

fetch

html_checkboxes

html_image

html_options

html_radios

html_select_date

html_select_time

html_table

math

mailto

popup_init

popup

textformat

用户可以使用 Smarty 自带的一组自定义函数.

assign

Attribute Name | Type | Required | Default | 描述
var | string | Yes | n/a | The name of the variable being assigned
value | string | Yes | n/a | The value being assigned

属性 | 类型 | 是否必须 | 缺省值 | 描述
var | string | Yes | n/a | 被赋值的变量名
value | string | Yes | n/a | 赋给变量的值

assign 用于在模板被执行时为模板变量赋值.

Example 8-1. assign
例 8-1. assign 函数演示

{assign var="name" value="Bob"}

The value of $name is {$name}.

OUTPUT:

The value of $name is Bob.

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty自定义函数

Smarty assign用法 - Smarty教程™

assign

Attribute Name | Type | Required | Default | 描述
var | string | Yes | n/a | The name of the variable being assigned
value | string | Yes | n/a | The value being assigned

属性 | 类型 | 是否必须 | 缺省值 | 描述
var | string | Yes | n/a | 被赋值的变量名
value | string | Yes | n/a | 赋给变量的值

assign 用于在模板被执行时为模板变量赋值.

例 8-1. assign 函数演示

{assign var="name" value="Bob"}

The value of $name is {$name}.

OUTPUT:

The value of $name is Bob.

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty assign用法

Smarty配置文件 - Smarty教程™

配置文件

配置文件有利于设计者管理文件中的模板全局变量。最简单的例子就是模板色彩变量。一般情况下你如果想改变一个程序的外观色彩，你就必须通过去更改每一个文件的颜色变量。如果有这个配置文件的话，色彩变量就可以保存在一个地方，只要改变这个配置文件就可以实现你色彩的更新。

例 9-1 配置文件语法例子

# global variables
pageTitle = "Main Menu"
bodyBgColor = #000000
tableBgColor = #000000
rowBgColor = #00ff00

[Customer]
pageTitle = "Customer Info"

[Login]
pageTitle = "Login"
focus = "username"
Intro = """This is a value that spans more
 than one line. you must enclose
			it in triple quotes."""

# hidden section
[.Database]
host=my.domain.com
db=ADDRESSBOOK
user=php-user
pass=foobar

配置文件变量值能够在引号中使用，但是没有必要。你可以用单引号或者双引号。如果你有一个不只在一个区域内使用的变量值，你可以使用三引号(""")将它完整的封状起来，可以把它们放金配置文件，只要没有语法错误。我们建议在程序行前使用 “#”加一些注释信息来标示。

上面关于配置文件的例子共有两个部分。每部分的名称都是用一个“[]”给括起来。每部分的名称命名规则就是任意的字符串，只要不包括有符号“[”或者“]”。例子开头的四个变量都是全局变量，也就是说不仅仅是可以在一个区域内使用。这些变量总是从配置文件中载入。如果某个特定的局部变量已经载入，这样全局变量和局部变量都还可以载入。如果当某个变量名既是全局变量又是局部变量时，局部变量将被优先赋予值来使用。如果在一个局部中两个变量名相同的话，最后一个将被赋值使用。

配置文件是通过内建函数载入到模板 { config load }

你可以在某个段时期通过预先想好的变量名或者局部名隐藏变量或者完整的一个节。当你的应用程序读取配置文件和取得有用数据而不用读取模板时这个非常有用，如果你有第三方来做模板编辑的话，可以肯定的说它们不能通过载入配置文件到模板而读取到任何有用的数据。

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty配置文件

Smarty调试控制台 - Smarty教程™

调试控制台

SMARTY里面包括有一个调式控制台。它可以告诉你模板里面包含的所有内容，同时也可以为当前使用模板中的变量和配置文件变量赋值。一个叫 debug.tpl 的模板包含了很多控制调式控制台格式化的SMARTY类，在SMARTY中把变量 $debugging 设置为 true ，如果需要的话设置变量 $debug_tpl 为模板源文件路径(在SMARTY_DIR用已经自定义)。当你载入页面时，有一个JAVASCRIPT控制台窗口将弹出且告诉你所有模板中包含的名称和当前页已经赋值的变量。如果要了解某个模板的详细变量，可以去看 {debug} 模板定义函数章节。如果要关闭掉调试控制台，设置变量 $debugging 为 false 就可以了。如果你开启了 $debugging ctrl 选项，也可以通过放置 SMARTY_DEBUG 在 URL 来临时打开调试控制台。

技术提示：当你使用函数 fetch() API 时调试控制台不能用，在使用 display() 时才可以使用。它将自动地把 javascript 添加到已经应用模板的每一个按扭中。如果你不喜欢 javascript ，你可以编辑文件 debug.tpl 模板，格式化输出为你自己喜欢的格式。调试数据是没有被缓存的，并且 debug.tpl 信息也没有包含在调试控制台的输出文件中。

注意：每个模板和配置文件的载入都是以秒来计算的，甚至是以几分之一秒。

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty调试控制台

Smarty方法 - Smarty教程™

方法

Table of Contents  目录
append 添加
append_by_ref 引用添加
assign 赋值
assign_by_ref 引用赋值
clear_all_assign 清除所有赋值
clear_all_cache 清除所有缓存
clear_assign 清除赋值
clear_cache 清除缓存
clear_compiled_tpl 清除已编译模板
clear_config 清除配置
config_load 加载配置
display 显示
fetch 取得输出的内容
get_config_vars 取配置变量的值
get_registered_object 取得已注册的对象
get_template_vars 取得模板变量的值
is_cached 是否已被缓存
load_filter 加载过滤器
register_block 注册一个块
register_compiler_function 注册编译函数
register_function 注册函数
register_modifier 注册修饰器
register_object 注册对象
register_outputfilter 注册输出过滤器
register_postfilter 注册提交过滤器
register_prefilter 注册预过滤器
register_resource 注册资源
trigger_error 触发错误
template_exists 模板是否存在
unregister_block 注销一个块
unregister_compiler_function 注销编译函数
unregister_function 注销函数
unregister_modifier 注销修饰器
unregister_object 注销对象
unregister_outputfilter 注销输出过滤器
unregister_postfilter 注销提交过滤器
unregister_prefilter 注销预过滤器
unregister_resource 注销资源
append 添加
void append (mixed var)
void append (string varname, mixed var)
void append (string varname, mixed var, boolean merge)

append 添加

void append (mixed var)

void append (string varname, mixed var)

void append (string varname, mixed var, boolean merge)

添加指定的元素到数组中。如果是添加一个字符串，该字符串会被转换为数组格式后再进行添加。所添加的数据可以采用 名称, 数值 的格式，或者是使用 “=>”连接的联合数组格式。如果第三个可选参数被指定为 TRUE，所添加的数据会和数组中现有数据进行合并，而不是直接添加。

注意：使用第三个参数“merge”时要考虑到数组的索 引，所以，如果添加和被添加的数组都是以数字为索引，他们会互相覆盖，或者产生不连续的索引。这并不象PHP中的array_merge()函数，后者会 删除原有的数字索引，重新对索引进行编号。

Example 13-1. append 例子 13-1. 添加

// passing name/value pairs 以 名称，数值 的方式添加
$smarty->append("Name","Fred");
$smarty->append("Address",$address);

// passing an associative array 以联合数组的方式添加
$smarty->append(array("city" => "Lincoln","state" => "Nebraska"));

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty方法

Smarty display方法 - Smarty教程™

display
显示

void display (string template [, string cache_id [, string compile_id]])

显示模板，需要指定一个合法的模板资源的类型和路径。你还可以通过 第二个可选参数指定一个缓存号，相关的信息可以查看缓存。

通过第三个可选参数，可以指定一个编译号。这在你想把一个模板编译成不同版本时使用，比如针对不同的语言编译模板。编译号的另外一个作用是，如果你 有多个$template_dir模板目录，但只有一个$compile_dir编译后存档目录，这时可以为每一个$template_dir模板目录指 定一个编译号，以避免相同的模板文件在编译后会互相覆盖。相对于在每一次调用display()的时候都指定编译号，也可以通过设置$compile_id编译号属性来一次性设定。

Example 13-12. display
例子 13-12. 显示

include("Smarty.class.php");
$smarty = new Smarty;
$smarty->caching = true;

// only do db calls if cache doesn't exist
// 只有在缓存不存在时才调用数据库
if(!$smarty->is_cached("index.tpl"))
{

 // dummy up some data
 $address = "245 N 50th";
 $db_data = array(
	 "City" => "Lincoln",
	 "State" => "Nebraska",
	 "Zip" = > "68502"
	 );

 $smarty->assign("Name","Fred");
 $smarty->assign("Address",$address);
 $smarty->assign($db_data);

}

// display the output
// 显示输出
$smarty->display("index.tpl");

Use the syntax for template resources to display files outside of the $template_dir directory.

通过模板资源的语法来使用不在$template_dir模板目录 下的文件。

Example 13-13. function display template resource examples
例子 13-13. 显示模板资源

// absolute filepath
// 绝对路径 by www.yiibai.com
$smarty->display("/usr/local/include/templates/header.tpl");

// absolute filepath (same thing)
// 绝对路径(另外一种方式)
$smarty->display("file:/usr/local/include/templates/header.tpl");

// windows absolute filepath (MUST use "file:" prefix)
// WINDOS平台下的绝对路径(必须使用“file:”前缀)
$smarty->display("file:C:/www/pub/templates/header.tpl");

// include from template resource named "db"
// 从模板资源“db“中调用
$smarty->display("db:header.tpl");

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty display方法

Smarty fetch方法 - Smarty教程™

fetch
取得输出的内容

string fetch (string template [, string cache_id [, string compile_id]])

返回一个模板输出的内容(HTML代码)，而不是直接显示出来，需要指定一个合法的模 板资源的类型和路径。你还可以通过 第二个可选参数指定一个缓存号，相关的信息可以查看缓存。

通过第三个可选参数，可以指定一个编译号。这在你想把一个模板编译成不同版本时使用，比如针对不同的语言编译模板。编译号的另外一个作用是，如果你 有多个$template_dir模板目录，但只有一个$compile_dir编译后存档目录，这时可以为每一个$template_dir模板目录指 定一个编译号，以避免相同的模板文件在编译后会互相覆盖。相对于在每一次调用display()的时候都指定编译号，也可以通过设置$compile_id编 译号属性来一次性设定。

Example 13-14. fetch
例子 13-14. 取得输出的内容

include("Smarty.class.php");
$smarty = new Smarty;

$smarty->caching = true;

// only do db calls if cache doesn't exist
// 只有在缓存不存在时才调用数据库
if(!$smarty->is_cached("index.tpl"))
{

 // dummy up some data
 $address = "245 N 50th";
 $db_data = array(
	 "City" => "Lincoln",
	 "State" => "Nebraska",
	 "Zip" = > "68502"
	 );

 $smarty->assign("Name","Fred");
 $smarty->assign("Address",$address);
 $smarty->assign($db_data);

}

// capture the output
// 捕获输出
$output = $smarty->fetch("index.tpl");

// do something with $output here
// 对将要输出的内容进行处理

echo $output;

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty fetch方法

Smarty Caching缓存 - Smarty教程™

Caching [缓存]

Table of Contents [内容列表]

缓存被用来保存一个文档的输出从而加速display()或fetch()函数的执行。如果一个函数被加进缓存，那么实际输出的内容将用缓存来代替。缓存可让事物非常快速的执行，特别是带有长计算时间的模板。一旦display()或fetch()用缓存输出，那么一个缓存文档将非常容易用几个模板文档或是配置文档等来组成〔功力不小〕。

一旦模板是动态〔应该不难理解〕的，哪些文档你加了缓存，缓存时间多长都是很重要的。举个例子，比如你站点的首页内容不是经常更改，那么对首页缓存一个小时或是更长都可得到很好效果。相反，几分钟就要更新一下信息的天气地图页面，用缓存就不好了。

Setting Up Caching [建立缓存]

The first thing to do is enable caching. This is done by setting $caching = true (or 1.)
首先要做的就是让缓存可用。这就要设置$caching = true(或 1.)

Example 14-1. enabling caching
例14-1.使缓存可用

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

$smarty->display('index.tpl');

建立缓存后，display('index.tpl')函数会把模板返回原来状态〔没缓存〕，也会把输出保存copy〖n.名词〗到$cache_dir.下次调用display('index.tpl')，保存的缓存copy〖n.〗会被再用来代替原来的模板。

技术提示：在$chche_dir目录里的文档命名跟模板一致。尽管是用.php作为扩展名，但并不会被当作php代码来解析。所以不要去修改它。

每个缓存页都有一个用$cache_lifetime来控制的会话期。初始值是3600秒，就是一小时〔废话嘛〕。会话期结束，缓存就会重建。你可以通过设置$caching=2来控制单个缓存文件各自的的过期时间。祥细内容察看$cache_lifetime里面的列表。

Example 14-2. setting cache_lifetime per cache
例14-2 设置单个缓存会话期〔时间〕

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = 2; // lifetime is per cache

// set the cache_lifetime for index.tpl to 5 minutes
$smarty->cache_lifetime = 300;
$smarty->display('index.tpl');

// set the cache_lifetime for home.tpl to 1 hour
$smarty->cache_lifetime = 3600;
$smarty->display('home.tpl');

// NOTE: the following $cache_lifetime setting will not work when $caching = 2.
//提示：在$chching=2后面的$chche_lifetime不会起作用。
// The cache lifetime for home.tpl has already been set
// to 1 hour, and will no longer respect the value of $cache_lifetime.
// home.tpl的缓存会话期设为1小时后，不会再按$cache_lifetime的值改变。
// The home.tpl cache will still expire after 1 hour.
// home.tpl的缓存会在1小时后结束。$smarty->cache_lifetime = 30; // 30 seconds
$smarty->display('home.tpl');

如果$compile_check可用，每个跟缓存文档相关的模板文档和配置文档都会被检查来确定是否需要修改。在缓存产生后，改动任何文档，缓存也跟着更新改动。设置$compile_check为false，这是实现最佳性能的最小改动〔应该是这样:D〕。

Example 14-3. enabling $compile_check
例14-3.可用$compile_check

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;
$smarty->compile_check = true;

$smarty->display('index.tpl');

一旦$force_compile可用，缓存文档会一直重建。这有效地关闭缓存。$force_compile只是用来调试，更有效关闭缓存的方法是让$caching = false(或0.)

is_cached()函数可用来测试一个模板是否有有效的缓存。如果一个缓存模板需要从数据库中获取数据，可以用这个函数来跳过这个过程。

Example 14-4. using is_cached()
例14-4.使用is_cached()

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;
// www.yiibai.com/smarty
if(!$smarty->is_cached('index.tpl')) {
	// No cache available, do variable assignments here.
	$contents = get_database_contents();
	$smarty->assign($contents);
}

$smarty->display('index.tpl');

你可以插入模板函数insert来使部分页面动态化。除了在右下方显示的标语外整个页面都可以缓存。在缓存内容里面可以插入函数来使标语也动态化。查看相关文档关于insert的细节和例子。

你可以用clear_all_cache()来清除所有缓存，或用clear_cache()来清除单个缓存文档。

Example 14-5. clearing the cache
例14-5.清除缓存

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

// clear out all cache files
$smarty->clear_all_cache();

// clear only cache for index.tpl
$smarty->clear_cache('index.tpl');

$smarty->display('index.tpl');

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty Caching缓存

Smarty 建立缓存 - Smarty教程™

Setting Up Caching [建立缓存]

首先要做的就是让缓存可用。这就要设置$caching = true(或 1.)

Example 14-1. enabling caching
例14-1.使缓存可用

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

$smarty->display('index.tpl');

建立缓存后，display('index.tpl')函数会把模板返回原来状态〔没缓存〕，也会把输出保存copy〖n.名词〗到$cache_dir.下次调用display('index.tpl')，保存的缓存copy〖n.〗会被再用来代替原来的模板。

技术提示：在$chche_dir目录里的文档命名跟模板一致。尽管是用.php作为扩展名，但并不会被当作php代码来解析。所以不要去修改它。

每个缓存页都有一个用$cache_lifetime来控制的会话期。初始值是3600秒，就是一小时〔废话嘛〕。会话期结束，缓存就会重建。你可以通过设置$caching=2来控制单个缓存文件各自的的过期时间。祥细内容察看$cache_lifetime里面的列表。

Example 14-2. setting cache_lifetime per cache
例14-2 设置单个缓存会话期〔时间〕

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = 2; // lifetime is per cache

// set the cache_lifetime for index.tpl to 5 minutes
$smarty->cache_lifetime = 300;
$smarty->display('index.tpl');

// set the cache_lifetime for home.tpl to 1 hour
$smarty->cache_lifetime = 3600;
$smarty->display('home.tpl');

// NOTE: the following $cache_lifetime setting will not work when $caching = 2.
//提示：在$chching=2后面的$chche_lifetime不会起作用。
// The cache lifetime for home.tpl has already been set
// to 1 hour, and will no longer respect the value of $cache_lifetime.
// home.tpl的缓存会话期设为1小时后，不会再按$cache_lifetime的值改变。
// The home.tpl cache will still expire after 1 hour.
// home.tpl的缓存会在1小时后结束。$smarty->cache_lifetime = 30; // 30 seconds
$smarty->display('home.tpl');

如果$compile_check可用，每个跟缓存文档相关的模板文档和配置文档都会被检查来确定是否需要修改。在缓存产生后，改动任何文档，缓存也跟着更新改动。设置$compile_check为false，这是实现最佳性能的最小改动〔应该是这样:D〕。

Example 14-3. enabling $compile_check
例14-3.可用$compile_check

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;
$smarty->compile_check = true;

$smarty->display('index.tpl');

一旦$force_compile可用，缓存文档会一直重建。这有效地关闭缓存。$force_compile只是用来调试，更有效关闭缓存的方法是让$caching = false(或0.)

is_cached()函数可用来测试一个模板是否有有效的缓存。如果一个缓存模板需要从数据库中获取数据，可以用这个函数来跳过这个过程。

例14-4.使用is_cached()

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

if(!$smarty->is_cached('index.tpl')) {
	// No cache available, do variable assignments here.
	$contents = get_database_contents();
	$smarty->assign($contents);
}

$smarty->display('index.tpl');

你可以插入模板函数insert来使部分页面动态化。除了在右下方显示的标语外整个页面都可以缓存。在缓存内容里面可以插入函数来使标语也动态化。查看相关文档关于insert的细节和例子。

你可以用clear_all_cache()来清除所有缓存，或用clear_cache()来清除单个缓存文档。

Example 14-5. clearing the cache
例14-5.清除缓存

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

// clear out all cache files
$smarty->clear_all_cache();

// clear only cache for index.tpl
$smarty->clear_cache('index.tpl');

$smarty->display('index.tpl');

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty 建立缓存

Smarty多个缓存 - Smarty教程™

Multiple Caches Per Page 每页多个缓存

你可以用单个函数display()或fetch()来输出多个缓存文档。display('index.tpl')在多种条件下会有不同的输出内容，要单独的把缓存分开。可以通过函数的第二参数cache_id来达到效果。

Example 14-6. passing a cache_id to display()
例14-6.传给display()一个cache_id

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

$my_cache_id = $_GET['article_id'];

$smarty->display('index.tpl',$my_cache_id);

上面，我们通过变量$my_cache_id作为cache_id来display()。在index.tpl里$my_cache_id的每个唯一值，会建立单独的缓存。在这个例子里，"article_id"在URL传送，并用作cache_id。

技术提示：要注意从客户端(web浏览器)传值到Smarty(或任何PHP应用程序)的过程。尽管上面的例子用article_id从URL传值看起来很方便，却可能有糟糕的后果[安全问题]。cache_id被用来在文件系统里创建目录，如果用户想为article_id赋一个很大的值，或写一些代码来快速发送随机的article_ids，就有可能会使服务器出现问题。确定在使用它之前清空已存在的数据。在这个例子，可能你知道article_id的长度(值吧？！)是10字符，并只由字符-数字组成，在数据库里是个可用的article_id。Check for this!要注意检查这个问题！〔要注意这个提示!不用再说了吧？〕

确定传给is_cached()和clear_cache()的第二参数是同一个cache_id。

Example 14-7. passing a cache_id to is_cached()
例14-7.传给is_cached()一个cache_id

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

$my_cache_id = $_GET['article_id'];

if(!$smarty->is_cached('index.tpl',$my_cache_id)) {
	// No cache available, do variable assignments here.
	$contents = get_database_contents();
	$smarty->assign($contents);
}

$smarty->display('index.tpl',$my_cache_id);

你可以通过把clear_cache()的第一参数设为null来为特定的cache_id清除所有缓存。

Example 14-8. clearing all caches for a particular cache_id
例14-8.为特定的cache_id清除所有缓存

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

// clear all caches with "sports" as the cache_id
$smarty->clear_cache(null,"sports");

$smarty->display('index.tpl',"sports");

通过这种方式，你可以用相同的cache_id来把你的缓存集合起来。

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty多个缓存

Smarty缓存集合 - Smarty教程™

Cache Groups [缓存集合]

你可以通过建立cache_id集合做更祥细的集合体。在cache_id的值里用竖线"|"来分开子集合。你可以尽可能多的包含子集合。 

Example 14-9. cache_id groups
例14-9.cache_id集合

require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

// clear all caches with "sports|basketball" as the first two cache_id groups
$smarty->clear_cache(null,"sports|basketball");
// www.yiibai.com/smarty
// clear all caches with "sports" as the first cache_id group. This would
// include "sports|basketball", or "sports|(anything)|(anything)|(anything)|..."
$smarty->clear_cache(null,"sports");

$smarty->display('index.tpl',"sports|basketball");

技术提示:缓存集合并不像cache_id一样对模板使用路径。比如，如果你display('themes/blue/index.tpl'),那么在"themes/blue"目录下你并不能清除缓存。想要清除缓存，必须先用cache_id把缓存集合，像这样display('themes/blue/index.tpl','themes|blue')；然后就可以用clear_cache(null,'themes|blue')清除blue theme(蓝色主题？！老外也真会叫...)下的缓存。 

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty缓存集合

Smarty控制插件输出缓冲 - Smarty教程™

Controlling Cacheability of Plugins' Output控制插件输出的缓冲能力

自从Smarty-2.6.0插件以来，如果注册它们，则插件的缓存能力能够被重新声明的。register_block，register_compiler_function 和register_function的第3个参数就是$ cacheable , 并且它的值默认为true。当然，在2.6.0版本之前它的默认值也是这样的。

当用$cacheable=false来这册一个插件，则每次这个页面被输出的时候，这个插件就会被使用，即使这个页面来自缓存。这个插件函数的行为有点像这个函数insert。

和{insert}相反，插件的属性默认是不缓存的。通过使用第四个参数 $cache_attrs ，它们能够被重新声明为缓存的。 $cache_attrs 是一个属性名字的数组，可以被缓存，所以每次当它被从缓存中取出的时候，这个插件函数获得值-----因为这个页面会被写入用来缓存。

Example 14-10. Preventing a plugin's output from being cached

例14-10.阻止插件从缓存中输出

index.php:

require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;

function remaining_seconds($params, &$smarty) {
 $remain = $params['endtime'] - time();
 if ($remain >=0)
 return $remain . " second(s)";
 else
 return "done";
}

$smarty->register_function('remaining', 'remaining_seconds', false, array('endtime'));

if (!$smarty->is_cached('index.tpl')) {
 // fetch $obj from db and assign...
 $smarty->assign_by_ref('obj', $obj);
}

$smarty->display('index.tpl');
// by www.yiibai.com/smarty

index.tpl:

Time Remaining: {remain endtime=$obj->endtime}

直到$obj运行结束，时间的秒数在每一个页面输出的时候会改变，即使这个页面被缓存。只要结束时间属性被缓存，当页面被写入到缓存但是没有对这个页面接着的请求的时候对象只是不得不重新从数据库里取出而已。

Example 14-11. Preventing a whole passage of a template from being cached

例14-11.阻止一个模板文件的 整篇被缓存

index.php:

require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;

function smarty_block_dynamic($param, $content, &$smarty) {
 return $content;
}
$smarty->register_block('dynamic', 'smarty_block_dynamic', false);

$smarty->display('index.tpl');

index.tpl:

Page created: {"0"|date_format:"%D %H:%M:%S"}

{dynamic}

Now is: {"0"|date_format:"%D %H:%M:%S"}

... do other stuff ...

{/dynamic}

当重新加载这个页面，你将会注意到这两个日期不同。一个是“动态“，一个是“静态”。你能够在{dynamic}...{/dynamic}之间作任何事情，并且保证它将不会像剩下的页面一样被缓存。

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty控制插件输出缓冲

Smarty对象 - Smarty教程™

Objects

对象

SMARTY允许通过模板访问PHP对象。有两种方式来访问它们。一种是注册对象到模板，然后通过类似于用户自定义函数的形式来访问它。另一种方法给模板分配对象,然后通过访问其它赋值变量类似的方法进行访问。第一种方法有一个很好的模板语法，同时它作为一个注册对象被限制为几个固定的方法和目标，这样是比较安全的。然而一个注册对象不能够在相对自身数组里面循环使用和赋值。总之，你根据你自己的需求来觉得选用那种方法，但是使用第一种方法的话，可以让你的模伴语法达到最小。

如果安全选项激活后，就没有私有成员或者函数能够被访问(以"_"开头)。如果有一个同名成员或者对象存在，那么方法将被使用。

你可以限制成员和函数，但是外解可以通过列举它们为一个第三注册变量的数组的方式来访问它。

一般情况下，参数通过模板传递给对象的方法和自定义函数获得参数的方法是一样的。一个混合数组作为第一个参数传递，而SMARTY对象作为第二个。如果你想像传统的对象参数一样一次传递一个参数，设置第四个参数为 FALSE即可。

Example 15-1. using a registered or assigned object

<?php
// the object

class My_Object() {
	function meth1($params, &$smarty_obj) {
		return "this is my meth1";
	}
}

$myobj = new My_Object;
// registering the object (will be by reference)
$smarty->register_object("foobar",$myobj);
// if we want to restrict access to certain methods or properties, list them
$smarty->register_object("foobar",$myobj,array('meth1','meth2','prop1'));
// if you want to use the traditional object parameter format, pass a boolean of false
$smarty->register_object("foobar",$myobj,null,false);

// We can also assign objects. Assign by ref when possible.
$smarty->assign_by_ref("myobj", $myobj);

$smarty->display("index.tpl");
?>
// www.yiibai.com/smarty
TEMPLATE:

{* access our registered object *}
{foobar->meth1 p1="foo" p2=$bar}

{* you can also assign the output *}
{foobar->meth1 p1="foo" p2=$bar assign="output"}
the output was {$output)

{* access our assigned object *}
{$myobj->meth1("foo",$bar)}

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty对象

Smarty预过滤器 - Smarty教程™

Prefilters

预过滤器

模板后过滤器是一些PHP函数，模板就是在那些函数编译后才运行。这样有利于预先处理你的模板，删除不不需要的内容，监视对模板进行的操作，例如：预过滤器同样能够通过 load filter() 函数和设置 $autoload filters 变量来注册或者从工具目录里载入。SMARTY将传递模板输出作为第一个参数，通过自定义函数返回处理结果。

Example 15-2. using a template prefilter

<?php
// put this in your application
function remove_dw_comments($tpl_source, &$smarty)
{
 return preg_replace("/<!--#.*-->/U","",$tpl_source);
}

// register the prefilter www.yiibai.com
$smarty->register_prefilter("remove_dw_comments");
$smarty->display("index.tpl");
?>

{* Smarty template index.tpl *}
<!--# this line will get removed by the prefilter -->

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty预过滤器

Smarty输出滤镜 - Smarty教程™

Output Filters

输出滤镜

当模板通过函数 display() 或者 fetch()被调用时，它的输出能够通过一个或者多个滤镜而发出。 它与预过滤器的不同之处就是预过滤器编译模板是在模板保存到磁盘之前，输出滤镜是在它执行的时候才操作模板输出的。

Output filters can be either registered or loaded from the plugins directory by using load_filter() function or by setting $autoload_filters variable. Smarty will pass the template output as the first argument, and expect the function to return the result of the processing.

输出滤镜同样能够通过 load filter() 函数和设置 $autoload filters 变量来注册或者从工具目录里载入。SMARTY将传递模板输出作为第一个参数，通过自定义函数返回处理结果。

Example 15-4. using a template outputfilter -http://www.yiibai.com/smarty

<?php // put this in your application function protect_email($tpl_output, &$smarty) { $tpl_output = preg_replace('!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!', '$1%40$2', $tpl_output); return $tpl_output; } // register the outputfilter $smarty->register_outputfilter("protect_email"); $smarty->display("index.tpl"); // now any occurrence of an email address in the template output will have // a simple protection against spambots ?>

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty输出滤镜

Smarty缓冲处理函数 - Smarty教程™

Cache Handler Function

缓冲处理函数

作为一个可选择使用的默认基于文本的缓冲机制，你可以定制或者自定义缓冲处理函数来进行读、写、清除缓冲文件。

如果要在应用程序下建立一个函数，SMARTY将会使用一个缓冲处理。设置这个函数名为 $cache handler func 中类变量名。Smarty将使用这个函数来处理缓冲数据。第一个参数不管是‘读’，‘写’，‘清除’，都是动态的。第二个参数是 Smarty 对象。第三个参数是缓冲的内容。在进行写操作之前，Smarty 传递这些缓冲内容给这些参量。在进行读操作之前，Smarty预处理那些缓冲数据相关或者封装好了的函数。在进行清除操作之前，从他没有使用起，就传递一个虚拟变量。第四个参数是模板文件名(需要读和写的文件)，第五个函数是缓冲ID(额外选项)，然后第六个参数是编译的ID(额外选项)。

Note: The last parameter ($exp_time) was added in Smarty-2.6.0.

注意：最新的参数名 ($exp_time) 在Smarty-2.6.0中才加入的。

<?php
/*

example usage:
// wwww.yiibai.com
include('Smarty.class.php');
include('mysql_cache_handler.php');

$smarty = new Smarty;
$smarty->cache_handler_func = 'mysql_cache_handler';

$smarty->display('index.tpl');

mysql database is expected in this format:

create database SMARTY_CACHE;

create table CACHE_PAGES(
CacheID char(32) PRIMARY KEY,
CacheContents MEDIUMTEXT NOT NULL
);

*/

function mysql_cache_handler($action, &$smarty_obj, &$cache_content, $tpl_file=null, $cache_id=null, $compile_id=null, $exp_time=null)
{
	// set db host, user and pass here
	$db_host = 'localhost';
	$db_user = 'myuser';
	$db_pass = 'mypass';
	$db_name = 'SMARTY_CACHE';
	$use_gzip = false;

	// create unique cache id
	$CacheID = md5($tpl_file.$cache_id.$compile_id);

	if(! $link = mysql_pconnect($db_host, $db_user, $db_pass)) {
		$smarty_obj->_trigger_error_msg("cache_handler: could not connect to database");
		return false;
	}
	mysql_select_db($db_name);

	switch ($action) {
		case 'read':
			// save cache to database
			$results = mysql_query("select CacheContents from CACHE_PAGES where CacheID='$CacheID'");
			if(!$results) {
				$smarty_obj->_trigger_error_msg("cache_handler: query failed.");
			}
			$row = mysql_fetch_array($results,MYSQL_ASSOC);

			if($use_gzip && function_exists("gzuncompress")) {
				$cache_contents = gzuncompress($row["CacheContents"]);
			} else {
				$cache_contents = $row["CacheContents"];
			}
			$return = $results;
			break;
		case 'write':
			// save cache to database

			if($use_gzip && function_exists("gzcompress")) {
				// compress the contents for storage efficiency
				$contents = gzcompress($cache_content);
			} else {
				$contents = $cache_content;
			}
			$results = mysql_query("replace into CACHE_PAGES values(
							'$CacheID',
							'".addslashes($contents)."')
						");
			if(!$results) {
				$smarty_obj->_trigger_error_msg("cache_handler: query failed.");
			}
			$return = $results;
			break;
		case 'clear':
			// clear cache info
			if(empty($cache_id) && empty($compile_id) && empty($tpl_file)) {
				// clear them all
				$results = mysql_query("delete from CACHE_PAGES");
			} else {
				$results = mysql_query("delete from CACHE_PAGES where CacheID='$CacheID'");
			}
			if(!$results) {
				$smarty_obj->_trigger_error_msg("cache_handler: query failed.");
			}
			$return = $results;
			break;
		default:
			// error, unknown action
			$smarty_obj->_trigger_error_msg("cache_handler: unknown action "$action"");
			$return = false;
			break;
	}
	mysql_close($link);
	return $return;

}

?>

本站代码下载：http://www.yiibai.com/siteinfo/download.html

本文属作者原创，转载请注明出处：易百教程 » Smarty缓冲处理函数