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使用百度ping服务代码实例
Jun 19 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
PHP处理Oracle的CLOB实例
Nov 03 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
php提交post数组参数实例分析
Dec 17 PHP
详解WordPress中简码格式标签编写的基本方法
Dec 22 PHP
php生成图片验证码的方法
Apr 15 PHP
PHP基于ORM方式操作MySQL数据库实例
Jun 21 PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
Oct 16 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 PHP
PHP如何使用array_unshift()在数组开头插入元素
Sep 01 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代码(抓取网页中的邮箱地址)
2012/07/17 PHP
深入解析php之sphinx
2013/05/15 PHP
php输入数据统一类实例
2015/02/23 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
python通过线程实现定时器timer的方法
2015/03/16 Python
深入浅析python继承问题
2016/05/29 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
python递归实现快速排序
2018/08/18 Python
详解python读取和输出到txt
2019/03/29 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
Django choices下拉列表绑定实例
2020/03/13 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
劳模先进事迹材料
2014/12/24 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python