1、smarty 实例教程(1)一、什么是 smarty?smarty 是一个使用 PHP 写出来的模板 PHP 模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用 PHP 程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。二、smarty 优点:1. 速度:采用 smarty 编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。2. 编译型:采用 smarty 编写的程序在运行时要编译成一个非模板技术的 PHP文件,这个文件采用了 PHP 与 HTML 混合的方
2、式,在下一次访问模板时将 WEB 请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下) 3. 缓存技术:smarty 选用的一种缓存技术,它可以将用户最终看到的 HTML 文件缓存成一个静态的 HTML 页,当设定 smarty 的 cache 属性为true 时,在 smarty 设定的 cachetime 期内将用户的 WEB 请求直接转换到这个静态的 HTML 文件中来,这相当于调用一个静态的 HTML 文件。4. 插件技术:smarty 可以自定义插件。插件实际就是一些自定义的函数。5. 模板中可以使用 if/elseif/else/endif。在模板文件使用判
3、断语句可以非常方便的对模板进行格式重排。三、不适合使用 smarty 的地方:1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,这类型的程序使用 smarty 会使模板处理速度变慢。2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用 smarty会丧失 php 开发迅速的优点。四、安装 smarty 类:安装 smarty 的环境:php 版本 4.06 以上版本。安装 smarty 方法非常简单,从 http:/ 中下载 smarty.t.将 LIB 中所有文件拷入 comm 目录,完成基本安装.其它高级安装使用方法请看手册.五、smarty 在模板中的使用
4、:本节通过几个实例来讲一讲 smarty 的使用。smarty 模板通常使用.tpl 来标识,有些人为了美工方便,将扩展名直接写成.html,也是可以的。本文中采用 smarty 标准写法:以.tpl 来表示为一个 smarty 模板。PHP 代码:-实例 1:先来看一个简单的例子。=index.tpl=* 显示是 smarty 变量识符里的用*包含的文字为注释内容 *include file=“header.tpl“*页面头*大家好,我叫$name, 欢迎大家阅读我的 smarty 学习材料。include file=“foot.tpl“*页面尾* 上边的这个例子是一个 tpl 模板,其中:
5、1. *是模板页的注释,它在 smarty 对模板进行解析时不进行任何输出,仅供模板设计师对模板进行注释。2. include file=“xxx.tpl“使用此句将一个模板文件包含到当前页面中,例子中将在网站中公用事的 head.tpl 与 foot.tpl 进行了包含,你可以这样想,使用这一句将 xxx.tpl 中的内容全部复制在当前语句处。当然,你不使用这一句也可以,将 XXX.tpl 中的内容复制到当前语句处也是完全可以了。3.$name: 模板变量,smarty 中的核心组成,采用 smarty 定义的左边界符与右边界符 包含着、以 PHP 变量形式给出,在 smarty 程序中将使
6、用$smarty-assign(“name“, “李晓军“);将模板中的$name 替换成“ 李晓军”三个字。整个实例源程序如下:=header.tpl=大师兄 smarty 教程=foot.tpl=CopyRight(C) by 大师兄 2004 年 8 月=index.tpl=* 显示是 smarty 变量识符里的用*包含的文字为注释内容 *include file=“header.tpl“*页面头*大家好,我叫$name, 欢迎大家阅读我的 smarty 学习材料。include file=“foot.tpl“*页面尾* =index.php=templates(“./templates
7、“); /设置模板目录$smarty-templates_c(“./templates_c“); /设置编译目录/-/左右边界符,默认为,但实际应用当中容易与 JavaScript/相冲突,所以建议设成 或其它。/-$smarty-left_delimiter = “; $smarty-right_delimiter = “;$smarty-assign(“name“, “李晓军“); /进行模板变量替换/编译并显示位于./templates 下的 index.tpl 模板$smarty-display(“index.tpl“); ?最终执行这个程序时将显示为:=执行 index.php=大师
8、兄 smarty 教程大家好,我叫李晓军, 欢迎大家阅读我的 smarty 学习材料。CopyRight(C) by 大师兄 2004 年 8 月smarty 实例教程(2)这个例子是综合使用 smarty 模板参数的一个例子,这些参数用来控制模板的输出,我只选其中几个,其它的参数你去看参考吧。 =exmple2.tpl=大师兄 smarty 示例 21. 第一句首字母要大写:$str1|capitalize2. 第二句模板变量 + 李晓军:$str2|cat:“李晓军“3. 第三句输出当前日期:$str3|date_format:“%Y 年%m 月%d 日“4. 第四句.php 程序中不处理
9、,它显示默认值:$str4|default:“没有值!“5。第五句要让它缩进 8 个空白字母位,并使用“*“取替这 8 个空白字符:$str5|indent:8:“*“6. 第六句把 TEACHerLI 全部变为小写: $str6|lower7. 第七句把变量中的 teacherli 替换成:李晓军: $str7|replace:“teacherli“:“李晓军“8. 第八句为组合使用变量修改器:$str8|capitalize|cat:“这里是新加的时间:“|date_format:“%Y 年%m 月%d 日“|lower=example2 .php=templates(“./templat
10、es“); /设置模板目录$smarty-templates_c(“./templates_c“); /设置编译目录/-/左右边界符,默认为,但实际应用当中容易与 JavaScript/相冲突,所以建议设成 或其它。/-$smarty-left_delimiter = “; $smarty-right_delimiter = “;$smarty-assign(“str1“, “my name is xiao jun, li.“); /将 str1 替换成 My Name Is Xiao Jun, Li.$smarty-assign(“str2“, “我的名字叫:“); /输出: 我的名字叫:
11、李晓军$smarty-assign(“str3“, “公元“); /输出公元 2004 年 8 月 21 日(我的当前时间)/$smarty-assign(“str4“, “); /第四句不处理时会显示默认值,如果使用前面这一句则替换为“$smarty-assign(“str5“, “前边 8 个*“); /第五句输出:*前边 8 个*$smarty-assign(“str6“, “TEACHerLI“); /这里将输出$smarty-assign(“str7“, “this is teacherli“); /在模板中显示为:this is 李晓军$smarty-assign(“str8“,
12、“HERE IS COMBINING:“);/编译并显示位于./templates 下的 index.tpl 模板$smarty-display(“example2.tpl“); ?最终输出效果:=example2.php 输出效果:=大师兄 smarty 示例 21. 第一句首字母要大写:My Name Is Xiao Jun, Li.2. 第二句模板变量 + 李晓军:我的名字叫:李晓军3. 第三句输出当前日期:公元 2004 年 8 月 21 日4. 第四句.php 程序中不处理,它显示默认值:没有值!5。第五句要让它缩进 8 个空白字母位,并使用“*“取替这 8 个空白字符:*前边 8
13、个*6. 第六句把 TEACHerLI 全部变为小写:7. 第七句把变量中的 teacherli 替换成:李晓军:this is 李晓军8. 第八句为组合使用变量修改器:Here is Combining:这里是新加的时间:2004 年 8 月 21 日在模板中的这些参数被称为变量修改器(variable modifiers),使用这些参数可对模板进行一系列的修改控制。变量修改器使用“|“和调节器名称应用修改器, 使用“:“分开修改器参数。变量修改器可以组合使用,像第八句一样,实际使用中可以灵活应用。实例 3.=example3.tpl=模板中内定的一些函数 *下面的这一段相当于在模板内部定义
14、一个变量 UserName*assign var=“UserName“ value=“大师兄“ 这里将显示模板内部定义的一个变量:UserName = $UserName下面的这一行将显示 3 个 checkBox:html_checkboxes name=“CheckBox“ values=$CheckName checked=$IsChecked output=$value separator=“下面在这一行将显示 3 个 radio:html_radioes name=“RadioBox“ values=$RadioName checked=$IsChecked output=$valu
15、e separator=“下面显示一个月,日, 年选择框:html_select_dateCopyRight(C) By XiaoJun, Li 2004mailto address=“teacherli163.ccom“ text=“联系作者“=example3.php=template_dir = ./templates/;$smarty-compile_dir = ./templates_c/;$smarty-config_dir = ./configs/;$smarty-cache_dir = ./cache/;$smarty-caching = false;/-/处理html_che
16、ckboxes name=“CheckBox“ values=$CheckName checked=$IsChecked output=$value separator=“/-$smarty-assign(CheckName, array(1001 = 语文 ,1002 = 数学 ,1003 = 外语 );$smarty-assign(IsChecked, 1001);/-/处理html_radioes name=“RadioBox“ values=$RadioName checked=$IsChecked output=$value separator=“/-$smarty-assign(R
17、adioName, array(1001 = 语文 ,1002 = 数学 ,1003 = 外语 );$smarty-assign(IsChecked, 1001);/-/html_select_date不用处理会自动输出/-$smarty-display(“example3.tpl“);?smarty 实例教程(3) =example3.php 输出效果:=模板中内定的一些函数 assign var=“UserName“ value=“大师兄“ 这里将显示模板内部定义的一个变量:UserName = 大师兄下面的这一行将显示 3 个 checkBox:语文数学外语下面在这一行将显示 3 个 r
18、adio:语文数学外语下面显示一个月,日, 年选择框:JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember010203040506070809101112131415161718192021222324252627282930312004CopyRight(C) By XiaoJun, Li 2004例 3 使用了一些 smarty 模板中内置的一些函数,相似的函数大家可以在手册中查到,使用方法很简单,大家可以自己去查找.例 4.模板控制(if / elseif / else/ endif )=ex
19、ample4.tpl=模板中的流程控制 assign var=“tbColor“ value=“#D4D0C8“色彩:$tbColorsection name=loop loop=$Newsif $tbColor = “#D4D0C8“assign var=“tbColor“ value=“#EEEEEE“else $tbColor = “#EEEEEE“assign var=“tbColor“ value=“#D4D0C8“/if$Newsloop.newsID$Newsloop.newsTitle/section=example4.php=template_dir = ./template
20、s/;$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(“
21、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(“ex
22、ample4.tpl“);? smarty 实例教程(4) =example4.php 输出:=模板中的流程控制 001第 1 条新闻002第 2 条新闻003第 3 条新闻004第 4 条新闻005第 5 条新闻006第 6 条新闻007第 7 条新闻008第 8 条新闻模板文件中使用:if $tbColor = “#D4D0C8“assign var=“tbColor“ value=“#EEEEEE“else $tbColor = “#EEEEEE“assign var=“tbColor“ value=“#D4D0C8“/if这一语句块进行设置每一行的背景颜色, assign var=“t
23、bColor“ value=“#D4D0C8“还记的吧,是例 3 中设置模板内部变量的定义方法,使用模板内置 的流程控制语句有时可以极大程度上提高程序的控制能力,下面一个例子是 中曾经有位朋友问过的,我将它作为实例放在这里供大家学习.例 5: 使用模板内置流程控制语句进行一行多单元格内容输出 , 也就是在视觉上 smarty 每记输出几条记录:=example5.tpl=一行输出多条记录 section name=loop loop=$News step=1 if $smarty.section.loop.index % 4 = 0/if$Newsloop.newsID$Newsloop.n
24、ewsTitle/section=example5.php=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
25、(“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 条
26、新闻“);$smarty-assign(“News“, $array);$smarty-display(“example5.tpl“);?=example5.php 输出内容:=一行输出多条记录 001第 1 条新闻002第 2 条新闻003第 3 条新闻004第 4 条新闻005第 5 条新闻006第 6 条新闻007第 7 条新闻008第 8 条新闻说明:本来还可以优化,使得第一行不输出一个空行的 ,但是学习程序,简单为好,先就这么用了. 在这里说明一下:section name=loop loop=$News step=1 if $smarty.section.loop.index %
27、4 = 0/if$Newsloop.newsID$Newsloop.newsTitle/sectionsection/section指的是一个循环部分,在下一节会有详细的介绍,我们主要来看看这一句:if $smarty.section.loop.index % 4 = 0$smarty.section.loop 指出 $smarty 的实例中的 section 段有一个叫 loop 的部分, 它有一个属性叫 index, 它的表示当前循环的索引值,从 0 开始递增, 我们把它%4 后与 0 相比较,也就是说,如果当前的索引值是 4的倍数,它就输出一个,否则执行下面的部分,很简单的就解决了一个在程序上实现起来很麻烦的事情.