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中使用Oracle数据库(1)
Oct 09 PHP
php htmlspecialchars加强版
Feb 16 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
Cygwin中安装PHP方法步骤
Jul 04 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
php 猴子摘桃的算法
Jun 20 PHP
利用Laravel生成Gravatar头像地址的优雅方法
Dec 30 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
基于laravel belongsTo使用详解
Oct 18 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
PHP 图片水印类代码
2012/08/27 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
实例讲解php数据访问
2016/05/09 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
ExtJS 入门
2010/10/29 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
JavaScript字符串常用类使用方法汇总
2015/04/14 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
Python restful框架接口开发实现
2020/04/13 Python
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
node中使用shell脚本的方法步骤
2021/03/23 Javascript
致标枪运动员加油稿
2014/02/15 职场文书
护理专科学生自荐书
2014/07/05 职场文书
公司股东合作协议书
2014/09/14 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
python基于turtle绘制几何图形
2021/06/15 Python