Smarty模板变量与调节器实例详解


Posted in PHP onJuly 20, 2019

本文实例讲述了Smarty模板变量与调节器。分享给大家供大家参考,具体如下:

Smarty中assign说明

可能有人在学习smarty的时候已经学习了一些php框架,如tp、laravel、Yii等,这里拿tp框架的assign和smarty做一些比较。

$name=thinkphp;
$this->assign('name',$name);
$this->display();
$smarty=new Smarty();
$smarty->assign('name','smarty');
$smarty->display(index.tpl);

上面两段代码片分别是tp和smarty(千万别混淆tp和smarty,一个是开源的框架,一个是模板设计引擎)。

tp在视图模块调用是 {$name}{$name},等同于php里的, <?php echo($name);?>,smarty中是在index.tpl用{$name}调用。注意模板标签的{和$之间不能有任何的空格,否则标签无效。

数组变量

$smarty = new Smarty;
$smarty->assign('smarty',
   array('name'=>'smarty'
   'user' => 'sm')));
$smarty->display('index.tpl');

index.tpl

{$smarty.name}<br>
{$smarty.user}<br>
<?php
$smarty->assign('data',
  array(
  'smarty',
  'sm',
));
$smarty->display('index.tpl');
?>

index.tpl source:

{$Contacts[0]}<br />
{$Contacts[1]}<br />

在tp中的调用有两种方法,如下:

$data[name]='thinkphp';
$data[user]='tp';
$this->a``ssign('data',$data);

这里视图调用有两种方法:

Name:{$data.name}
user:{$data.user}
name:{$data['name']}
name:{$data['user']}

同理对象如下所示:

首先是smarty:

name: {$data->name}<br>
user: {$data->user}<br>

tp:

$data->name='thinkphp';
$data->user='tp';
$this->assign('data',$data);
$this->display();

也有两种调用方式:

name:{$data->name}
user:{$data->user}
name:{$data:name}
user:{$data:user}

smaty和thinkphp是不是有异曲同工之妙呢,所以我们学习框架之前学习smarty是很有帮助的。

变量调节器

为什么先讲调节器呢,因为我觉得这部分其一比较通俗简单,其二后面一些内容也会涉及到调节器的内容。按我的理解smarty的内置调节器就如同php里面内置函数一样起简化编程的作用。

调节器一般用法

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

capitalize

变量所有单词首字母大写作用,和php的ucword()作用相同。

<?php$smarty->assign('articleTitle', 'next x-men film, x3, delayed.');?>
//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.

cat

将cat里的值后接到给定的变量后面。

<?php$smarty->assign('articleTitle', "Psychics predict world didn't end");?>
//index.tpl:
{$articleTitle|cat:" yesterday."}

//OUTPUT:
Psychics predict world didn't end yesterday.

count_characters

<?php
$smarty->assign('articleTitle', 'Cold Wave Linked to Temperatures.');
?>
//Where template is:
{$articleTitle}
{$articleTitle|count_characters}//默认是false不计算空格
{$articleTitle|count_characters:true}//true确定计算空格字符。

//Will output:
Cold Wave Linked to Temperatures.
29
33

count_paragraphs,count_sentences,count_words

分别是计算变量里的段落数量,计算变量里句子的数量,计算变量里的词数作用,这里不一一举例。

default

为变量设置一个默认值。当变量未设置或为空字符串时,将由给定的默认值替代其输出。Default需要一个参数。

<?php$smarty->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.');
$smarty->assign('email', '');?>
//Where template is:
{$articleTitle|default:'no title'}
{$myTitle|default:'no title'}
{$email|default:'No email address available'}

//Will output:
Dealers Will Hear Car Talk at Noon.
no title
Noemail address available

lower和upper

这里不想讲多少,一个是将字符串小写,一个大写。

replace和regex_replace

使用正则表达式在变量中搜索和替换,语法来自Php的preg_repalce函数。一种在变量中进行简单的搜索和替换字符串的处理。等同于php的str_replace()函数。 不懂得去看php手册。虽然Smarty支持regex正则调节器,但最好还是直接使用php的正则表达式,要么使用自定义函数或调节器。因为正则法则属于程序代码,其并不认为是内容外在表现的一部份。

date_format和string_format

主要说明一下这两个调节器。

date_format

本调节器将格式化的日期和时间经php函数strftime()处理。Unix时间戳、mysql时间戳及由年月日组成的字符串格式的日期可以传递到smarty经php函数strtotime()解析。设计者可以使用date_format完全控制日期格式,如果传给date_format的日期为空值,但提供了第二个参数,那么将使用第二参数格式化时间。
从Smarty-2.6.10开始,传递给date_format的数字值(除了mysql时间戳,见下文)总是当作unix时间戳。
在2.6.10版本之前,符合时间戳格式的数字型字符串(如YYYYMMDD)同样可以经由php函数strtotime()处理,因为有时(取决于strtotime()的底层实现)strtotime()接收日期字符串参数,而不是时间戳。
唯一的例外是mysql时间戳:它们本身只有数字,并且是14个字符的长度(YYYYMMDDHHMMSS),mysql时间戳优先于unix时间戳。

<?php
$config['date'] = '%I:%M %p';
$config['time'] = '%H:%M:%S';
$smarty->assign('config', $config);
$smarty->assign('yesterday', strtotime('-1 day'));
?>
//This template uses $smarty.now to get the current time:
{$smarty.now|date_format}
{$smarty.now|date_format:"%D"}
{$smarty.now|date_format:$config.date}
{$yesterday|date_format}
{$yesterday|date_format:"%A, %B %e, %Y"}
{$yesterday|date_format:$config.time}

//This above will output:
Jan 1, 2022
01/01/22
02:33 pm
Dec 31, 2021
Monday, December 1, 2021
14:33:00

date_format转换标记:

%a - 当前区域星期几的简写
%A - 当前区域星期几的全称
%b - 当前区域月份的简写
%B - 当前区域月份的全称
%c - 当前区域首选的日期时间表达
%C - 世纪值(年份除以 100 后取整,范围从 00 到 99)
%d - 月份中的第几天,十进制数字(范围从 01 到 31)
%D - 和 %m/%d/%y 一样
%e - 月份中的第几天,十进制数字,一位的数字前会加上一个空格(范围从 ' 1' 到 ‘31')
%g - 和 %G 一样,但是没有世纪
%G - 4 位数的年份,符合 ISO 星期数(参见 %V)。和 %V 的格式和值一样,只除了如果 ISO 星期数属于前一年或者后一年,则使用那一年。
%h - 和 %b 一样
%H - 24 小时制的十进制小时数(范围从 00 到 23)
%I - 12 小时制的十进制小时数(范围从 00 到 12)
%j - 年份中的第几天,十进制数(范围从 001 到 366)
%m - 十进制月份(范围从 01 到 12)
%M - 十进制分钟数
%n - 换行符
%p - 根据给定的时间值为 am' 或pm',或者当前区域设置中的相应字符串
%r - 用 a.m. 和 p.m. 符号的时间
%R - 24 小时符号的时间
%S - 十进制秒数
%t - 制表符
%T - 当前时间,和 %H:%M:%S 一样
%u - 星期几的十进制数表达 [1,7],1 表示星期一
%U - 本年的第几周,从第一周的第一个星期天作为第一天开始
%V - 本年第几周的 ISO 8601:1988 格式,范围从 01 到 53,第 1 周是本年第一个至少还有 4 天的星期,星期一作为每周的第一天。(用 %G 或者 %g 作为指定时间戳相应周数的年份组成。)
%W - 本年的第几周数,从第一周的第一个星期一作为第一天开始
%w - 星期中的第几天,星期天为 0
%x - 当前区域首选的时间表示法,不包括时间
%X - 当前区域首选的时间表示法,不包括日期
%y - 没有世纪数的十进制年份(范围从 00 到 99)
%Y - 包括世纪数的十进制年份
%Z 或 %z - 时区名或缩写
%% - 文字上的 `%' 字符

string_format

一种格式化字符串的方法,例如格式化为十进制数等等。实际运用的是php的sprintf()函数。

<?php
$smarty->assign('number', 23.5787446);
?>
//Where template is:
{$number}
{$number|string_format:"%.2f"}
{$number|string_format:"%d"}

//Will output:
23.5787446
23.58
24

获取配置文件变量

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

假如配置文件如下:

//config file - foo.conf:
pageTitle = "This is mine"
bodyBgColor = '#eeeeee'
tableBorderSize = 3
tableBgColor = "#bbbbbb"
rowBgColor = "#cccccc"

调用方法如下:

{config_load file='foo.conf'}//{config_load}是一个smarty内置函数。用来从配置文件中加载config变量(#variables#)到模版
<html>
<title>{#pageTitle#}</title>
<body bgcolor="{#bodyBgColor#}">
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
<tr bgcolor="{#rowBgColor#}">
<td>First</td>
<td>Last</td>
<td>Address</td>
</tr>
</table>
</body>
</html>

保留变量

我们一般访问环境变量的时候就使用保留变量{$smarty}。

请求变量诸如GET,GET,_POST,COOKIE,COOKIE,_SERVER, ENVandENVand_SESSION (参考requestvarsorder和requestvarsorder和request_use_auto_globals) 下面举例说明他们的用法:

//http://www.example.com/index.php?page=fo
{$smarty.get.page}//从URL获取page的值,等价于$_GET['page']
{$smarty.post.page}//获取page的变量,等价于$_POST['page']
{$smarty.cookies.username}//获取cookie信息,等价于$_COOKIE['username']
{$smarty.env.PATH}//获取PATG环境变量
{$smarty.session.id}//获取会话变量,等价于$_SESSION['id']
{$smarty.request.username}

尽管Smarty提供了直接访问php超级变量的便利,但仍需谨慎使用。一般来说,GET、POST和REQUEST通常用来直接取值,但更常用的方法是通过访问SERVER、ENV、COOKIE、SESSION变量以防止(不安全值)混进模版底层代码。一个好的习惯是给模板变量赋具体的初始值。

1.{$smarty.now}

返回自从Unix 纪元(格林威治时间 1970 年1月1日00:00:00)到当前时间的秒数,可以直接通过变量调节器date_format输出显示。应注意的是time()在每次触发时被调用;例如,脚本执行完需要3秒钟,在始末分别调用$smarty.now的话将显示3秒的差异。

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

2.{#smarty.const}

访问php常量

<?php// the constant defined in phpdefine('MY_CONST_VAL','CHERRIES');?>
//Output the constant in a template with{$smarty.const.MY_CONST_VAL}
<?php
 // php定义常量
 define('MY_CONST_VAL','CHERRIES');?>

3.{$smarty.capture}

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

4.{$smarty.config}

获取配置变量

5.{$smarty.section}

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

6.{$smarty.template}

返回经过处理的当前模板名(不包括目录)。

7.{$smarty.current_dir}

返回经过处理的当前模板目录名。

8{$smarty.version}、$smarty.block.child}、{$smarty.block.parent}{$smarty.ldelim}、{$smarty.rdelim}

用的少,不作说明,可以查看手册了解更多内容。

希望本文所述对大家基于smarty模板的PHP程序设计有所帮助。

PHP 相关文章推荐
php开发工具之vs2005图解
Jan 12 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
PHP 第三节 变量介绍
Apr 28 PHP
php 如何获取数组第一个值
Aug 06 PHP
使用php显示搜索引擎来的关键词
Feb 13 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
php文件类型MIME对照表(比较全)
Oct 07 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
Smarty模板配置实例简析
Jul 20 #PHP
详解PHP 7.4 中数组延展操作符语法知识点
Jul 19 #PHP
php的优点总结 php有哪些优点
Jul 19 #PHP
Yii框架页面渲染操作实例详解
Jul 19 #PHP
Yii2 queue的队列使用详解
Jul 19 #PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 #PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 #PHP
You might like
php设计模式 Command(命令模式)
2011/06/26 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
jQuery.each使用详解
2015/07/07 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
python3使用urllib模块制作网络爬虫
2016/04/08 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
用python与文件进行交互的方法
2018/03/01 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
青年文明号服务承诺
2014/03/31 职场文书
服务标兵事迹材料
2014/05/04 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
2014年党支部工作总结
2014/11/13 职场文书
布达拉宫的导游词
2015/02/02 职场文书
爱心捐书倡议书
2015/04/27 职场文书
联村联户简报
2015/07/21 职场文书
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技