前面的话 概述
Smarty是一个php模板引擎。更准确的说,它分离了逻辑程序和外在的内容,提供了一种易于管理的方法。Smarty总的设计理念就是分离业务逻辑和表现逻辑,优点概括如下: 速度——相对于其他的模板引擎技术而言,采用Smarty编写的程序可以获得最大速度的提高 编译型——采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将Web请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下),使用后续的调用速度更快 缓存技术——Smarty提供了一种可选择使用的缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页面。当用户开启Smarty缓存时,并在设定的时间内,将用户的Web请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件 插件技术——Smarty模板引擎是采用PHP的面向对象技术实现,不仅可以在原代码中修改,还可以自定义一些功能插件(按规则自定义的函数) 强大的表现逻辑——在Smarty模板中能够通过条件判断以及迭代地处理数据,它实际上就是种程序设计语言,但语法简单,设计人员在不需要预备的编程知识前提下就可以很快学会 模板继承——模板的继承是Smarty3的新事物。在模板继承里,将保持模板作为独立页面而不用加载其他页面,可以操纵内容块继承它们。这使得模板更直观、更有效和易管理 当然,也有不适合使用Smarty的地方。例如,需要实时更新的内容,需要经常重新编译模板,所以这类型的程序使用Smarty会使模板处理速度变慢。另外,在小项目中也不适合使用Smarty模板,小项目因为项目简单而前端与后端兼于一人的项目,使用Smarty会在一定程度上丧失PHP开发迅速的优点 配置 【安装】 安装Smarty很简单,到Smarty官方网站下载最新的稳定版本,然后解压压缩包,在解压后的目录可以看到一个名叫libs的Smarty类库目录,直接将libs文件夹复制到程序主文件夹下即可 [注意]Smarty要求web服务器运行php4.0以上版本 libs文件夹下共包含以下6个文件 Smarty.class.php(主文件) SmartyBC.class.php(兼容其他版本Smarty) sysplugins/* (系统函数插件) plugins/* (自定义函数插件) Autoloader.php debug.tpl 【实例化】 /* 并指定了Smarty.class.php所在位置,注意'S'是大写的*/ require './libs/Smarty.class.php'; /* 实例化Smarty类的对象$smarty */ $smarty = new Smarty(); 【init】 /** file: init.inc.php Smarty对象的实例化及初使化文件 */ 【demo】 <!-- main.tpl -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<{$content}>
</body>
</html>
<?php require './init.inc.php'; $smarty -> assign('content','this is content.....'); $smarty -> display('main.tpl'); ?> 基本语法
【注释】 模板注释被*星号包围,而两边的星号又被定界符包围。注释只存在于模板里面,而在输出的页面中不可见 <{* this is a comment *} > 【变量】 数学和嵌入标签 {$x+$y} // 输出x+y的和 {assign var=foo value=$x+$y} <!-- main.tpl --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <{***定义数组:10***}> <{assign var=foo value=[10,20,30]}> <{$foo[0]}><br> <{***短变量分配:0***}> <{$foo=0}> <{$foo}><br> <{***点语法:1***}> <{$test.a}><br> <{***PHP语法:1***}> <{$test['a']}><br> <{***数学运算:3***}> <{$test.a+$test.b}><br> </body> </html> <?php require './init.inc.php'; $smarty -> assign('test',['a'=>1,'b'=>2]); $smarty -> display('main.tpl'); ?> 【函数】 每一个smarty标签输出一个变量或者调用某种函数。在定界符内函数和其属性将被处理和输出 <{funcname attr1="val" attr2="val"}> {config_load file="colors.conf"} {include file="header.tpl"} {if $highlight_name} Welcome, <div style="color:{#fontColor#}">{$name}!</div> {else} Welcome, {$name}! {/if} {include file="footer.tpl"} 【属性】 {include file="header.tpl"} {include file="header.tpl" nocache} // 等于nocache=true {include file="header.tpl" attrib_name="attrib value"} {include file=$includeFile} {include file=#includeFile# title="My Title"} {assign var=foo value={counter}} {assign var=foo value=substr($bar,2,5)} {assign var=foo value=$bar|strlen} {assign var=foo value=$buh+$bar|strlen} {html_select_date display_days=true} {mailto address="smarty@example.com"} <select name="company_id"> {html_options options=$companies selected=$company_id} </select> 变量 index.php: $smarty = new Smarty; $smarty->assign('Contacts',array('fax' => '555-222-9876','email' => 'zaphod@slartibartfast.com')); $smarty->display('index.tpl'); index.tpl: <{$Contacts.fax}><br> <{$Contacts.email}><br> OUTPUT: 555-222-9876<br> zaphod@slartibartfast.com<br> 2、从配置文件读取的变量 foo.conf: pageTitle = "This is mine" tableBgColor = "#bbbbbb" rowBgColor = "#cccccc" <!-- main.tpl --> <{config_load file='foo.conf'}> <!DOCTYPE> <html> <title><{#pageTitle#}></title> <body> <table style="background:<{#tableBgColor#}>"> <tr style="background:<{#rowBgColor#}>"> <td>First</td> <td>Last</td> <td>Address</td> </tr> </table> </body> </html> <?php require './init.inc.php'; $smarty -> display('main.tpl'); ?> 3、配置文件里分区域的变量
foo.conf: [a] x=1 [b] x=2 [c] x=3 <!-- main.tpl --> <{config_load file='foo.conf' section="a"}> <{#x#}> output: 1 4、模板里定义的变量
5、保留变量
变量调节器变量调节器作用于变量、自定义函数或字符串。变量调节器的用法是:‘|’符号右接调节器名称。变量调节器可接收附加参数影响其行为。参数位于调节器右边,并用‘:’符号分开 [注意]对于同一个变量,可以使用多个修改器。它们将从左到右按照设定好的顺序被依次组合使用。使用时必须要用"|"字符作为它们之间的分隔符 capitalize[首字符大写] 将变量里的所有单词首字大写,与php的ucwords()函数类似。默认参数为false用于确定带数字的单词是否需要大写
lower[小写] 将变量字符串小写,作用等同于php的strtolower()函数
upper[大写] 将变量改为大写,等同于php的strtoupper()函数
cat[连接字符串]
count_characters[字符计数] 计算变量里的字符数。默认参数为false,用于确定是否计算空格字符
count_paragraphs[计算段数] 计算变量里的段落数量
count_sentences[计算句数] 计算变量里句子的数量
count_words[计算词数]
date_format[格式化日期]
default[默认值] 为变量设置一个默认值。当变量未设置或为空字符串时,将由给定的默认值替代其输出
escape[转义] escape作用于变量,用以html、url、单引号、十六进制、十六进制实体、javascript、邮件的转码或转义。第一个参数默认为'html',可选参数有'html,htmlall,url,quotes,hex,hexentity,javascript';第二个参数默认为'utf-8',可选参数有'ISO-8859-1,UTF-8'...
indent[缩进] 在每行缩进字符串,默认是4个字符。对于第一个可选参数,可以指定缩进字符数,对于第二个可选参数,可以指定使用什么字符缩进,例如'\t'作为tab
nl2br[换行符替换成<br />] 所有的换行符将被替换成 <br />,功能同PHP中的nl2br()函数一样
regex_replace[正则替换] 使用正则表达式在变量中搜索和替换,语法来自php的preg_replace()函数
replace[替换] 一种在变量中进行简单的搜索和替换字符串的处理。等同于php的str_replace()函数
spacify[插空] 插空是一种在变量的字符串的每个字符之间插入空格或者其他的字符(串)的方法
string_format[字符串格式化] 一种格式化字符串的方法,例如格式化为十进制数等等。实际运用的是php的sprintf()函数
strip[去除(多余空格)] 用一个空格或一个给定字符替换所有重复空格、换行和制表符 <{$articleTitle="Grandmother of\neight makes\t hole in one."}> <{$articleTitle}><br> <{$articleTitle|strip}><br> <{$articleTitle|strip:' '}><br> output: Grandmother of eight makes hole in one. Grandmother of eight makes hole in one. Grandmother of eight makes hole in one. strip_tags[去除html标签] 去除<和>标签,包括在<和>之间的全部内容
truncate[截取] 从字符串开始处截取某长度的字符,默认是80个,也可以指定第二个参数作为追加在截取字符串后面的文本串。该追加字串被计算在截取长度中。默认情况下,smarty会截取到一个词的末尾。如果想要精确的截取多少个字符,把第三个参数改为"true";第四个参数默认设置为FALSE,表示将截取至字符串末尾,设置为TRUE则截取到中间。注意如果设了TRUE,则忽略字符边界
wordwrap[行宽约束]
内置函数{$var=...} 变量赋值 这是{assign}函数的简写版,可以直接赋值给模版,也可以为数组元素赋值
{append} 追加 {append}用于在模板执行期间建立或追加模板变量数组
{assign} 赋值 {assign}用来在模板运行时为模板变量赋值 <{assign var="name" value="Bob"}>
<{assign "name" "Bob"}>
<{* 简写 *}>
The value of $name is <{$name}>.
output:
The value of $name is Bob.
{config_load} {config_load}用来从配置文件中加载config变量(#variables#)到模版 foo.conf:
[a]
x=1
[b]
x=2
[c]
x=3
<!-- main.tpl -->
<{config_load file='foo.conf' section="a"}>
<{#x#}>
output:
1
{for} 循环 {for}、{forelse}标签用来创建一个简单循环,支持以下不同的格式: {for $var=$start to $end}步长为1的简单循环; {for $var=$start to $end step $step}其它步长循环 当循环无迭代时执行{forelse} <ul>
<{for $foo=1 to 3}>
<li><{$foo}></li><{/for}>
</ul>
output:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<ul>
<{for $foo=2 to 10 max=3}>
<li><{$foo}></li><{/for}>
</ul>
output:
<ul>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
{while}循环 随着一些特性加入到模版引擎,Smarty的{while}循环与php的while语句一样富有弹性。每一个{while}必须与一个{/while}成对出现,所有php条件和函数在它身上同样适用,诸如||、or、&&、and、is_array()等等 下面是一串有效的限定符,它们的左右必须用空格分隔开,注意列出的清单中方括号是可选的,在适用情况下使用相应的等号(全等或不全等) {while $foo > 0}
{$foo--}
{/while}
{foreach},{foreachelse}遍历 {foreach}用来遍历数据数组,{foreach}与{section}循环相比更简单、语法更干净,也可以用来遍历关联数组 {foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}
{foreach}循环可以嵌套;数组变量通常是(另)一个数组的值,用来指导循环的次数,可以为专有循环传递一个整数;当数组变量无值时执行{foreachelse}; {foreach}的属性是@index、@iteration、@first、@last、@show、@total; 可以用循环项目中的当前键({$item@key})代替键值变量 <{$myColors['a'] = 'red'}>
<{$myColors['b'] = 'green'}>
<{$myColors['c'] = 'blue'}>
<ul>
<{foreach $myColors as $color}>
<li><{$color@key}>:<{$color}></li>
<{/foreach}>
</ul>
output:
<ul>
<li>a:red</li>
<li>b:green</li>
<li>c:blue</li>
</ul>
@index:包含当前数组的下标,开始时为0 @iteration:包含当前循环的迭代,总是以1开始,这点与index不同。每迭代一次值自动加1 @first:当{foreach}循环第一个时first为真 @last:当{foreach}迭代到最后时last为真 @show:检测{foreach}循环是否无数据显示,show是个布尔值(true or false) @total:包含{foreach}循环的总数(整数),可以用在{forach}里面或后面 {break}:停止/终止数组迭代 {continue}:中止当前迭代而开始下一个迭代/循环 <{$myColors['a'] = 'red'}>
<{$myColors['b'] = 'green'}>
<{$myColors['c'] = 'blue'}>
<{$myColors['d'] = 'pink'}>
<{$myColors['e'] = 'yellow'}>
<ul>
<{foreach $myColors as $color}>
<{if $color@first}>
<li><b><{$color@iteration}>:<{$color@index}>:<{$color@key}>:<{$color}></b></li>
<{elseif $color@last}>
<li><b><{$color@iteration}>:<{$color@index}>:<{$color@key}>:<{$color}></b></li>
<{else}>
<li><{$color@iteration}>:<{$color@index}>:<{$color@key}>:<{$color}></li>
<{/if}>
<{foreachelse}>
no result...
<{/foreach}>
</ul>
output:
<ul>
<li><b>1:0:a:red</b></li>
<li>2:1:b:green</li>
<li>3:2:c:blue</li>
<li>4:3:d:pink</li>
<li><b>5:4:e:yellow</b></li>
</ul>
{if}{elseif}{else} 条件 随着一些特性加入到模版引擎,Smarty的{if}语句与php的if语句一样富有弹性。每一个{if}必须与一个{/if}成对出现,允许使用{else}和{elseif},所有php条件和函数在这里同样适用,诸如||、or、&&、and、is_array()等等
{include}
{function}
插件Smarty中的插件总是按需加载。只有在模板脚本中调用特定的调节器、函数、资源插件等时才会自动加载。此外,每个插件只加载一次,即便在同一个请求中存在几个不同的Smarty实例同时运行 插件目录可以是一个包含路径的字符串或包含多个路径的数组。安装插件的时候,将插件简单地置于其中一个目录下,Smarty会自动识别使用 插件文件和函数必须遵循特定的命名约定以便Smarty识别 插件文件必须命名如下: type.name.php 其中type为下面这些插件类型中的一种: name为合法标识符,仅包含字母、数字和下划线 function.html_select_date.php, resource.db.php, modifier.spacify.php
插件内的函数应遵循如下命名约定 smarty_type_name () 如果调节器(modifier)命名为foo,那么按规则函数为smarty_modifier_foo()。如果指定的插件文件不存在或文件、函数命名不合规范,Smarty会输出对应的错误信息 Smarty既可自动从文件系统加载插件,也可在运行时通过register_* API函数注册插件。当然,也可以通过unregister_* API函数卸载已经载入的插件 对于只在运行时注册的插件函数不必遵守命名约定 如果某个插件依赖其它插件的某些功能(事实上,一些插件被绑定在Smarty中),那么可以通过如下方法加载需要的插件:
registerPlugin() void registerPlugin(string type, string name, mixed callback, bool cacheable, mixed cache_attrs);
registerPlugin()方法在脚本中注册函数或方法作为插件。其参数如下: “type”定义插件的类型,其值为下列之一:“function”、“block”、“compiler”和“modifier” “name”定义插件的函数名 “callback”为定义的php回调函数,其类型为下列之一: 1、包含函数名的字符串; 2、格式为(&$object, $method)的数组,其中,&$object为引用对象,$method为包含方法名的字符串; 3、格式为($class, $method)的数组,其中,$class为类名,$method为类中的方法。 “cacheable”和“cache_attrs”参数大多情况下可以省略 <?php
header("content-type:text/html;charset=utf-8");
require './init.inc.php';
function eightball($params, $smarty){
$answers = array('Yes', 'No','No way','Outlook not so good','Ask again soon','Maybe in your reality');
$result = array_rand($answers);
return $answers[$result];
}
$smarty -> registerPlugin('function', 'test', 'eightball');
$smarty -> display('main.tpl');
?>
<!-- main.tpl -->
Question: Will we ever have time travel?<br>
Answer: <{test}>. <br>
【调节器】 调节器是一些简短的函数,这些函数被应用于显示模板前作用于一个变量,或者其它情形中。调节器可以连接起来(执行) mixed smarty_modifier_name($value, $param1);
mixed $value;
[mixed $param1, ...];
调节器插件的第一个参数应该直接了当地声明处理什么类型(可以是字符串、数组、对象等等这些类型)。其它的参数是可选的,取决于执行的操作类型。调节器必须返回处理结果
【块函数】
模板继承继承带来了模板面向对象概念(oop),它允许定义一个或多个基模板供子模板继承。继承意味着子模板可覆盖所有或部份父模板中命名相同的块区域 模板继承是一种编译时进程,其将建立一个独立的编译模板文件。与对应的基于载入{include}子模板解决方案相比,当解释模板时,前者有更好的性能 {extends} 继承 {extends}标签用在模板继承中子模版对父模板的继承 {extends}标签用在模版中的第一行 如果子模板用{extends}标签继承父模板,那么它只能包含{block}标签(内容),其它任何模板内容都将忽略 使用此语法为模板资源继承$template_dir目录外的文件 {extends file='parent.tpl'}
{extends 'parent.tpl'} {* short-hand *}
<!-- parent.tpl-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
我是父模板中的文字
</body>
</html>
<!-- child.tpl-->
<{extends 'parent.tpl'}>
{block} 块
|
|