分类目录归档:模板引擎

Smarty模板引擎学习笔记

官网:
http://www.smarty.net/

引擎目录结构:
libs
/plugins 插件
/sysplugins 系统插件(内置函数)
/Autoloader.php 类自动加载
/Smarty.class.php 模板引擎(需要加载此文件)
/SmartyBC.class.php

使用:

require('/.../libs/Smarty.class.php');
$smarty = new Smarty;

配置:

public $auto_literal = true; //auto literal on delimiters with whitspace
public $error_unassigned = false; // 变量未分配时显示错误
public $use_include_path = false; // 包含文件时是否搜索include_path
private $template_dir = array('./templates/') //**************
public $joined_template_dir = './templates/';
public $joined_config_dir = './configs/';
public $default_template_handler_func = null;
public $default_config_handler_func = null;
public $default_plugin_handler_func = null;
private $compile_dir = './templates_c/'; //**************
private $plugins_dir = null; //**************
private $cache_dir = './cache/'; //**************
private $config_dir = array('./configs/'); //**************
public $force_compile = false; //强制编译(开发环境可以开启)
public $compile_check = true;
public $use_sub_dirs = false; //编译和缓存文件使用子目录组织
public $allow_ambiguous_resources = false;
public $merge_compiled_includes = false;
public $inheritance_merge_compiled_includes = true;
public $force_cache = false; //强制缓存
public $left_delimiter = "{"; //左分隔符
public $right_delimiter = "}"; //右分隔符
public $security_class = 'Smarty_Security';
public $security_policy = null;
public $php_handling = self::PHP_PASSTHRU; //PHP标签的处理方式
public $allow_php_templates = false; //是否允许PHP模板
public $direct_access_security = true;
public $debugging = false; //是否开启调试
public $debugging_ctrl = 'NONE';
public $smarty_debug_id = 'SMARTY_DEBUG';
public $debug_tpl = null;
public $error_reporting = null; //错误报告
public $get_used_tags = false;
public $config_overwrite = true;
public $config_booleanize = true;
public $config_read_hidden = false;
public $compile_locking = true;
public $cache_locking = false;
public $locking_timeout = 10;
public $default_resource_type = 'file';
public $caching_type = 'file';
public $properties = array();
public $default_config_type = 'file';
public $source_objects = array();
public $template_objects = array();
public $resource_caching = false;
public $template_resource_caching = true;
public $cache_modified_check = false;
public $registered_plugins = array();
public $plugin_search_order = array('function', 'block', 'compiler', 'class');
public $registered_objects = array();
public $registered_classes = array();
public $registered_filters = array();
public $registered_resources = array();
public $_resource_handlers = array();
public $registered_cache_resources = array();
public $_cacheresource_handlers = array();
public $autoload_filters = array();
public $default_modifiers = array();
public $escape_html = false; //对变量的输出自动escape_html
//来自父类(低版本中也直接定义)
public $caching = false; //是否开启缓存
public $cache_lifetime = 3600; //缓存时间

实际使用:
以上是配置可用项目,大部分保留默认即可,不过声明为private的变量,设置和获取是通过__set和__get进行的,这几个变量一般只需要设置如下四个($plugins_dir不用)

$smarty->template_dir = 'html/template/v1'.DIRECTORY_SEPARATOR; //模板文件目录
$smarty->compile_dir = 'smarty/templates_c'.DIRECTORY_SEPARATOR; //编译后文件目录
$smarty->config_dir = 'smarty/configs'.DIRECTORY_SEPARATOR; //配置文件目录(针对Smarty)
$smarty->cache_dir = 'smarty/cache'.DIRECTORY_SEPARATOR; //缓存文件目录

以下是可能使用的配置:

$force_compile = false; //***启用强制编译,在开发时可以设置为true
$use_sub_dirs = false; //编译和缓存文件使用子目录组织,一般默认即可,如果按照子目录来存放,就设置为true
$force_cache = false; //强制缓存
$left_delimiter = "{"; //左分隔符
$right_delimiter = "}"; //右分隔符
$debugging = false; //***是否开启调试,在开发时可以设置为true
$caching = false; //是否开启缓存
$cache_lifetime = 3600; //缓存时间,如果开启了缓存,这里调整缓存的时间

快速入门:
1 {config_load file=”test.conf” section=”setup”},加载$config_dir目录中的的test.conf文件中的setup节:

title = Welcome to Smarty!
cutoff_size = 40

[setup]
bold = true

注意这个有分节的概念,是继承关系,这些配置中的变量,在模板中需要通过##圈起来访问,比如#title#

2 {include file=”header.tpl” title=foo},包含$template_dir模板目录中的header.tpl,可以在后面赋值变量,比如例子中的title,就是模板中用到的$title变量,赋值为foo。

3 {* bold and title are read from the config file *} 注释语法

4 管道符
比如{#title#|capitalize},#title#输入到capitalize
比如{$smarty.now|date_format:”%Y-%m-%d %H:%M:%S”},时间应用格式

5 {$SCRIPT_NAME} 与 {$smarty.server.SCRIPT_NAME}一样,$smarty.server映射了$_SERVER

6 {ldelim}$Name{rdelim},表示$left_delimiter和$right_delimiter,其中的内容当做纯文本

7 {section}

{section name=sec1 loop=$contacts}
phone: {$contacts[sec1].phone}
fax: {$contacts[sec1].fax}
cell: {$contacts[sec1].cell}
{/section}

类似foreach数组$contacts,下标为sec1。

{section name=outer loop=$FirstName}
{if $smarty.section.outer.index is odd by 2}
{$smarty.section.outer.rownum} . {$FirstName[outer]} {$LastName[outer]}
{else}
{$smarty.section.outer.rownum} * {$FirstName[outer]} {$LastName[outer]}
{/if}
{sectionelse}
none
{/section}

这个形式有点奇葩,outer是$FirstName的下标对象(记录了index rownum这些信息),$smarty.section.outer.index获取到outer的循环编号,{$smarty.section.outer.rownum}获取outer的号,区别是一个从0开始,一个从1开始。{sectionelse}可以来分之。

8 {strip}{/strip}去除标签空格

9 html生成器
{html_select_date start_year=1998 end_year=2010} 年月日选择器
{html_select_time use_24_hours=false} 时间选择器
{html_options values=$option_values selected=$option_selected output=$option_output} 下来选择,values对应值,output对应显示的名称

基本语法——————————————————————
[注释]

{* Comments *}

{* this multiline smarty
comment is
not sent to browser
*}

{*********************************************************
Multi line comment block with credits block
@ author: bg@example.com
@ maintainer: support@example.com
@ para: var that sets block style
@ css: the style output
**********************************************************}

[变量]
配置文件变量是一个不用美元符号$,而是用#号包围着变量(#hashmarks#),或者是一个$smarty.config形式的变量。

数学和嵌入标签:

{$smarty.server.SERVER_NAME} //$_SERVER['SERVER_NAME']
{$x+$y}
{assign var=foo value=$x+$y} // 属性中的变量,分配变量时不要使用$符号
{$foo[$x+3]} // 变量作为数组索引
{$foo={counter}+3} // 标签里面嵌套标签,使用变量是如果用标签嵌套,也不需要使用$符号
{$foo="this is message {counter}"} // 引号里面使用标签

定义数组:

{assign var=foo value=[1,2,3]}
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
{assign var=foo value=[1,[9,8],3]} // 可以嵌套

Smarty “dot” 语法 (注意: 嵌入的{}用来解决指代不明的情况):

{$foo.a.b.c} => $foo['a']['b']['c']
{$foo.a.$b.c} => $foo['a'][$b]['c'] // with variable index
{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // 表达式作为索引
{$foo.a.{$b.c}} => $foo['a'][$b['c']] // 嵌套索引

PHP式语法, “dot”语法外的另一种选择:

{$foo[1]} // normal access
{$foo['bar']}
{$foo['bar'][1]}
{$foo[$x+$x]} // index may contain any expression
{$foo[$bar[1]]} // nested index
{$foo[section_name]} // smarty {section} access, not array access! 访问Smarty节块变量,而非访问数组

可变变量:

$foo // normal variable
$foo_{$bar} // variable name containing other variable
$foo_{$x+$y} // variable name containing expressions
$foo_{$bar}_buh_{$blar} // variable name with multiple segments 用在多段变量名中
{$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1 注意是输出变量,而非值

对象链:

{$object->method1($x)->method2($y)}

直接php函数:

{time()} //译注:如果直接使用模版变量符号引用php函数,该函数应有返回值。

[函数]
{funcname attr1=”val” attr2=”val”}
内置函数将在smarty内部工作,例如{if}、{section}和{strip},不能修改他们。

[属性]
大多数函数都带有自己的属性以便于明确说明或者修改他们的行为,smarty函数的属性很像HTML中的属性。静态数值不需要加引号,但是字符串建议使用引号。可以使用普通smarty变量,也可以使用带调节器的变量作为属性值,它们也不用加引号。你甚至可以使用php函数返回值和复杂表达式作为属性值。
一些属性用到了布尔值(true或false),它们表明为真或为假。如果没有为这些属性赋布尔值,那么默认使用true为其值。

[双引号里嵌入变量]
如果字符串中包含变量,需要使用双引号,当变量包含点时需要使用反引号圈起来,当包含管道符时,需要使用定界符号圈起来。

{func var="test `$foo.bar` test"|escape} // modifiers outside quotes! 调节器在引号外
{func var="test {$foo|escape} test"} // modifiers inside quotes! 调节器在引号内
{func var="test {time()} test"} // PHP function result ******
{func var="test {counter} test"} // plugin result
{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty block function *****

[数学运算]
[忽略Smarty解析]
在Smarty模版,如果‘{’和‘}’大括号里包含有空格那么整个{}内容会被忽略,你可以设置Smarty类变量$auto_literal=false来取消这种规则。
{literal}…{/literal}块被用来忽略模版语法的解析,你也可以用{ldelim}、{rdelim}标签或{$smarty.ldelim}、{$smarty.rdelim}变量来忽略个别大括号(译注:后面两种方法主要用来在模版中输出左右大括号)。

变量——————————————————————————
[关联数组]
访问关联数组变量

$smarty = new Smarty;
$smarty->assign('Contacts',
array('fax' => '555-222-9876',
'email' => 'zaphod@slartibartfast.com',
'phone' => array('home' => '555-444-3333',
'cell' => '555-111-1234')));
$smarty->display('index.tpl');

index.tpl:

{$Contacts.fax}

{$Contacts.email}

{* you can print arrays of arrays as well *} {* 同样可以用于多维数组 *}
{$Contacts.phone.home}

{$Contacts.phone.cell}

[数组索引]
通过索引访问数组

<!--?php $smarty--->assign('Contacts', array(
'555-222-9876',
'zaphod@slartibartfast.example.com',
array(
'555-444-3333',
'555-111-1234'
)
));
$smarty-&gt;display('index.tpl');
?&gt;

index.tpl source:
{$Contacts[0]}

{$Contacts[1]}

{* you can print arrays of arrays as well *}
{$Contacts[2][0]}

{$Contacts[2][1]}

[对象]

name: {$person-&gt;name}

email: {$person-&gt;email}

OUTPUT:

name: Zaphod Beeblebrox

email: zaphod@slartibartfast.com

[变量范围]
http://www.php100.com/manual/smarty3/language.variables.scopes.html

[从配置文件读取的变量]
加载配置文件后,配置文件中的变量需要用两个井号”#”包围或者是smarty的保留变量$smarty.config.来调用(下节将讲到),第二种语法在变量作为属性值嵌入至引号的时候非常有用,详细可参考双引号里值的嵌入。

(举例 {include file=”#includefile#”} 这样#includefile#将被当作字符处理,而不表示配置文件变量,但可以这样表示 {include file=”`$smarty.config.includefile`”}不要忘了加“,当然也可用{$smarty.config.includefile}表示)。

[{$smarty}保留变量]
1 Request variables

{$smarty.get.page}
{$smarty.post.page}
{$smarty.cookies.username}
{$smarty.server.SERVER_NAME}
{$smarty.env.PATH}
{$smarty.session.id}
{$smarty.request.username}

2 {$smarty.now}

{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}

3 {$smarty.const} 直接访问常量

<!--?php // the constant defined in php define('MY_CONST_VAL','CHERRIES'); ?-->
Output the constant in a template with
{$smarty.const.MY_CONST_VAL}

4 {$smarty.capture}
可以通过{$smarty.capture}变量捕获内置的{capture}…{/capture}模版输出。

5 {$smarty.config}
{$smarty.config}可以取得配置变量。{$smarty.config.foo}是{#foo#}的同义词。

6 {$smarty.section}
{$smarty.section}用来指向{section}循环的属性,里面包含一些有用的值,比如.first/.index等。

7 {$smarty.template}
返回经过处理的当前模板名(不包括目录)。

8 {$smarty.current_dir}
返回经过处理的当前模板目录名。

9 {$smarty.version}

10 {$smarty.block.child}

11 {$smarty.block.parent}

12 {$smarty.ldelim}, {$smarty.rdelim}
这两者变量用来打印left-delimiter和right-delimiter的字面值,等同于{ldelim}、{rdelim}。

变量调节器-—————————————————————————-
变量调节器作用于变量、自定义函数或字符串。 变量调节器的用法是:‘|’符号右接调节器名称。 变量调节器可接收附加参数影响其行为。 参数位于调节器右边,并用‘:’符号分开。

[首字符大写]

<!--?php $smarty--->assign('articleTitle', 'next x-men film, x3, delayed.');
?&gt;

Where the template is:
{$articleTitle}
{$articleTitle|capitalize}
{$articleTitle|capitalize:true}

Will output:
next x-men film, x3, delayed.
Next X-Men Film, x3, Delayed.
Next X-Men Film, X3, Delayed.

[连接字符串]

<!--?php $smarty--->assign('articleTitle', "Psychics predict world didn't end");
?&gt;

index.tpl:

{$articleTitle|cat:" yesterday."}

OUTPUT:

Psychics predict world didn't end yesterday.

[字符计数]

<!--?php $smarty--->assign('articleTitle', 'Cold Wave Linked to Temperatures.');
?&gt;

Where template is:
{$articleTitle}
{$articleTitle|count_characters}
{$articleTitle|count_characters:true}

Will output:

Cold Wave Linked to Temperatures.
29
33

[计算段数]
[计算句数]
[计算词数]

<!--?php $smarty--->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.');
?&gt;

Where template is:
{$articleTitle}
{$articleTitle|count_words}

This will output:
Dealers Will Hear Car Talk at Noon.
7

[格式化日期]
http://www.php100.com/manual/smarty3/language.modifier.date.format.html

[默认值]
Where template is:
{$articleTitle|default:’no title’}
{$myTitle|default:’no title’}
{$email|default:’No email address available’}

[转义]
escape作用于变量,用以html、url、单引号、十六进制、十六进制实体、javascript、邮件的转码或转义。默认为html转义。
http://www.php100.com/manual/smarty3/language.modifier.escape.html

[缩进]

[小写 ]

Where template is:
{$articleTitle}
{$articleTitle|lower}

[换行符替换成]

Where the template is:
{$articleTitle|nl2br}

[ 正则替换]
使用正则表达式在变量中搜索和替换,语法来自Php的preg_replace()函数。

Where template is:
{* replace each carriage return回车, tab and new line with a space *}
{$articleTitle}
{$articleTitle|regex_replace:"/[\r\t\n]/":" "}

[替换]
一种在变量中进行简单的搜索和替换字符串的处理。等同于php的str_replace()函数。

{$articleTitle}
{$articleTitle|replace:'Garden':'Vineyard'}
{$articleTitle|replace:' ':' '}

[插空 ]
[字符串格式化]

{$number}
{$number|string_format:"%.2f"}
{$number|string_format:"%d"}

[去除(多余空格)]
用一个空格或一个给定字符替换所有重复空格、换行和制表符。(注意:如果想要去除模板文本中的区块,请使用{strip}函数。)

{$articleTitle}
{$articleTitle|strip}
{$articleTitle|strip:' '}

[去除html标签]

{$articleTitle}
{$articleTitle|strip_tags} {* same as {$articleTitle|strip_tags:true} *}
{$articleTitle|strip_tags:false}

[截取]

{$articleTitle}
{$articleTitle|truncate}
{$articleTitle|truncate:30}
{$articleTitle|truncate:30:""}
{$articleTitle|truncate:30:"---"}
{$articleTitle|truncate:30:"":true}
{$articleTitle|truncate:30:"...":true}
{$articleTitle|truncate:30:'..':true:true}

This will output:

Two Sisters Reunite after Eighteen Years at Checkout Counter.
Two Sisters Reunite after Eighteen Years at Checkout Counter.
Two Sisters Reunite after...
Two Sisters Reunite after
Two Sisters Reunite after---
Two Sisters Reunite after Eigh
Two Sisters Reunite after E...
Two Sisters Re..ckout Counter.

[大写]

{$articleTitle}
{$articleTitle|upper}

[行宽约束]
http://www.php100.com/manual/smarty3/language.modifier.wordwrap.html

内置函数-
——————————————————————————
1 {$var=…} 变量赋值
这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值。
2 {append} 追加
{append}用于在模板执行期间建立或追加模板变量数组。
3 {assign} 赋值
{assign}用来在模板运行时为模板变量赋值。
4 {block} 块
5 {call} 调用
6 {capture}捕获
{capture}用来捕获模板输出的数据并将其存储到一个变量里,而不是将它们输出到页面。任何在{capture name=”foo”}和{/capture}之间的数据将被存储到变量$foo中,该变量由name属性指定。
在模板中,可以通过$smarty.capture.foo访问{capture}内容,‘foo’是传递给name属性的值。如果没有提供name属性,函数默认将使用 “default” 作为参数,例如$smarty.capture.default。
{capture}可以嵌套。
7 {config_load}
8 {debug} 调试
9 {extends} 继承
10 {for} 循环
{for}、{forelse}标签用来创建一个简单循环,支持以下不同的格式:
{for $var=$start to $end}步长为1的简单循环;
{for $var=$start to $end step $step}其它步长循环。
当循环无迭代时执行{forelse}。

{for $foo=1 to 3}
<ul>
	<li>{$foo}</li>
</ul>
{/for}

11 {foreach},{foreachelse}遍历
foreach语法不能接受任何属性名,这是Smarty3新增的语法,但Smarty2.x中的{foreach from=$myarray key=”mykey” item=”myitem”}语法仍受支持。

{foreach}用来遍历数据数组,{foreach}与{section}循环相比更简单、语法更干净,也可以用来遍历关联数组。
{foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}

//
{foreach $myColors as $color}
<ul>
	<li>{$color}</li>
</ul>
{/foreach}

// Smarty 3 新语法$value@key
<ul>
<ul>{foreach $myPeople as $value}
	<li>{$value@key}: {$value}</li>
</ul>
</ul>
{/foreach}

@index
包含当前数组的下标,开始时为0。

{foreach $items as $i} {if $i@index eq 3} //$i@index就是一个整体,比如整数1,2 {* put empty table row *}{/if}{/foreach}

nbsp;
{$i.label}

@iteration
iteration包含当前循环的迭代,总是以1开始,这点与index不同。每迭代一次值自动加1。

@first

@last

@show 这个奇葩
show属性用在检测{foreach}循环是否无数据显示,show是个布尔值(true or false)。

@total
total包含{foreach}循环的总数(整数),可以用在{forach}里面或后面。

12 {function} 函数
13 {if}{elseif}{else} 条件
14 {include} 包含
15 {include_php}
16 {insert}插入
假设你在页面上端使用一个带有广告条位置的模板,广告条可以包含任何HTML、图象、FLASH等混合信息。因此这里不能使用一个静态链接,同时我们也不希望该广告条被缓存。这就需要在{insert}标签指
17 {ldelim},{rdelim}
18 {literal}
19 {nocache}禁止缓存
20 {php}
21 {section},{sectionelse}遍历数组
http://www.php100.com/manual/smarty3/language.function.section.html
22 {while}循环

自定义函数———————————————————–