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 相关文章推荐
很实用的一个完整email发送程序
Oct 09 PHP
php 仿Comsenz安装效果代码打包提供下载
May 09 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
带密匙的php加密解密示例分享
Jan 29 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
php上传文件常见问题总结
Feb 03 PHP
php简单的上传类分享
May 15 PHP
PHP strip_tags保留多个HTML标签的方法
May 22 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP实用小技巧之调用录像的方法
Dec 05 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
PHP数学运算与数据处理实例分析
2016/04/01 PHP
用JS实现的一个include函数
2007/07/21 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python读取word文档的方法
2015/05/09 Python
在Python中使用成员运算符的示例
2015/05/13 Python
Python判断字符串与大小写转换
2015/06/08 Python
python3抓取中文网页的方法
2015/07/28 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
大学毕业生的自我鉴定
2013/11/30 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
教师节活动主持词
2014/04/02 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
单位综合评价意见
2015/06/05 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python