1. 一:smarty的程序设计部分: 
  2. 在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍,这一节主要来介绍一下如何在smarty中开始我们程序设计。下载Smarty文件放到你们站点中。 
  3. index.php PHP代码: 
  4. <?php 
  5. /** 
  6. * @version   $Id: index.php 
  7. * @package 
  8. * @author www.php100.com 
  9. * @action   显示实例程序 
  10. */ 
  11. include_once("./Smarty/Smarty.class.php"); //包含smarty类文件 
  12. $smarty = new Smarty(); //建立smarty实例对象$smarty 
  13. $smarty->templates("./templates"); //设置模板目录 
  14. $smarty->templates_c("./templates_c"); //设置编译目录 
  15. $smarty->cache("./cache"); //缓存目录 
  16. $smarty->cache_lifetime = 0; //缓存时间 
  17. $smarty->caching = true; //缓存方式 
  18. $smarty->left_delimiter = "{#"
  19. $smarty->right_delimiter = "#}"
  20. $smarty->assign("name", "zaocha"); //进行模板变量替换 
  21. $smarty->display("index.htm"); //编译并显示位于./templates下的index.htm模板 
  22. ?> 
  23. 二:解释smarty的程序 
  24. 我们可以看到,smarty的程序部分实际就是符合php语言规范的一组代码,我们依次来解释一下: 
  25. 1:/**/语句: 
  26. 包含的部分为程序篇头注释。主要的内容应该为对程序的作用,版权与作者及编写时间做一个简单的介绍,这在smarty中不是必需的,但从程序的风格来讲,这是一个好的风格。 
  27. 2:include_once语句: 
  28. 它将安装到网站的smarty文件包含到当前文件中,注意包含的路径一定要写正确。 
  29. 3:$smarty = new Smarty(): 
  30. 这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。 
  31. 4:$smarty->templates(""): 
  32. 这一句指明$smarty对象使用tpl模板时的路径,它是一个目录,在没有这一句时,Smarty默认的模板路径为当前目录的templates目录,实际在写程序时,我们要将这一句写明,这也是一种好的程序风格。 
  33. 5:$smarty->templates_c(""): 
  34. 这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言,而这个目录,就是它编译模板的目录,要注意,如果站点位于linux服务器上,请确保 
  35. teamplates_c里定义的这个目录具有可写可读权限,默认情况下它的编译目录是当前目录下的templates_c,出于同样的理由我们将其明确的写出来。 
  36. 6:$smarty->left_delimiter与$smarty->right_delimiter: 
  37. 指明在查找模板变量时的左右分割符。默认情况下为"{"与"}",但在实际中因为我们要在模板中使用<script>,Script中的函数定义难免会使用{},虽然它有自己的解决办法,但习惯上我们将它重新定义 
  38. 为"{#"与"#}"或是"<!--{"与"}-->"或其它标志符,注意,如果在这里定义了左右分割符后,在模板文件中相应的要使每一个变量使用与定义相同的符号,例如在这里指定为"<{"与"}>",htm模板中也要 
  39. 相应的将{$name}变成<{$name}>,这样程序才可以正确的找到模板变量。 
  40. 7:$smarty->cache("./cache"): 
  41. 告诉Smarty输出的模板文件缓存的位置。上一篇我们知道Smarty最大的优点在于它可以缓存,这里就是设置缓存的目录。默认情况下为当前目录下的cache目录,与templates_c目录相当,在linux系统中 
  42. 我们要确保它的可读可写性。 
  43. 8: $smarty->cache_lifetime = 60 * 60 * 24: 
  44. 这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当Smarty的caching变量设置为true时缓存将被重建。当它的取值为-1时表示建立起的缓存从不过期,为0时表示在程序每次执行时缓 
  45. 存总是被重新建立。上面的设置表示将cache_lifetime设置为一天。 
  46. 9: $smarty->caching = 1
  47. 这个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以取3个值,0:Smarty默认值,表示不对模板进行缓存;1:表示Smarty将使用当前定义的cache_lifetime来决定是否结束cache;2:表示 
  48. Smarty将使用在cache被建立时使用cache_lifetime这个值。习惯上使用true与false来表示是否进行缓存。 
  49. 10:$smarty->assign("name", "zaocha"): 
  50. 该数的原型为assign(string varname, mixed var),varname为模板中使用的模板变量,var指出要将模板变量替换的变量名;其第二种原形为assign(mixed var),我们要在后面的例子详细的讲解这个成员函数的使用方法,assign是Smarty的核心函数之一,所有对模板变量的替换都要使用它。 
  51. 11. $smarty->display("index.tpl"): 
  52. 该函数原形为display(string varname),作用为显示一个模板。简单的讲,它将分析处理过的模板显示出来,这里的模板文件不用加路径,只要使用一个文件名就可以了,它路径我们已经在$smarty->templates(string path)中定义过了。 
  53. 程序执行完后我们可以打开当前目录下的templates_c与cache目录,就会发现在下边多出一些%%的目录,这些目录就是Smarty的编译与缓存目录,它由程序自动生成,不要直接对这些生成的文件进行修改。 
  54. 以上我简单的把Smarty程序中的一些常用的基本元素介绍了一下,在后边的例子中你可以看到将它们将被多次的使用。 
  55.  
  56. 三:模板说明 
  57.  
  58. 接下来介绍一个section循环块与foreach循环块,本来它应该属于模板部分,但是由于它们是smarty的精华所在,而且与smarty程序设计部分联系非常紧密,所以就在本节单独拿出来讲一下。 
  59.  
  60. 1: foreach:用于循环简单数组,它是一个选择性的section循环,它的定义格式为: 
  61.  
  62.  
  63.  
  64. {foreach from=$array item=array_id}  
  65. {foreachelse}  
  66. {/foreach} 
  67.  
  68.  
  69. 其中,from 指出要循环的数组变量,item为要循环的变量名称,循环次数由from所指定的数组变量的个数所决定。{foreachelse}用来当程序中传递过来的数组为空时的处理,下面是一个简单的例子: 
  70.  
  71. 模板文件:example.htm 
  72.  
  73. foreach 输出一个“二维关联数组”的数据: 
  74.  
  75.  
  76.  
  77. {#foreach item=new from=$news#}  
  78.  
  79. 新闻编号:{#$new.id#}  
  80.  
  81. 新闻内容:{#$new.title#}  
  82.  
  83. {#foreachelse#} 
  84.  
  85.  
  86. 数据库中没有新闻输出! 
  87.  
  88.  
  89.  
  90. {#/foreach#}  
  91.  
  92. {foreach from=$newsArray item=newsID
  93.  
  94.  
  95.  
  96.  
  97. 新闻编号:{$newsID} 
  98.  
  99.  
  100.  
  101.  
  102. 新闻内容:{$newsTitle} 
  103.  
  104.  
  105.  
  106.  
  107. {foreachelse} 
  108.  
  109.  
  110. 对不起,数据库中没有新闻输出! 
  111.  
  112.  
  113.  
  114. {/foreach} 
  115.  
  116.  
  117. 这是一个错误的不显示数据,本文做了更正。 
  118.  
  119. 程序文件:example.php 
  120.  
  121.  
  122.  
  123. <?  
  124. /*********************************************  
  125. *  
  126. * 文件名: example.php  
  127. * 作 用: 显示实例程序2  
  128. *********************************************/  
  129.  
  130. include_once("./Smarty/Smarty.class.php");  
  131.  
  132. $smarty = new Smarty();  
  133.  
  134. $smarty->templates("./templates");  
  135.  
  136. $smarty->templates_c("./templates_c");  
  137.  
  138. $smarty->cache("./cache");  
  139.  
  140. $smarty->cache_lifetime = 0;  
  141.  
  142. $smarty->caching = true;  
  143.  
  144. $smarty->left_delimiter = "{#";  
  145.  
  146. $smarty->right_delimiter = "#}";  
  147.  
  148. $array[] = array("newsID"=>1, "newsTitle"=>"第1条新闻");  
  149.  
  150. $array[] = array("newsID"=>2, "newsTitle"=>"第2条新闻");  
  151.  
  152. $array[] = array("newsID"=>3, "newsTitle"=>"第3条新闻");  
  153.  
  154. $array[] = array("newsID"=>4, "newsTitle"=>"第4条新闻");  
  155.  
  156. $array[] = array("newsID"=>5, "newsTitle"=>"第5条新闻");  
  157.  
  158. $array[] = array("newsID"=>6, "newsTitle"=>"第6条新闻");  
  159.  
  160. //这是一个二维关联数组  
  161.  
  162. $smarty->assign("newsArray", $array);  
  163.  
  164. //编译并显示位于./templates下的index.htm模板  
  165.  
  166. $smarty->display("example.htm");  
  167.  
  168. ?> 
  169. 输入结果:example.php 
  170.  
  171. 这里将输出一个数组: 
  172.  
  173.  
  174.  
  175. 新闻编号:1  
  176.  
  177. 新闻内容:第1条新闻  
  178.  
  179. 新闻编号:2  
  180.  
  181. 新闻内容:第2条新闻  
  182.  
  183. 新闻编号:3  
  184.  
  185. 新闻内容:第3条新闻  
  186.  
  187. 新闻编号:4  
  188.  
  189. 新闻内容:第4条新闻  
  190.  
  191. 新闻编号:5  
  192.  
  193. 新闻内容:第5条新闻  
  194.  
  195. 新闻编号:6  
  196.  
  197. 新闻内容:第6条新闻 
  198.  
  199.  
  200. foreach还可以用foreachelse来匹配,用foreachelse来表示当传递给foreach的数组为空值时程序要执行的操作,具体的使用方法,请参考手册的说明。 
  201.  
  202. 2. section: 
  203.  
  204. section的产生是为解决foreach的不足的,与foreach一样,它用于设计模板内的循环块,它较为复杂,可极大程序上满足程序需要,所以在程序中我习惯使用它而不使用foreach,基本原形为: 
  205.  
  206.  
  207.  
  208. {section namename = name loop = $varName[, start = $start, step = $step, max = $max, show = true]} 
  209.  
  210.  
  211.  
  212.  
  213. name: section的名称,不用加$  
  214.  
  215. $loop: 要循环的变量,在程序中要使用assign对这个变量进行操作。  
  216.  
  217. $start: 开始循环的下标,循环下标默认由0开始  
  218.  
  219. $step: 每次循环时下标的增数  
  220.  
  221. $max: 最大循环下标  
  222.  
  223. $show: boolean类型,决定是否对这个块进行显示,默认为true 
  224.  
  225.  
  226. 这里有个名词需要说明: 
  227.  
  228. 循环下标:实际它的英文名称为index,是索引的意思,这里我将它译成"下标",主要是为了好理解。它表示在显示这个循环块时当前的循环索引,默认从0开始,受$start的影响,如果将$start设为5,它也将从5开始计数,在模板设计部分我们使用过它,这是当前{section}的一个属性,调用方式为Smarty.section.sectionName.index,这里的sectionName指的是函数原型中的name属性。 
  229.  
  230. {section}块具有的属性值,分别为: 
  231.  
  232. 1. index: 上边我们介绍的"循环下标",默认为0 
  233.  
  234. 2. index_prev: 当前下标的前一个值,默认为-1 
  235.  
  236. 3. index_next: 当前下标的下一个值,默认为1 
  237.  
  238. 4. first: 是否为第一下循环 
  239.  
  240. 5. last: 是否为最后一个循环 
  241.  
  242. 6. iteration: 循环次数 
  243.  
  244. 7. rownum: 当前的行号,iteration的另一个别名 
  245.  
  246. 8. loop: 最后一个循环号,可用在section块后统计section的循环次数 
  247.  
  248. 9. total: 循环次数,可用在section块后统计循环次数 
  249.  
  250. 10. show: 在函数的声明中有它,用于判断section是否显示 
  251.  
  252. 它们的具体属性大家可以参考手册,在程序中可灵活使用它的这些属性,模板部分我就使用过index属性,大家可以回过头去看看。 
  253.  
  254. 同样,{section}也可以配合使用{sectionelse},用来表示传入的数组变量为空时对模板进行的处理。 
  255.  
  256. 我们把上边的那个例子使用{section}来替代{foreach}来实现现样的功能,注意,在这个例子中我只将tpl模板中的{foreach}用{section}来实现,php程序文件中没有任何改动,同时加了{sectionelse}处理块: 
  257.  
  258. example.tpl 
  259.  
  260. 这里将输出一个数组: 
  261.  
  262. {section name=loop loop=$News}  
  263. 新闻编号:{$News[loop].newsID}  
  264. 新闻标题:{$News[loop].newsTitle}  
  265. {sectionelse}  
  266. 对不起,没有任何新闻输入!  
  267. {/section} 
  268. example.php 
  269.  
  270. <?  
  271. /*********************************************  
  272.  
  273. *  
  274.  
  275. * 文件名: example7.php  
  276.  
  277. * 作 用: 显示实例程序2  
  278.  
  279. *********************************************/  
  280.  
  281. include_once("./comm/Smarty.class.php");  
  282.  
  283. $smarty = new Smarty();  
  284.  
  285. $smarty->templates("./templates");  
  286.  
  287. $smarty->templates_c("./templates_c");  
  288.  
  289. $smarty->cache("./cache");  
  290.  
  291. $smarty->cache_lifetime = 0;  
  292.  
  293. $smarty->caching = true;  
  294.  
  295. $smarty->left_delimiter = "{";  
  296.  
  297. $smarty->right_delimiter = "}";  
  298.  
  299. $array[] = array("newsID"=>1, "newsTitle"=>"第1条新闻");  
  300.  
  301. $array[] = array("newsID"=>2, "newsTitle"=>"第2条新闻");  
  302.  
  303. $array[] = array("newsID"=>3, "newsTitle"=>"第3条新闻");  
  304.  
  305. $array[] = array("newsID"=>4, "newsTitle"=>"第4条新闻");  
  306.  
  307. $array[] = array("newsID"=>5, "newsTitle"=>"第5条新闻");  
  308.  
  309. $array[] = array("newsID"=>6, "newsTitle"=>"第6条新闻");  
  310.  
  311. $smarty->assign("newsArray", $array);  
  312.  
  313. //编译并显示位于./templates下的index.tpl模板  
  314.  
  315. $smarty->display("example.tpl");  
  316.  
  317. ?> 
  318. example.php 输出文件 
  319.  
  320. 这里将输出一个数组:  
  321.  
  322. 新闻编号:1  
  323.  
  324. 新闻内容:第1条新闻  
  325.  
  326. 新闻编号:2  
  327.  
  328. 新闻内容:第2条新闻  
  329.  
  330. 新闻编号:3  
  331.  
  332. 新闻内容:第3条新闻  
  333.  
  334. 新闻编号:4  
  335.  
  336. 新闻内容:第4条新闻  
  337.  
  338. 新闻编号:5  
  339.  
  340. 新闻内容:第5条新闻  
  341.  
  342. 新闻编号:6  
  343.  
  344. 新闻内容:第6条新闻 
  345. 这里的{section}块的对于变量的命名方式感觉有些别扭,不过没关系,你只要记住模板变量使用: 
  346.  
  347. $loopName[name].var这种模式就行了,loopName为loop处赋予的变量名,[name]为name处赋予的字符串,.后为为你要在程序数组中设定要与值相对应的下标名称就行了。 
  348.  
  349. 好了,smarty学习指南---程序设计篇就写到这里,对于一般的应用,这些知识已经够用了,其它的一些高级技巧大家请参看手册中的例子,下一节将讲讲Smarty在实际应用中的例子,将分别以php内置的mysql语句,phplib中的DB类,ADODB,Pear中DB类来分别讲一下各个类库在同一个例子中的实现。