PHP Smarty模版基础知识
来源:互联网 发布:编程小游戏用什么软件 编辑:程序博客网 时间:2024/05/01 21:45
一、Smarty的优点
1.速度
采用Smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。比PHP内嵌到HTML中的做法要有效率的多。
采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译。无模板解析的开销,只编译一次。仅当模板文件被修改后才会重新编译。
Smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。
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 双引号中嵌入变量
另外,带有其他字符的,如点号(.)或者 $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} 保留变量
页面请求变量
页面请求变量 如$_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 = 3tableBgColor = "#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会尝试按单词进行截取。 如果你希望按字符截取(单词可能会被截断),需要设置第三个参数TRUEunescape -- 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语法
$a === 0绝对等于===!notnot $a非 (一元运算)!%mod$a mod $b取模%is [not] div by
$a is not div by 4取模为0$a % $b == 0is [not] even
$a is not even[非] 取模为0 (一元运算)$a % 2 == 0is [not] even by
$a is not even by $b水平分组 [非] 平均($a / $b) % 2 == 0is [not] odd
$a is not odd[非] 奇数 (一元运算)$a % 2 != 0is [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/
- PHP Smarty模版基础知识
- 关于php smarty模版入门
- PHP 模版引擎Smarty介绍
- SMARTY模版
- smarty模版
- Smarty模版
- php smarty的实际应用--多模版网站
- php中smarty模版引擎中的缓存应用!
- php smarty模版引擎中变量操作符及使用方法
- php Smarty模版引擎中引入javascript源文件
- PHP - Smarty模版使用(一) - 配置及简单调试
- PHP开发工具CI框架下配置smarty模版
- Smarty模版入门
- smarty模版介绍
- 深入探究Smarty模版
- Smarty模版操作数组
- smarty模版内容
- smarty模版基础
- Latex 设置文字大小
- Android 判断app是否在前台还是在后台
- redis 数据持久化
- 时间格式简写
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 解决方
- PHP Smarty模版基础知识
- 基于Bayes和KNN的newsgroup 18828文本分类器的Python实现
- 使用JMS发布订阅topic,传递ObjectMessage
- bubble_sort中change的作用举例
- noip2009-4 道路游戏
- js笔记--BOM编程
- 自定义属性,自定义view,自定义UI模板
- hadoop spark全真式分布集群配置
- MD5加密算法