大师兄Smarty实例入门教程 2:程序设计部分

发布于:2021-09-18 11:25:04

教程二:程序设计部分?
在 smarty 的模板设计部分我简单的把 smarty 在模板中的一些常用设置做了简单的介绍,这 一节主要来介绍一下如何在 smarty 中开始我们程序设计。? ? ? 首先来介绍一下在上一节中我们使用的过的.php 文件中的一些元素。同样,我们拿上一节 中最开始的那个 index.php 文件来说明一下:? ? ================================================? index.php? ================================================? ? ? CODE:[Copy?to?clipboard]<?php? /*********************************************? *? *? 文件名:? index.php? *? 作? 用:? 显示实例程序? *? *? 作? 者:? 大师兄? *?Email:? teacherli@163.com? *? *********************************************/? include_once("./comm/Smarty.class.php");?//包含 smarty 类文件? ? $smarty?=?new?Smarty();?//建立 smarty 实例对象$smarty? $smarty‐>template_dir?=?"./templates";//设置模板目录? $smarty‐>compile_dir?=?"./templates_c";?//设置编译目录? ? ? //****大家注意,这里我是我新加入的****//? ? $tpl‐>cache_dir?=?"./cache";?//设置缓存目录? $smarty‐>cache_lifetime?=?60?*?60?*?24;?//设置缓存时间? $smarty‐>caching?=?true;?//设置缓存方式? ? //‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐? //左右边界符,默认为{},但实际应用当中容易与 JavaScript? //相冲突,所以建议设成<{}>或其它。? //‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐? $smarty‐>left_delimiter?=?"<{";? ?

$smarty‐>right_delimiter?=?"}>";? ? $smarty‐>assign("name",?"李晓军");?//进行模板变量替换? ? //编译并显示位于./templates 下的 index.tpl 模板? $smarty‐>display("index.tpl");? ? ?>? 我们可以看到,smarty 的程序部分实际就是符合 php 语言规范的一组代码,我们依次来解 释一下:? 1。/**/语句:? ? 包含的部分为程序篇头注释。 主要的内容应该为对程序的作用, 版权与作者及编写时间做一 个简单的介绍,这在 smarty 中不是必需的,但从程序的风格来讲,这是一个好的风格。? ? 2。include_once 语句:? 它将安装到网站的 smarty 文件包含到当前文件中,注意包含的路径一定要写正确。? ? 3。$smarty?=?new?Smarty():? 这一句新建一个 Smarty 对象$smarty,简单的一个对象的实例化。? ? 4。$smarty‐>template_dir?=?""?:? ? 这一句指明$smarty 对象使用 tpl 模板时的路径,它是一个目录,在没有这一句时,Smarty 默认的模板路径为当前目录的 templates 目录,实际在写程序时,我们要将这一句写明,这 也是一种好的程序风格。? 5。$smarty‐>compile_dir?=?""?:? 这一句指明$smarty 对象进行编译时的目录。 在模板设计篇我们已经知道 Smarty 是一种编译 型模板语言,而这个目录,就是它编译模板的目录,这里要注意,如果站点位于*nix 服务器 上,请确保 compile_dir 里定义的这个目录具有可写可读权限,默认情况下它的编译目录是 当前目录下的 templates_c,出于同样的理由我们将其明确的写出来。? ? 6。$smarty‐>left_delimiter 与$smarty‐>right_delimiter:? 指明在查找模板变量时的左右分割符。默认情况下为"{"与"}",但在实际中因为我们要在模 板中使用<script>,Script 中的函数定义难免会使用{},虽然它有自己的解决办法,但*惯上我 们将它重新定义为"<{"与"}>"或是"<!‐‐{"与"}‐‐>"或其它标志符, 注意, 如果在这里定义了左右 分割符后, 在模板文件中相应的要使每一个变量使用与定义相同的符号, 例如在这里指定为 "<{"与"}>",tpl 模板中也要相应的将{$name}变成<{$name}>,这样程序才可以正确的找到模板 变量。? ? ? 7。$tpl‐>cache_dir?=?"./cache";:? 告诉 Smarty 输出的模板文件缓存的位置。上一篇我们知道 Smarty 最大的优点在于它可以缓 存,这里就是设置缓存的目录。默认情况下为当前目录下的 cache 目录,与 templates_c 目 录相当,在*nix 系统中我们要确保它的可读可写性。? ? 8.?$smarty‐>cache_lifetime?=?60?*?60?*?24:?

? 这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当 Smarty 的 caching 变量设置为 true 时缓存将被重建。当它的取值为‐1 时表示建立起的缓存从不过期,为 0 时 表示在程序每次执行时缓存总是被重新建立。 上面的设置表示将 cache_lifetime 设置为一天。 ? ? 9.?$smarty‐>caching?=?1:? 这个属性告诉 Smarty 是否要进行缓存以及缓存的方式。 它可以取 3 个值, Smarty 默认值, 0: 表示不对模板进行缓存;1:表示 Smarty 将使用当前定义的 cache_lifetime 来决定是否结束 cache; 表示 Smarty 将使用在 cache 被建立时使用 cache_lifetime 这个值。 2: *惯上使用 true 与 false 来表示是否进行缓存。? ? 10.?$smarty‐>assign("name",?"李晓军"):? 该数的原型为 assign(string?varname,?mixed?var),varname 为模板中使用的模板变量,var 指出 要将模板变量替换的变量名;其第二种原形为 assign(mixed?var),我们要在后面的例子详细的 讲解这个成员函数的使用方法,assign 是 Smarty 的核心函数之一,所有对模板变量的替换 都要使用它。? ? 11.?$smarty‐>display("index.tpl"):? 该函数原形为 display(string?varname),作用为显示一个模板。 简单的讲, 它将分析处理过的模 板显示出来,这里的模板文件不用加路径,只要使用一个文件名就可以了,它路径我们已经 在$smarty‐>templates(string?path)中定义过了。? ? 程序执行完后我们可以打开当前目录下的 templates_c 与 cache 目录,就会发现在下边多出 一些%%的目录,这些目录就是 Smarty 的编译与缓存目录,它由程序自动生成,不要直接对 这些生成的文件进行修改。? 以上我简单的把 Smarty 程序中的一些常用的基本元素介绍了一下,在后边的例子中你可以 看到将它们将被多次的使用。? ? ? 接下来介绍一个 section 循环块与 foreach 循环块, 本来它应该属于模板部分, 但是由于它们 是 smarty 的精华所在,而且与 smarty 程序设计部分联系非常紧密,所以就在本节单独拿出 来讲一下。? ? 1.?foreach:用于循环简单数组,它是一个选择性的 section 循环,它的定义格式为:? ? ? CODE:[Copy?to?clipboard]{foreach?from=$array?item=array_id}? {foreachelse}? {/foreach}? 其中,from? 指出要循环的数组变量,item 为要循环的变量名称,循环次数由 from 所指定的 数组变量的个数所决定。{foreachelse}用来当程序中传递过来的数组为空时的处理,下面是 一个简单的例子:? ===========================================? example6.tpl?

===========================================? ? ? CODE:[Copy?to?clipboard]<html>? <head><title>这是一个 foreach 使用的例子</title></head>? <body>? 这里将输出一个数组:<br>? <{foreach?from=$newsArray?item=newsID}>? 新闻编号:<{$newsID.newsID}><br>? 新闻内容:<{$newsID.newsTitle}><br><hr>? <{foreachelse}>? 对不起,数据库中没有新闻输出!? <{/foreach}>? </body>? </html>? ==========================================? example6.php? ==========================================? ? ? CODE:[Copy?to?clipboard]<?php? /*********************************************? *? *? 文件名:? example6.php? *? 作? 用:? 显示实例程序 2? *? *? 作? 者:? 大师兄? *?Email:? teacherli@163.com? ? *? 修? 正:? forest? *********************************************/? include_once("./comm/Smarty.class.php");? ? ? $smarty?=?new?Smarty();? ? $smarty‐>templates("./templates");? ? $smarty‐>templates_c("./templates_c");? ? $smarty‐>cache("./cache");? $smarty‐>cache_lifetime?=?0;? $smarty‐>caching?=?true;? $smarty‐>left_delimiter?=?"<{";? ? $smarty‐>right_delimiter?=?"}>";? ? $array[]?=?array("newsID"=>1,?"newsTitle"=>"第 1 条新闻");? ? $array[]?=?array("newsID"=>2,?"newsTitle"=>"第 2 条新闻");? ?

$array[]?=?array("newsID"=>3,?"newsTitle"=>"第 3 条新闻");? ? $array[]?=?array("newsID"=>4,?"newsTitle"=>"第 4 条新闻");? ? $array[]?=?array("newsID"=>5,?"newsTitle"=>"第 5 条新闻");? ? $array[]?=?array("newsID"=>6,?"newsTitle"=>"第 6 条新闻");? ? ? $smarty‐>assign("newsArray",?$array);? ? //编译并显示位于./templates 下的 index.tpl 模板? $smarty‐>display("example6.tpl");? ? ?>? =================================================? example6.php? 输出文件? =================================================? <html>? <head><title>foreach 使用的例子</title></head>? <body>? 这里将输出一个数组:<br>? ? 新闻编号:1<br>? 新闻内容:第 1 条新闻<br><hr>? ? 新闻编号:2<br>? 新闻内容:第 2 条新闻<br><hr>? ? 新闻编号:3<br>? 新闻内容:第 3 条新闻<br><hr>? ? 新闻编号:4<br>? 新闻内容:第 4 条新闻<br><hr>? ? 新闻编号:5<br>? 新闻内容:第 5 条新闻<br><hr>? ? 新闻编号:6<br>? 新闻内容:第 6 条新闻<br><hr>? </body>? </html>? ? foreach 还可以用 foreachelse 来匹配,用 foreachelse 来表示当传递给 foreach 的数组为空值 时程序要执行的操作,具体的使用方法,请参考手册的说明。? ? 2.?section:? ? section 的产生是为解决 foreach 的不足的,与 foreach 一样,它用于设计模板内的循环块, 它较为复杂,可极大程序上满足程序需要,所以在程序中我*惯使用它而不使用 foreach,基

本原形为:? ? ? CODE:[Copy? to? clipboard]{section? name?=? name? loop?=? $varName[,? start? =? $start,? step? =?$step,? max?=?$max,?show?=?true]}? name:?section 的名称,不用加$? $loop:? 要循环的变量,在程序中要使用 assign 对这个变量进行操作。? $start:? 开始循环的下标,循环下标默认由 0 开始? $step:? 每次循环时下标的增数? $max:? 最大循环下标? $show:?boolean 类型,决定是否对这个块进行显示,默认为 true? ? 这里有个名词需要说明:? 循环下标:实际它的英文名称为 index,是索引的意思,这里我将它译成"下标",主要是为 了好理解。它表示在显示这个循环块时当前的循环索引,默认从 0 开始,受$start 的影响, 如果将$start 设为 5, 它也将从 5 开始计数, 在模板设计部分我们使用过它, 这是当前{section} 的一个属性,调用方式为 Smarty.section.sectionName.index,这里的 sectionName 指的是函数 原型中的 name 属性。? {section}块具有的属性值,分别为:? 1.?index:? 上边我们介绍的"循环下标",默认为 0? 2.?index_prev:? 当前下标的前一个值,默认为‐1? 3.?index_next:? 当前下标的下一个值,默认为 1? 4.?first:? 是否为第一下循环? 5.?last:? 是否为最后一个循环? 6.?iteration:? 循环次数? 7.?rownum:? 当前的行号,iteration 的另一个别名? 8.?loop:? 最后一个循环号,可用在 section 块后统计 section 的循环次数? 9.?total:? 循环次数,可用在 section 块后统计循环次数? 10.?show:? 在函数的声明中有它,用于判断 section 是否显示? ? 它们的具体属性大家可以参考手册, 在程序中可灵活使用它的这些属性, 模板部分我就使用 过 index 属性,大家可以回过头去看看。? ? 同样,{section}也可以配合使用{sectionelse},用来表示传入的数组变量为空时对模板进行的 处理。? ? 我们把上边的那个例子使用{section}来替代{foreach}来实现现样的功能,注意,在这个例子 中我只将 tpl 模板中的{foreach}用? ? {section}来实现,php 程序文件中没有任何改动,同时加了{sectionelse}处理块:? ? ===========================================? example7.tpl? ===========================================?

? ? CODE:[Copy?to?clipboard]<html>? <head><title>这是一个 foreach 使用的例子</title></head>? <body>? 这里将输出一个数组:<br>? <{section?name=loop?loop=$News}>? 新闻编号:<{$News[loop].newsID}><br>? 新闻标题:<{$News[loop].newsTitle}><br><hr>? <{sectionelse}>? 对不起,没有任何新闻输入!? <{/section}>? </body>? </html>? ? ==========================================? example7.php? ==========================================? ? ? CODE:[Copy?to?clipboard]<?php? /*********************************************? *? *? 文件名:? example7.php? *? 作? 用:? 显示实例程序 2? *? *? 作? 者:? 大师兄? *?Email:? teacherli@163.com? ? *? 修? 正:? forest? *********************************************/? include_once("./comm/Smarty.class.php");? ? ? $smarty?=?new?Smarty();?//建立 smarty 实例对象$smarty? $smarty‐>template_dir?=?"./templates";//设置模板目录? $smarty‐>compile_dir?=?"./templates_c";?//设置编译目录? ? $smarty‐>cache_dir?=?"./cache";?//设置缓存目录? $smarty‐>cache_lifetime?=?0;? $smarty‐>caching?=?true;? $smarty‐>left_delimiter?=?"<{";? ? $smarty‐>right_delimiter?=?"}>";? ? $array[]?=?array("newsID"=>1,?"newsTitle"=>"第 1 条新闻");? ? $array[]?=?array("newsID"=>2,?"newsTitle"=>"第 2 条新闻");? ?

$array[]?=?array("newsID"=>3,?"newsTitle"=>"第 3 条新闻");? ? $array[]?=?array("newsID"=>4,?"newsTitle"=>"第 4 条新闻");? ? $array[]?=?array("newsID"=>5,?"newsTitle"=>"第 5 条新闻");? ? $array[]?=?array("newsID"=>6,?"newsTitle"=>"第 6 条新闻");? ? ? $smarty‐>assign("News",?$array);? ? //编译并显示位于./templates 下的 index.tpl 模板? $smarty‐>display("example7.tpl");? ? ?>? =================================================? example7.php? 输出文件? =================================================? <html>? <head><title>foreach 使用的例子</title></head>? <body>? 这里将输出一个数组:<br>? ? 新闻编号:1<br>? 新闻内容:第 1 条新闻<br><hr>? ? 新闻编号:2<br>? 新闻内容:第 2 条新闻<br><hr>? ? 新闻编号:3<br>? 新闻内容:第 3 条新闻<br><hr>? ? 新闻编号:4<br>? 新闻内容:第 4 条新闻<br><hr>? ? 新闻编号:5<br>? 新闻内容:第 5 条新闻<br><hr>? ? 新闻编号:6<br>? 新闻内容:第 6 条新闻<br><hr>? </body>? </html>? ? 这里的{section}块的对于变量的命名方式感觉有些别扭,不过没关系,你只要记住模板变量 使用:? $loopName[name].var 这种模式就行了,loopName 为 loop 处赋予的变量名,[name]为 name 处赋予的字符串,.后为为你要在程序数组中设定要与值相对应的下标名称就行了。? ? ?

好了,smarty 学*指南‐‐‐程序设计篇就写到这里,对于一般的应用,这些知识已经够用了, 其它的一些高级技巧大家请参看手册中的例子, 下一节将讲讲 Smarty 在实际应用中的例子, 将分别以 php 内置的 mysql 语句,phplib 中的 DB 类,来分别讲一下各个类库在同一个例子 中的实现。? ? ?


相关推荐

最新更新

猜你喜欢