三、不适合使用smarty的地方:
1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,这类型的程序使用smarty会使模板处理速度变慢。
2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用smarty会丧失php开发迅速的优点。
打开smarty的官方网站,
http://www.smarty.net/download.php。下载Smarty 3.0rc4,
目前仍然是处于rc版本(Release.Candidate.就是发行候选版本,与beta版本相比,不再有功能的增加,主要着重于除错!)。
有tar.gz和zip分别适用于linux和windows版本。
2.调试Smarty3
1,下载好后tar –zxvf Smarty 3.0rc4.tar.gz
目录中,demo文件夹为示例文件。Libs为程序文件。
/libs/Smarty.class.php #主文件
/libs/sysplugins/ #内部plugin
/libs /plugins/ #外部plugin,可自由扩充
/demo/cahce/ #放置缓存文件
/demo/configs / #放置可以载入的配置文件
/demo/templates/ #放置模板文件
/demo/templates_c/ #放置对模板编译后的文件
最好在需要进行smarty处理的文件的目录中创建与demo中的相同的文件夹(注意文件夹具有web用户写权限),
当然也可以更改文件夹名和路径,默认值为处于被smarty处理的文件的同级目录。Smarty3.1.4需要php5.0以上。
2、调试Smarty3.1.4
创建自己的文件,比如index.php。
在templates目录中创建模板index.tpl(几乎可以是任何文本文件的扩展名,常用的是tpl,php,html,不建议使用后两者,因为可以从浏览器直接访问而不安全。可以对apache的httpd.conf进行设置,禁止直接访问.tpl文件。或者将templats目录放在网站文档树之外。)
[Index.php]
require_once(“../../Smarty-3.0rc4/libs/Smarty.class.php”);
$smarty = new smarty();
$smarty->assign(‘name’,’韩灵稚’);
$smarty->display(‘templates/index.tpl ‘);
[Index.tpl]的代码:
你好, {$name}
Smarty编译时的处理过程是源php文件->模板文件(可能多次调用)->源php文件。。。
也就是说不影响原php文件的其他处理和输出。所以smarty模板文件可以是完整的html,也可以是其中一部分。
3、Smarty3.1.4基础
3.1 smarty处理过程
smarty将php源文件,首先编译成中间文件(也是php),如果启用缓存,再根据编译文件生成缓存文件(也是php),需要缓存的部分全部是硬编码。
之后的每次访问都会访问编译文件(如果编译文件已经存在),一次编译多次调用(可以是单文件的多次,也可以是多文件的多次),
如果启用缓存且有缓存文件而且没有过期,则直接访问缓存文件,跳过编译文件。编译文件一经生成,就不会被自动更新,除非模板文件或者配置文件更改。
源php文件修改是不会引发重新编译的。一旦编译文件重新生成,缓存文件也必然重新生成。
Smarty允许有两种特殊的编译设置存在:
1、 任何时候都不自动重新编译(上线阶段):只有没有该文件的编译文件时才生成,
模板文件或者配置文件的更改,不会引发重新编译。
$smarty->setCompile_check(false)
#默认为true,false表示任何时候都不在发生文件变更的情况下生成编译文件,除了无编译文件。
$smarty->getCompile_check() #获得当前编译检查的设置
2、任何时候都重新编译(调试阶段):任何时候都重新编译。
$smarty->setForce_compile(true) #默认为false,true表示每次都重新编译(启用缓存的话,每次都重新缓存)
$smarty->getForce_compile() #获得当前强制编译的设置
3.2 分界符
在模板文件中,区分普通html代码和smarty代码靠的是分界符。默认情况下是“{ }“,但是与js和css相冲突。
可以进行变更。在3.0中模板标签将不支持空格,如{ $abc }在Smarty2中可以识别的,
但是3.0里头就不行了,必须这样{$abc},这样是为了能够更好的支持javascript和css。
$smarty->left_delimiter = “<{“; #左分界符,2.0属性,3.0沿用
$smarty->right_delimiter = “}>”; #右分界符,2.0属性,3.0沿用
注意:将默认分界符修改后,在3.0模板中仍然不支持空格,比如<{ $abc }>,无效。
3.3 注释
{* smarty用*包含的文字为注释内容 *}
如果默认分界符修改为“<{}>“, <{* smarty用*包含的文字为注释内容 *}>。注释中的模板变量无效。
3.4 模板包含文件
格式 {include file=”要包含的文件名称 “}
Head.tpl
这是顶部内容,欢迎你,{$name}
Index.tpl中加一下代码
{include file=”head.tpl”}
输出结果:
这是顶部内容,欢迎你,韩灵稚。
您好,韩灵稚!
除了包含其他配置文件,还可以包含html、php(需要开启smarty支持php模板的选项,
最好使用include_php函数)。包含文件还可以使用传参。
Head.tpl
{$nr},欢迎你,{$name}
Index.tpl
{include file=”head.tpl” nr=”这是顶部内容”}
输出结果同上。
3.5 载入配置文件
可以预先规定一系列的变量与值的对应,并放在配置文件中,在使用时载入。
配置文件一般放在configs文件夹中,可以自定义。
My.conf
gv = “my.conf中的全局变量” #全局配置变量,任何时候调用,都将被载入
#如果$sections,未设置,显示全部变量
[color] #局部配置变量
fontcolor = “red” #如果$sections,设置为red,只显示全局变量和[color]中的变量
[size] #局部配置变量
fontsize = “12px” #如果$sections,设置为size,只显示全局变量和[size]中的变量
调用配置文件有两种方法,一种是在源文件处,一种是在模板文件处。
源文件处:$smarty->configLoad($config_file, $sections = null)
模板文件处:{config_load file=”载入的配置文件” section=”选取的局部变量(可选)”scope=“作用模板范围(可选)“}
如果使用源文件的方法,载入的配置文件变量的作用模板范围自动为global,
而且可以应用到多个模板中(smarty对象调用了多个模板)。
如果使用后者,灵活性更大。单个模板中config_load的scope参数的范围可以是local
(本模板,只能本模板使用这些变量), parent(父模板或者文件) 或
global(同一个smarty对象所调用的所有模板,其他模板不需要再载入该配置文件)
在模板文件中使用配置变量
{#配置变量#}或者{$smarty.config.变量名称}