PHP Smarty模版基础知识

      Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。
 
一、Smarty的优点
1.速度

采用Smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。比PHP内嵌到HTML中的做法要有效率的多。

2.编译型

采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译。无模板解析的开销,只编译一次。仅当模板文件被修改后才会重新编译。

3.缓存技术

Smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。

4.插件技术

Smarty可以自定义插件。你可以很容易创建自己的函数和变量修饰器,非常具有可扩展性。可配置的模板定界符语法{delimiter}, 你可以使用{$foo}, {{$foo}}, <!--{$foo}-->等等。模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。支持无限的 sections, if等的嵌套。

二、基本语法

2.1 注释
模板中的注释是星号开头,然后外面包含着 定界符,Smarty的注释在不会在最终的页面输出里显示,就像这样:

{* 我是一个Smarty的注释, 显示输出时我不会存在  *}
<html>
<head>
<title>{$title}</title>
</head>
<body>

{* 另一个单行的注释例子  *}
<!-- HTML 注释会发送到浏览器 -->

{* 
   Smarty的多行
   注释
   不会发送到浏览器
*}

{*********************************************************
多行注释的说明栏
  @ author:         bg@example.com
  @ maintainer:     support@example.com
  @ para:           var that sets block style
  @ css:            the style output
**********************************************************}

{* 头部文件包括LOGO和其他东西  *}
{include file='header.tpl'}


{* 开发说明:  $includeFile是通过foo.php赋值的  *}
<!-- 显示 main content 块 -->
{include file=$includeFile}

{* 这里的 <select> 块是多余的 *}
{*
<select name="company">
  {html_options options=$vals selected=$selected_id}
</select>
*}

<!-- 变量被注释了 -->
{* $affiliate|upper *}

{* 注释不能嵌套 *}
{*
<select name="company">
  {* <option value="0">-- none -- </option> *}
  {html_options options=$vals selected=$selected_id}
</select>
*}

</body>
</html>

2.2 变量

2.2.1 PHP页面变量
模板变量以美元符号$开头,由字母、数组和下划线组成,和 PHP variable相似。 变量可以引用数字索引或非数字索引的数组,对象的属性和方法等。

{$foo}        <-- 显示简单的变量 (非数组/对象)
{$foo[4]}     <-- 在0开始索引的数组中显示第五个元素
{$foo.bar}    <-- 显示"bar"下标指向的数组值,等同于PHP的$foo['bar']
{$foo.$bar}   <-- 显示以变量$bar值作为下标指向的数组值,等同于PHP的$foo[$bar]
{$foo->bar}   <-- 显示对象属性 "bar"
{$foo->bar()} <-- 显示对象成员方法"bar"的返回
{#foo#}       <-- 显示变量配置文件内的变量"foo"
{$smarty.config.foo} <-- 等同于{#foo#}
{$foo[bar]}   <-- 仅在循环的语法内可用,见{section}
{assign var=foo value='baa'}{$foo} <--  显示"baa", 见{assign}

更多合成变量的方式:

{$foo.bar.baz}
{$foo.$bar.$baz}
{$foo[4].baz}
{$foo[4].$baz}
{$foo.bar.baz[4]}
{$foo->bar($baz,2,$bar)} <-- 传递参数
{"foo"}       <-- 静态值

{* 显示服务器的环境变量"SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
{$smarty.server.SERVER_NAME}

数学运算和嵌入标签:

{$x+$y}                             // 显示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]}   // 可嵌套

缩写方式:

{$foo=$bar+2}
{$foo = strlen($bar)}               // 函数赋值
{$foo = myfunct( ($x+$y)*3 )}       // 函数参数
{$foo.bar=1}                        // 赋值给特定的数组元素
{$foo.bar.baz=1}                    
{$foo[]=1}                          // 附加到数组

Smarty 点号语法:

{$foo.a.b.c}        =>  $foo['a']['b']['c'] 
{$foo.a.$b.c}       =>  $foo['a'][$b]['c']         // 变量下标
{$foo.a.{$b+4}.c}   =>  $foo['a'][$b+4]['c']       // 表达式下标
{$foo.a.{$b.c}}     =>  $foo['a'][$b['c']]         // 嵌套下标

类似PHP的语法,另一种点号的语法:

{$foo[1]}             // 一般的
{$foo['bar']}
{$foo['bar'][1]}
{$foo[$x+$x]}         // 下标可以是各种表达式
{$foo[$bar[1]]}       // 嵌套下标
{$foo[section_name]}  // smarty {section} 存取, 非数组存取!

变量构造变量:

$foo                     // 一般的变量
$foo_{$bar}              // 变量名包含了其他变量
$foo_{$x+$y}             // 变量名包含了表达式
$foo_{$bar}_buh_{$blar}  // 更复杂的
{$foo_{$x}}              // 如$x = 1,那么将显示$foo_1的值

对象链:

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

PHP函数直接使用:

{time()}

2.2.2 双引号中嵌入变量

Smarty可以识别出在双引号中嵌套的 变量值,这些变量名称必须只包括 字母、数字和下划线。 参见命名规则。
另外,带有其他字符的,如点号(.)或者 $object->reference形式的变量, 必须用`单引号`括起来。
Smarty3中允许在双引号中嵌入Smarty的标签并运行。 如果你需要在双引号的变量上使用修饰器、插件或者PHP函数等,这是非常有用的。

{func var="test $foo test"}              // 识别变量 $foo
{func var="test $foo_bar test"}          // 识别变量 $foo_bar
{func var="test `$foo[0]` test"}         // 识别变量 $foo[0]
{func var="test `$foo[bar]` test"}       // 识别变量 $foo[bar]
{func var="test $foo.bar test"}          // 识别变量 $foo (不是 $foo.bar)
{func var="test `$foo.bar` test"}        // 识别变量 $foo.bar
{func var="test `$foo.bar` test"|escape} // 引号外的修饰器!
{func var="test {$foo|escape} test"}     // 引号内的修饰器!
{func var="test {time()} test"}          // PHP函数结果
{func var="test {counter} test"}         // 插件的结果
{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty区块函数

{* 将使用$tpl_name的值 *}
{include file="subdir/$tpl_name.tpl"}

{* 不使用$tpl_name的值 *}
{include file='subdir/$tpl_name.tpl'} // 必须用双引号才能用变量值!

{* 当变量包含了点号“.”,必须用单引号括起来 *}
{cycle values="one,two,`$smarty.config.myval`"}

{* 当变量包含了点号“.”,必须用单引号括起来 *}
{include file="`$module.contact`.tpl"}

{* 点号后面跟着变量 *}
{include file="`$module.$view`.tpl"}

2.2.3 {$smarty} 保留变量

可以通过PHP的保留变量 {$smarty}来访问一些环境变量。 下面是这些变量的列表:

页面请求变量
页面请求变量 如$_GET, $_POST, $_COOKIE, $_SERVER, $_ENV 和 $_SESSION 可以通过下面的方式来使用:

{* display value of page from URL ($_GET) http://www.example.com/index.php?page=foo *}
{$smarty.get.page}

{* display the variable "page" from a form ($_POST['page']) *}
{$smarty.post.page}

{* display the value of the cookie "username" ($_COOKIE['username']) *}
{$smarty.cookies.username}

{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
{$smarty.server.SERVER_NAME}

{* display the system environment variable "PATH" *}
{$smarty.env.PATH}

{* display the php session variable "id" ($_SESSION['id']) *}
{$smarty.session.id}

{* display the variable "username" from merged get/post/cookies/server/env *}
{$smarty.request.username}

{$smarty.now}

当前的时间戳 可以通过{$smarty.now}来获取。 时间戳是从1970年1月1日开始计算到当前的秒数。 当前时间戳可以被date_format 修饰器使用并显示。 注意:在每次使用该变量时都会调用time()函数。 比如说一个程序花了三秒来执行,在开头和结束时都调用了$smarty.now,那么这两个数值将差三秒。

{* use the date_format modifier to show current date and time *}
{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}

{$smarty.const}
直接访问PHP的常量。

{$smarty.capture}
Smarty内置函数 {capture}..{/capture}可以捕获其中的代码输出。 通过{$smarty.capture}变量可以使用这些输出的代码。

{$smarty.config}
{$smarty.config}变量可以获取 配置变量。 {$smarty.config.foo}可获取设置变量的 {#foo#}。

配置文件foo.conf例子:

pageTitle = "This is mine"
bodyBgColor = '#eeeeee'
tableBorderSize = 3
tableBgColor = "#bbbbbb"
rowBgColor = "#cccccc"

示范使用 $smarty.config方式的模板:

{config_load file='foo.conf'}
<html>
<title>{$smarty.config.pageTitle}</title>
<body bgcolor="{$smarty.config.bodyBgColor}">
<table border="{$smarty.config.tableBorderSize}" bgcolor="{$smarty.config.tableBgColor}">
<tr bgcolor="{$smarty.config.rowBgColor}">
    <td>First</td>
    <td>Last</td>
    <td>Address</td>
</tr>
</table>
</body>
</html>

上面的例子都可以输出:

<html>
<title>This is mine</title>
<body bgcolor="#eeeeee">
<table border="3" bgcolor="#bbbbbb">
<tr bgcolor="#cccccc">
	<td>First</td>
	<td>Last</td>
	<td>Address</td>
</tr>
</table>
</body>
</html>

{$smarty.section}
{$smarty.section}变量是{section} 循环中的属性。 它提供了一些很有用的值,如 .first, .index等等。

{$smarty.template}
返回当前的模板名称(不带目录名)。

{$smarty.template_object}
返回当前模板对象。

{$smarty.current_dir}
返回当前模板的目录名称。

{$smarty.version}
返回编译当前模板的Smarty版本。

{$smarty.block.child}
返回子模板提供的区块代码。 

{$smarty.block.parent}
返回父模板提供的区块代码。 

{$smarty.ldelim}, {$smarty.rdelim}
用于显示左定界符和右定界符。等同于 {ldelim},{rdelim}。

2.3 变量修饰器
变量修饰器可以用于变量, 自定义函数或者字符串。 使用修饰器,需要在变量的后面加上|(竖线)并且跟着修饰器名称。 修饰器可能还会有附加的参数以便达到效果。 参数会跟着修饰器名称,用:(冒号)分开。 同时,默认全部PHP函数都可以作为修饰器来使用 (不止下面的),而且修饰器可以被 联合使用。

capitalize -- 使变量内容里的每个单词的第一个字母大写
cat -- 连接多个变量                 
count_characters -- 计算变量内容里有多少个字符
count_paragraphs -- 计算变量内容有多少个段落
count_sentences -- 计算变量内容有多少个句子。 每个句子必须以点号、问号或者感叹号结尾。(.?!)
count_words -- 用于计算变量内容有多少个单词
date_format -- 将日期和时间格式化成strftime()的格式。 时间可以是unix的 时间戳, DateTime 对象, mysql时间戳,或者月日年格式的字符串,与PHP函数strtotime()类似。模板设计者可以对date_format的格式有完全的控制。 如果传递到date_format的时间为空, 而第二个参数传递了值,那么第二个参数将作为需要格式化的时间。
default -- 为变量设置默认值。 当变量是unset或者empty的字符串时,默认值将显示。 必须要有一个参数
escape -- escape可用于将变量编码或转换成 html, url, 单引号, 十六进制, 十六进制实体, javascript 和 电邮地址。 默认是:html。
from_charset -- from_charset转换变量到内置字符集。 与to_charset 修饰器刚好相反
indent -- 缩进每一行的字符串,默认是缩进4个空格。 可选的参数可以设置缩进的空格数量。 可选的第二个参数设置缩进使用的字符,如用 "\t" 来代替空格缩进
lower -- 将变量值转成小写字母。 等同于PHP的 strtolower()函数
nl2br -- 将变量值中的"\n"回车全部转换成HTML的 <br />。 等同于PHP的 nl2br()函数
regex_replace -- 用正则表达式搜索和替换变量值。 使用PHP的 preg_replace()函数进行
replace -- 对变量进行简单的搜索和替换。 等同于PHP函数的 str_replace()
spacify -- spacify会在变量的字符串中插入空格。 你可以设置插入的是空格或者别的字符
string_format -- 格式化字符串,如浮点数等。 使用 sprintf()的PHP函数来进行
strip -- 转换连续空格,回车和tab到单个空格或是指定字符串
strip_tags -- 去除标记等任何包含在< 和 >中间的字符
to_charset -- to_charset可将变量值由当前内置字符集转换到指定字符集。 它是from_charset 修饰器的相反操作
truncate -- 截取字符串到指定长度,默认长度是80. 第二个参数可选,指定了截取后代替显示的字符。 截取后的字符长度是截取规定的长度加上第二个参数的字符长度 默认truncate会尝试按单词进行截取。 如果你希望按字符截取(单词可能会被截断),需要设置第三个参数TRUE
unescape -- unescape可以解码entity, html 和 htmlall等的编码。 它与escape 修饰器的效果刚好相反
upper -- 将变量值转成大写字母。 等同于PHP的 strtoupper()函数
wordwrap -- 限制一行字符的长度(自动换行),默认是80个字符长度。 可选的第二个参数,可自定义换行字符,默认换行字符是 "\n"。 默认情况下,是根据单词来换行的,也就是按英文语法的自动换行。 如果你希望按照字符来换行(边界的单词将拆开),那么可以设置 可选的第三个参数为TRUE,效果与PHP函数wordwrap()一样
{* apply modifier to a variable *}
{$title|upper}

{* modifier with parameters *}
{$title|truncate:40:"..."}

{* apply modifier to a function parameter *}
{html_table loop=$myvar|upper}

{* with parameters *}
{html_table loop=$myvar|truncate:40:"..."}

{* apply modifier to literal string *}
{"foobar"|upper}

{* using date_format to format the current date *}
{$smarty.now|date_format:"%Y/%m/%d"}

{* apply modifier to a custom function *}
{mailto|upper address="smarty@example.com"}

{* using  php's str_repeat *}
{"="|str_repeat:80}

{* php's count *}
{$myArray|@count}

{* this will uppercase and truncate the whole array *}
<select name="name_id">
{html_options output=$my_array|upper|truncate:20}
</select>

2.4 内置函数

Smarty自带了一些内置函数。这些内置函数是Smarty模板引擎的组成部分。它们会被编译到PHP代码中,以取得最高的性能。你不能建立相同名称的自定义函数;同时你也不需要修改这些内置函数。少数的内置函数有assign属性,可以将函数的结果赋值给模板变量,而不是输出;效果如同 {assign}函数。

{$var=...}
{append}
{assign}
{block}
{call}
{capture}
{config_load}
{debug}
{extends}
{for}
{foreach},{foreachelse}
@index
@iteration
@first
@last
@show
@total
{break}
{continue}
{function}
{if},{elseif},{else}
{include}
{include_php}
{insert}
{ldelim},{rdelim}
{literal}
{nocache}
{php}
{section},{sectionelse}
.index
.index_prev
.index_next
.iteration
.first
.last
.rownum
.loop
.show
.total
{setfilter}
{strip}
{while}

{if},{elseif},{else}

Smarty的{if}条件判断和PHP的if非常相似,只是增加了一些特性。每个{if}必须有一个配对的{/if}.也可以使用{else}和{elseif}.全部的PHP条件表达式和函数都可以在if内使用,如||,or,&&,and,is_array(),等等.如果开启了安全机制,那么只有在$php_functions设置允许的PHP函数才能使用。

运算符别名语法示例含义对应PHP语法
==eq$a eq $b等于==
!=ne, neq$a neq $b不等于!=
>gt$a gt $b大于>
<lt$a lt $b小于<
>=gte, ge$a ge $b大于等于>=
<=lte, le$a le $b小于等于<=
=== $a === 0绝对等于===
!notnot $a非 (一元运算)!
%mod$a mod $b取模%
is [not] div by $a is not div by 4取模为0$a % $b == 0
is [not] even $a is not even[非] 取模为0 (一元运算)$a % 2 == 0
is [not] even by $a is not even by $b水平分组 [非] 平均($a / $b) % 2 == 0
is [not] odd $a is not odd[非] 奇数 (一元运算)$a % 2 != 0
is [not] odd by $a is not odd by $b[非] 奇数分组($a / $b) % 2 != 0
{if $name eq 'Fred'}
    Welcome Sir.
{elseif $name eq 'Wilma'}
    Welcome Ma'am.
{else}
    Welcome, whatever you are.
{/if}

{* an example with "or" logic *}
{if $name eq 'Fred' or $name eq 'Wilma'}
   ...
{/if}

{* same as above *}
{if $name == 'Fred' || $name == 'Wilma'}
   ...
{/if}


{* parenthesis are allowed *}
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
   ...
{/if}


{* you can also embed php function calls *}
{if count($var) gt 0}
   ...
{/if}

{* check for array. *}
{if is_array($foo) }
   .....
{/if}

{* check for not null. *}
{if isset($foo) }
   .....
{/if}


{* test if values are even or odd *}
{if $var is even}
   ...
{/if}
{if $var is odd}
   ...
{/if}
{if $var is not odd}
   ...
{/if}


{* test if var is divisible by 4 *}
{if $var is div by 4}
   ...
{/if}


{*
  test if var is even, grouped by two. i.e.,
  0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
*}
{if $var is even by 2}
   ...
{/if}

{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
{if $var is even by 3}
   ...
{/if}

{foreach},{foreachelse}

{foreach}用于循环数组。 {foreach}的语法比{section}循环要更简单和清晰,并且可以使用非数字下标的数组。
{foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}
{foreach} 循环可以被嵌套使用.
array变量,一般是数组的值,决定了{foreach} 循环的次数。你也可以传递一个任意的整数来控制循环次数。
如果array数组变量中,没有值的情况下, {foreachelse}将执行。
{foreach}的属性: @index, @iteration, @first, @last, @show, @total.
{foreach}的语法命令: {break}, {continue}.
代替指定key变量,你可以通过 {$item@key}来使用循环的当前key。(见下面的例子).

使用key变量的例子

<?php
$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
$smarty->assign('myPeople', $people);
?>

模板将以键值对的方式输出$myArray

<ul>
{foreach $myPeople as $value}
   <li>{$value@key}: {$value}</li>
{/foreach}
</ul>

输出:

<ul>
    <li>fname: John</li>
    <li>lname: Doe</li>
    <li>email: j.doe@example.com</li>
</ul>

2.5 成员方法

addConfigDir() — 增加一个配置文件目录
addPluginsDir() — 增加一个插件目录
addTemplateDir() — 增加一个模板文件目录
append() — 把值追加到数组。
appendByRef() — 引用追加
assign() — 赋值
assignByRef() — 引用赋值
clearAllAssign() — 清除全部赋值
clearAllCache() — 清除全部缓存
clearAssign() — 清除赋值
clearCache() — 清除缓存
clearCompiledTemplate() — 清除模板编译文件
clearConfig() — 清除配置
compileAllConfig() — 编译全部配置文件
compileAllTemplates() — 编译全部模板
configLoad() — 载入预配置的变量
createData() — 创建数据对象
createTemplate() — 创建模板对象
disableSecurity() — 关闭安全检查
display() — 显示
enableSecurity() — 开启安全检查
fetch() — 取得输出内容
getCacheDir() — 取得缓存目录
getCompileDir() — 取得编译目录
getConfigDir() — 取得配置文件目录
getConfigVars() — 取得预配置变量
getPluginsDir() — 取得插件目录
getRegisteredObject() — 获取已注册对象
getTags() — 取得模板标签
getTemplateDir() — 取得模板目录
getTemplateVars() — 取得变量值
isCached() — 检查模板是否已经缓存
loadFilter() — 载入过滤插件
Smarty::muteExpectedErrors() — 忽略脚本警告信息
registerCacheResource() — 注册缓存资源
registerClass() — 注册类
registerDefaultPluginHandler() — 注册默认插件处理器
registerFilter() — 注册过滤器
registerPlugin() — 注册插件
registerObject() — 注册对象
registerResource() — 注册资源
setCacheDir() — 设置缓存目录
setCompileDir() — 设置编译目录
setConfigDir() — 设置配置目录
setPluginsDir() — 设置插件目录
setTemplateDir() — 设置模板目录
templateExists() — 检查模板是否存在
unregisterCacheResource() — 注销缓存资源
unregisterFilter() — 注销过滤器
unregisterPlugin — 注销插件
unregisterObject() — 注销对象
unregisterResource() — 注销资源
testInstall() — 测试Smarty安装

参考文档:

http://www.smarty.net/docs/zh_CN/

 

 

郎涯工作室 CSDN认证博客专家 Java PHP 视音频
微信搜索:【郎涯工作室】关注我。
卖码为生,有代码洁癖。不爱广度,爱深度 — 专注分享Java / PHP / C++ / 视音频领域等技术。
想和你一起,每天进步一点点,做一个不凡的人!
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页