php之Smarty模板使用方法示例详解


Posted in PHP onJuly 08, 2014

本文详细剖析了smarty模板的使用方法,对于学习smarty的朋友有一定的参考价值。详情如下:

一、模板中的注释

每一个Smarty模板文件,都是通过Web前台语言(xhtml,css和javascript等)结合Smarty引擎的语法开发的。
用到的web前台开发的语言和原来的完全一样,注释也没有变化。
Smarty注释语法是'左结束符变量值*'和'*右结束符变量值',在这两个定界符之间的内容都是注释内容,可以包含一行或多行,并且用户浏览网页查看原代码时不会看到注释,它只是模板内在的注释,以下是注释的例子。

$smarty->left_lelimiter = '<{';
$smarty->right_delimiter = '}>';

注释:

<{* this a note *}>

二、模板中变量声明

在Smarty中一切以变量为主,所有的呈现逻辑都让模板自行控制。有几种不同类型的变量,变量的类型取决于它的前缀是什么符号或者被什么符号包围。变量可以直接被输出或者作业函数属性和修饰符的参数或者用于内部的条件表达式等

<{$name}> <{*常规类型变量,需要调用模板内的assign函数分配值*}>
<{$contacts[row].phone}> <{*数组类型变量,需要调用模板内的assign函数分配值*}>
<body bgcolor="<{#bgcolor#}>"> <{*从配置文件中读取的变量的值并输出*}>

如果在Smarty模板中输出从php中分配的变量,需要在变量前面加$符号并用定界符将它括起来,命名方式和php的变量命名方式一样,并且定界标示符号又有点像是php中的<?php ?>(事实上它们确实会被替换成这个)

三、模板中输出从php分配的变量

在Smarty模板中经常使用的变量有两种:一是从php中分配的变量;另一种是从配置文件中读取的变量
注意:模板中只能输出从php中分配的变量,不能在模板中为这些变量重新赋值,变量都是全域的,只要分配一次就可以了,如果分配两次以上的话,变量内容会以最后分配的为主
Smarty中提供的foreach或section语句用于遍历输出数组中的每个元素,索引数组和关联数组在模板中输出的方式略有不同,索引数组在模板中的访问方式和在php脚本中的引用是一样的,关联数组中元素在模板中指定的方式是使用'.'访问的。
在模板中访问对象和php脚本中的方式一样,都是通过'->'这个运算符完成的。

四、Smarty 模板中变量的数学计算

在模板中变量不能直接赋值,但可以参与数学运算,只要在php脚本中可以执行的数学运算都可以在模板中应用,如下所示:

<{$foo + 1}> <{* 变量加1 *}>
<{$foo * $bar}> <{* 两个变量相乘 *}>
<{$foo->bar - $bar[1] * $foo->bar - 3 * 7}> <{* 复合类型变量参加运算 *}>
<{if($foo + 2 == 10)}> <{* 数学运算在程序逻辑中应用 *}>

在Smarty模板中可以识别嵌入在双引号中的变量,但有的变量必须用反引号'`'(此符号和'~'在同一个键上)包住,如下所示:

<{"test $foo test"}> <{* 双引号中使用变量 *}>
<{"test `$foo[0]` test"}> <{* 双引号中反引号包住的数组变量 *}>
<{"test `$foo.bar` test"}> <{* 双引号中反引号包住的对象成员变量 *}>

五、smarty模板使用示例

第1步:加载Smarty模板引擎,如:require 'libs/Smarty.class.php'
第2步:创建Smarty对象,如:$smarty = new Smarty();
第3步:修改Smarty默认行为,如:开启缓存、模板的存放路径等
第4步:将程序中取得的数据通过Smarty对象的assign()方法赋值给模板中相应的变量
第5步:用Smarty对象的display()方法将模板内容输出

assign()方法:

这个方法用来给模板中的变量赋值,使用比较容易
原型:void assign(string varname,mixed var)
这个方法可以将php所支持的类型数据赋值给模板变量包含数组和对象
使用方式有如下两种:

//指定一对'名称/数值'
$smarty->assign('question','你好吗');
$smarty->assign('answer','不怎么好');
//指定包含'名称/数值'
$smarty->assign(array('question' => '你好吗','answer' => '不怎么好'));//这种方式比较少用

display()方法:

基于Smarty的脚本中必须用到这个方法,而且一个脚本中只能使用一次,它负责获取和显示由Smarty引擎引用的模板
原型:var display(string template[,string cache_id][,string compile_id])
参数一:template是必选的,指定一个合法的模板资源的类型和路径
参数二:cache_id指定一个缓存标识符的名称
参数三:compile_id在维护一个页面多个缓存时使用
使用方法如下
$smarty->display('tpl/template_dir/template.html');

简单实例:

1、libs:是Smarty类库
2、tpl/cache_dir:存放缓存模板
3、tpl/compile_dir:存放编译后模板文件
4、tpl/config_dir:存放特殊配置文件
5、tpl/template_dir:存放模板文件
6、smarty.php文件里 new 出了一个 Smarty类对象,并设定各对象的属性值,如下代码

<?php
require 'libs/Smarty.class.php';//加载Smarty.class.php文件        
define('SITE_ROOT','./tpl/');//定义一个常量
$tpl = new Smarty();
$tpl->template_dir = SITE_ROOT . 'template_dir';//存模板文件  
$tpl->compile_dir = SITE_ROOT . 'compile_dir';//存编译过的模板文件
$tpl->config_dir = SITE_ROOT . 'config_dir';//存特殊配置文件
$tpl->cache_dir = SITE_ROOT . 'cache_dir';//存Smarty缓存文件  
$tpl->caching = 1;//启用缓存
$tpl->cache_lifetime = 60*60*24;//缓存时间1天  
$tpl->left_delimiter = '<{';//左结束符
$tpl->right_delimiter = '}>';//右结束符

7、index.php文件 首页代码如下

<?php      
 require 'smarty.php';
 $tpl->assign('title','title测试');
 $tpl->assign('content','content测试');
 $tpl->display('template.html');

8、tpl/template_dir/template.html 这是一个模板文件 代码如下

<html>        
 <head>        
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>
   <{$title}>
 </title>
 </head>
 <body>
 <{$content}>
 </body>
</html>
PHP 相关文章推荐
PHP编程之高级技巧——利用Mysql函数
Oct 09 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
Jul 11 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
使用 PHPStorm 开发 Laravel
Mar 24 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
Apr 21 PHP
php中引用符号(&amp;)的使用详细介绍
Dec 06 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
Mar 14 PHP
PHP如何读取由JavaScript设置的Cookie
Mar 22 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 PHP
PHP文件上传小程序 适合初学者学习!
May 23 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 #PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 #PHP
PHP实现生成透明背景的PNG缩略图函数分享
Jul 08 #PHP
PHP的error_reporting错误级别变量对照表
Jul 08 #PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 #PHP
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 #PHP
PHP生成短网址的3种方法代码实例
Jul 08 #PHP
You might like
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
打造计数器DIY三步曲(下)
2006/10/09 PHP
PHP求最大子序列和的算法实现
2011/06/24 PHP
隐性调用php程序的方法
2015/06/13 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
javascript常见用法总结
2014/05/22 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python实现大文件分割与合并
2019/07/22 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
大学生毕业的自我鉴定
2013/11/13 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
唐山大地震的观后感
2015/06/05 职场文书