菜鸟学PHP之Smarty入门Word文档格式.docx
《菜鸟学PHP之Smarty入门Word文档格式.docx》由会员分享,可在线阅读,更多相关《菜鸟学PHP之Smarty入门Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
一般的模版引擎(如PHPLib)都是在建立模版对象时取得要解析的模版,然后把变量套入后,透过parse()这个方法来解析模版,最后再将网页输出。
对Smarty的使用者来说,程序里也不需要做任何parse的动作了,这些Smarty自动会帮我们做。
而且已经编译过的网页,如果模版没有变动的话,Smarty就自动跳过编译的动作,直接执行编译过的网页,以节省编译的时间。
使用Smarty的一些概念
在一般模版引擎中,我们常看到区域的观念,所谓区块大概都会长成这样:
<
!
--START:
Blockname-->
区域内容
--END:
这些区块大部份都会在PHP程序中以if或for,while来控制它们的显示状态,虽然模版看起来简洁多了,但只要一换了显示方式不同的模版,PHP程序势必要再改一次!
在Smarty中,一切以变量为主,所有的呈现逻辑都让模版自行控制。
因为Smarty会有自己的模版语言,所以不管是区块是否要显示还是要重复,都是用Smarty的模版语法(if,foreach,section)搭配变量内容作呈现。
这样一来感觉上好象模版变得有点复杂,但好处是只要规划得当,PHP程序一行都不必改。
由上面的说明,我们可以知道使用Smarty要掌握一个原则:
将程序应用逻辑与网页呈现逻辑明确地分离。
就是说PHP程序里不要有太多的HTML码。
程序中只要决定好那些变量要塞到模版里,让模版自己决定该如何呈现这些变量(甚至不出现也行)。
Smarty的基础
安装Smarty
首先,我们先决定程序放置的位置。
Windows下可能会类似这样的位置:
「d:
\appserv\web\demo\」。
Linux下可能会类似这样的位置:
「/home/jaceju/public_html/」。
到Smarty的官方网站下载最新的Smarty套件:
。
解开Smarty2.6.0后,会看到很多档案,其中有个libs资料夹。
在libs中应该会有3个class.php檔+1个debug.tpl+1个plugin资料夹+1个core资料夹。
然后直接将libs复制到您的程序主资料夹下,再更名为class就可以了。
就这样?
没错!
这种安装法比较简单,适合一般没有自己主机的使用者。
至于Smarty官方手册中为什么要介绍一些比较复杂的安装方式呢?
基本上依照官方的方式安装,可以只在主机安装一次,然后提供给该主机下所有设计者开发不同程序时直接引用,而不会重复安装太多的Smarty复本。
而笔者所提供的方式则是适合要把程序带过来移过去的程序开发者使用,这样不用烦恼主机有没有安装Smarty。
程序的资料夹设定
以笔者在Windows安装Appserv为例,程序的主资料夹是「d:
\appserv\web\demo\」。
安装好Smarty后,我们在主资料夹下再建立这样的资料夹:
在Linux底下,请记得将templates_c的权限变更为777。
Windows下则将其只读取消。
第一个用Smarty写的小程序
我们先设定Smarty的路径,请将以下这个档案命名为main.php,并放置到主资料夹下:
main.php:
?
php
include"
class/Smarty.class.php"
;
define('
__SITE_ROOT'
'
d:
/appserv/web/demo'
);
//最后没有斜线
$tpl=newSmarty();
$tpl->
template_dir=__SITE_ROOT."
/templates/"
compile_dir=__SITE_ROOT."
/templates_c/"
config_dir=__SITE_ROOT."
/configs/"
cache_dir=__SITE_ROOT."
/cache/"
left_delimiter='
<
{'
right_delimiter='
}>
'
?
>
照上面方式设定的用意在于,程序如果要移植到其它地方,只要改__SITE_ROOT就可以啦。
(这里是参考XOOPS的)
Smarty的模版路径设定好后,程序会依照这个路径来抓所有模版的相对位置(范例中是'
/appserv/web/demo/templates/'
)。
然后我们用display()这个Smarty方法来显示我们的模版。
接下来我们在templates资料夹下放置一个test.htm:
(扩展名叫什么都无所谓,但便于视觉设计师开发,笔者都还是以.htm为主。
)
templates/test.htm:
html>
head>
metahttp-equiv="
Content-Type"
content="
text/html;
charset=big5"
title>
{$title}>
/title>
/head>
body>
{$content}>
/body>
/html>
现在我们要将上面的模版显示出来,并将网页标题($title)与内容($content)更换,请将以下档案内容命名为test.php,并放置在主资料夹下:
test.php:
require"
main.php"
assign("
title"
"
测试用的网页标题"
content"
测试用的网页内容"
//上面两行也可以用这行代替
//$tpl->
assign(array("
=>
"
));
display('
test.htm'
请打开浏览器,输入http:
//localhost/demo/test.php试试看(依您的环境决定网址),应该会看到以下的画面:
再到templates_c底下,我们会看到一个奇怪的资料夹(%%179),再点选下去也是一个奇怪的资料夹(%%1798044067),而其中有一个档案:
templates_c/%%179/%%1798044067/test.htm.php:
php/*Smartyversion2.6.0,createdon2003-12-1522:
19:
45compiledfromtest.htm*/?
phpecho$this->
_tpl_vars['
title'
];
?
content'
没错,这就是Smarty编译过的档案。
它将我们在模版中的变量转换成了PHP的语法来执行,下次再读取同样的内容时,Smarty就会直接抓取这个档案来执行了。
最后我们整理一下整个Smarty程序撰写步骤:
Step1.加载Smarty模版引擎。
Step2.建立Smarty对象。
Step3.设定Smarty对象的参数。
Step4.在程序中处理变量后,再用Smarty的assign方法将变量置入模版里。
Step5.利用Smarty的display方法将网页秀出。
如何安排你的程序架构
上面我们看到除了Smarty所需要的资料夹外(class、configs、templates、templates_c),还有两个资料夹:
includes、modules。
其实这是笔者模仿XOOPS的架构所建立出来的,因为XOOPS是笔者所接触到的程序中,少数使用Smarty模版引擎的架站程序。
所谓西瓜偎大边,笔者这样的程序架构虽没有XOOPS的百分之一强,但至少给人看时还有XOOPS撑腰。
includes这个资料夹主要是用来放置一些function、sql檔,这样在main.php就可以将它们引入了,如下:
//以main.php的位置为基准
require_once"
includes/functions.php"
includes/include.php"
modules这个资料夹则是用来放置程序模块的,如此一来便不会把程序丢得到处都是,整体架构一目了然。
上面我们也提到main.php,这是整个程序的主要核心,不论是常数定义、外部程序加载、共享变量建立等,都是在这里开始的。
所以之后的模块都只要将这个档案包含进来就可以啦。
因此在程序流程规划期间,就必须好好构思main.php中应该要放那些东西;
当然利用include或require指令,把每个环节清楚分离是再好不过了。
在上节提到的Smarty程序5步骤,main.php就会帮我们先将前3个步骤做好,后面的模块程序只要做后面两个步骤就可以了。
从变量开始
如何使用变量
从上一章范例中,我们可以清楚地看到我们利用<
{及}>
这两个标示符号将变量包起来。
预设的标示符号为{及},但为了中文冲码及Javascript的关系,因此笔者还是模仿XOOPS,将标示符号换掉。
变量的命名方式和PHP的变量命名方式是一模一样的,前面也有个$字号(这和一般的模版引擎不同)。
标示符号就有点像是PHP中的<
php及?
(事实上它们的确会被替换成这个),所以以下的模版变量写法都是可行的:
1.<
{$var}>
2.<
{$var}>
<
--和变量之间有空格-->
3.<
{$var
}>
--启始的标示符号和结束的标示符号不在同一行-->
在Smarty里,变量预设是全域的,也就是说你只要指定一次就好了。
指定两次以上的话,变量内容会以最后指定的为主。
就算我们在主模版中加载了外部的子模版,子模版中同样的变量一样也会被替代,这样我们就不用再针对子模版再做一次解析的动作。
而在PHP程序中,我们用Smarty的assign来将变量置放到模版中。
assign的用法官方手册中已经写得很多了,用法就如同上一节的范例所示。
不过在重复区块时,我们就必须将变量做一些手脚后,才能将变量assign到模版中,这在下一章再提。
修饰你的变量
上面我们提到Smarty变量呈现的风貌是由模版自行决定的,所以Smarty提供了许多修饰变量的函式。
使用的方法如下:
{变量|修饰函式}>
--当修饰函式没有参数时-->
{变量|修饰函式:
"
参数(非必要,视函式而定)"
--当修饰函式有参数时-->
范例如下:
{$var|nl2br}>
--将变量中的换行字符换成<
br/>
-->
{$var|string_format:
%02d"
--将变量格式化-->
好,那为什么要让模版自行决定变量呈现的风貌?
先看看底下的HTML,这是某个购物车结帐的部份画面。
inputname="
total"
type="
hidden"
value="
21000"
/>
总金额:
21,000元
一般模版引擎的模版可能会这样写:
{total}"
{format_total}元
它们的PHP程序中要这样写:
$total=21000;
$total);
format_total"
number_format($total));
而Smarty的模版就可以这样写:
(number_format修饰函式请到Smarty官方网页下载)
{$total}>
{$total|number_format:
元
Smarty的PHP程序中只要这样写:
所以在Smarty中我们只要指定一次变量,剩下的交给模版自行决定即可。
这样了解了吗?
这就是让模版自行决定变量呈现风貌的好处!
控制模版的内容
重复的区块
在Smarty样板中,我们要重复一个区块有两种方式:
foreach及section。
而在程序中我们则要assign一个数组,这个数组中可以包含数组数组。
就像下面这个例子:
首先我们来看PHP程序是如何写的:
test2.php:
$array1=array(1=>
苹果"
2=>
菠萝"
3=>
香蕉"
4=>
芭乐"
array1"
$array1);
$array2=array(
array("
index1"
data1-1"
index2"
data1-2"
index3"
data1-3"
),
data2-1"
data2-2"
data2-3"
data3-1"
data3-2"
data3-3"
data4-1"
data4-2"
data4-3"
data5-1"
data5-2"
data5-3"
array2"
$array2);
display("
test2.htm"
而模版的写法如下:
templates/test2.htm:
测试重复区块<
pre>
利用foreach来呈现array1
{foreachitem=item1from=$array1}>
{$item1}>
{/foreach}>
利用section来呈现array1
{sectionname=sec1loop=$array1}>
{$array1[sec1]}>
{/section}>
利用foreach来呈现array2
{foreachitem=index2from=$array2}>
{foreachkey=key2item=item2from=$index2}>
{$key2}>
:
{$item2}>
{sectionname=sec2loop=$array2}>
index1:
{$array2[sec2].index1}>
index2:
{$array2[sec2].index2}>
index3:
{$array2[sec2].index3}>
/pre>
执行上例后,我们发现不管是foreach或section两个执行结果是一样的。
那么两者到底有何不同呢?
第一个差别很明显,就是foreach要以巢状处理的方式来呈现我们所assign的两层数组变量,而section则以「主数组[循环名称].子数组索引」即可将整个数组呈现出来。
由此可知,Smarty在模版中的foreach和PHP中的foreach是一样的;
而section则是Smarty为了处理如上列的数组变量所发展出来的叙述。
当然section的功能还不只如此,除了下一节所谈到的巢状资料呈现外,官方手册中也提供了好几个section的应用范例。
不过要注意的是,丢给section的数组索引必须是从0开始的正整数,即0,1,2,3,...。
如果您的数组索引不是从0开始的正整数,那么就得改用foreach来呈现您的资料。
您可以参考官方讨论区中的此篇讨论,其中探讨了section和foreach的用法。
巢状资料的呈现
模版引擎里最令人伤脑筋的大概就是巢状资料的呈现吧,许多著名的模版引擎都会特意强调这点,不过这对Smarty来说却是小儿科。
最常见到的巢状资料,就算论譠程序中的讨论主题区吧。
假设要呈现的结果如下:
公告区
站务公告
文学专