Smarty的基本使用与总结
1、简介
含义:Smarty是PHP的一个引擎模板,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来。
环境需求:PHP5.2或者更高版本
我使用的环境是:PHP5.3,windows 环境
2、安装
在网上下载Smarty包直接将其解压,我们需要的仅仅是里面的libs文件夹。Libs文件里面都是库文件,我们不应该修改里面的任何内容。解压完毕后就直接将libs文件夹放入到我们需要使用的网站根目录。
3、基本情况简介
首先打开Smarty.class.php文件看看里面的一些代码:
Smarty的构造器:
templates:默认存放模板文件夹
templates_c:默认存放混编文件的文件夹
cache:存放缓存
configs:存放配置文件
默认左右边界符:
4、使用
从上文了解到Smarty需要一些文件夹用来分别存放不同类别的文件。有templates、templates_c、cache、configs等文件夹。这是默认文件夹名称,你可以根据你的喜好对它们进行更改。
1、下是我建立的文件夹:
2、简单实例
先在templates文件夹下准备自己需要的模板文件。test1.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>smarty test1</title>
</head>
<body>
它的名字叫{$name}
</body>
</html>
接着在根目录下建立访问的逻辑文件。test1.php
<?php
require './libs/Smarty.class.php';
$smarty=new Smarty();
$name='刘二狗';
$smarty->assign( 'name' , $name );
$smarty->display('./test1.html');
访问test1.php结果为:
当访问完后将会在templates_c中生成一个相应的混编文件
这就是Smarty在PHP中的简单使用。
5、Smarty常用的语法
5.1、普通变量的声明与使用
一共有两种声明变量的方法。
第一种:上面的例子已经使用过,即$smarty->assign('name','值');
第二种:在模板文件中声明(html中),即{assign var='name' value='值'}
使用:{$name}
注意:也可以定义与使用数组。假若上面定义的name为一个一维数组,使用时即:{$name[2]}、{$name['aa']}={$name.aa}等等使用方式。
5.2、注释
{* 这里面是注释内容 *}
Smarty的注释是不会在最终页面输出显示的,即:若在html里则效果像<!--注释-->一样,不过也有一定的区别,Smarty的注释在浏览器里查看源代码也是不显示的,而html的注释是显示的。例如:
5.3、数组
Smarty对数组的使用:数组[下标]、数组.下标
5.4、对象
对象的声明和变量一样,通过assign来声明
使用采用 -> 来调用对象的属性
5.5、保留变量
Smarty中有一个特殊的变量(就是smarty)可以通过这个变量很容易就可以访问到一些环境变量。就像PHP中的超全局变量一样神奇。
注意:在使用这个保留变量的时候:smarty是对于大小写敏感的,我们需要的是小写的smarty
例子:
一、使用smarty访问PHP中的超全局数组变量:
1、获取$_GET {$smarty.get.name} 获取get中的name值
2、获取$_POST {$smarty.post.name} 获取post中的name值
3、获取$_COOKIE {$smarty.cooke.name} 获取cookie中的name值
同理,还可以获取$_SERVER
, $_ENV
和 $_SESSION
等等
注意:虽然Smarty提供了较方便直接访问PHP超全局变量的方法,但必须谨慎使用。 直接访问超全局变量会弄乱应用程序底层代码和模板语法。 最佳的实践是从PHP将需要的变量对模板进行赋值再使用。
二、获取当前时间戳
{$smarty.now}其原理就是调用了timr()函数
三、直接访问PHP常量
{$smarty.const.常量名}即{$smarty.const.AGE}
PHP定义常量
smarty直接调用常量
结果
四、其他
获取配置变量:{$smarty.config}
返回当前模板名称:{$smarty.template}
返回当前模板对象:{$smarty.template_object}
返回当前目录名称:{$smarty.current_dir}
等等
5.6、配置文件
之前根据需求建立的Configs文件夹可以派上用处啦!我们在这个文件夹下建立Smarty.conf配置文件(命名任意,木有明确规定),配置文件可以让设计者将全局的模板变量以文件的方式管理起来。
首先我们先来定义一些配置变量来对它进行简单的了解:
定义如下所示:
引入配置文件:{config_load file=’Smarty.conf’}
引用配置变量:{#配置变量#}、{$smarty.config.配置变量}
显示结果:
了解段落变量定义与引用:
在Smarty配置文件中大体分为两种变量,一种为全局变量,另一种为段落变量。全局全局变量故名思议就是就是每次载入这个配置文件的时候这些变量都会被加载。而段落变量则有选择的进行加载。
段落变量的定义语法:
[段落名字]
段落名字:这里可以是任意字符但不包括’[‘和’]‘,具体定义看下面Smarty.conf
调用段落变量:在引入配置文件后面加上这段代码 section='段落名字'。
注意:section只能使用一次,若有多个section引入多个段落变量则最后一个会覆盖前面的所有section引入的段落变量,即只有最后一个引入的段落变量有用其他作废。
Smarty.conf文件
#这里是注释,#为注释符号
#这里是全局变量,也就是说title和bodyColor变量每次都会被加载
title='标题'
bodyColor='#eee' #段落变量
[firstStyle]
color='#00f'
width='200px'
height='300px' [.secondStyle]
color='#00f'
width='200px'
height='300px' [other]
other='这是其他'
test1.html文件
{config_load file='Smarty.conf' section='firstStyle'}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>smarty test1</title>
</head>
<body>
<!-- 这里是html注释 -->
{*这是Smarty注释*}
名字:{$jane->name }<br/>
性别:{$jane->sex}<br/>
年龄:{$jane->age}
<hr/>
常量年龄:{$smarty.const.AGE}
<hr/>
使用配置变量1:{#title#}<br/>
使用配置变量2:{$smarty.config.bodyColor}
<hr/>
段落变量加载:<br/>
{#color#}
<br/>
{#other#}
</body>
</html>
访问结果:
注意:
1、若全局变量与被加载的段落变量有相同的变量名,则段落名的值将覆盖全局变量的值。
2、若某个段落变量里含有相同的变量名,则最后一个的变量的值将会覆盖前面的值。
3、在整个smarty.conf文件中,点(.)拥有相对较高的权限的。点的作用是将一个变量或者整个段落隐藏,不能被使用。(我的理解就是相当于被注释掉不能被使用)
段落变量的一个简单应用:
假若我们要使一个网站可以在多种风格的界面转换,这时我们使用段落变量就可以很容易就实现了。
test1.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>smarty test1</title>
<style type="text/css">
#aa{width: 200px;height: 200px;background: red;}
</style>
</head>
<body>
<div id='aa'>
这是一个div
</div>
</body>
</html>
访问结果:
访问结果出现一个错误。由于使用了smarty模板,所以在html的所有{}将会被smarty解析。
解决方法:
1、更换定界符
2、在({)前面加一个空格,
3、使用{literal}{/literal} literal:原样的,原义的
简单应用,让一个div实现两种背景颜色:
test1.php
<?php
require './libs/Smarty.class.php';
$smarty=new Smarty();
$smarty->display('./test1.html');
Smarty.conf
#段落变量
#第一种颜色风格
[firstStyle]
color='#00f'
width='300px'
height='300px'
content='第一种风格' #第二种颜色风格
[secondStyle]
color='#0f0'
width='500px'
height='500px'
content='第二种风格'
测试1:
test1.html
{config_load file='Smarty.conf' section='firstStyle'}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>smarty test1</title>
<style type="text/css">
#aa{ width: {#width#};height: {#height#};background: {#color#};}
</style>
</head>
<body>
<div id='aa'> 这是一个div<br/><br/>
{#content#}
</div>
</body>
结果:
测试2:
test2.html
{config_load file='Smarty.conf' section='secondStyle'}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>smarty test1</title>
<style type="text/css">
#aa{ width: {#width#};height: {#height#};background: {#color#};}
</style>
</head>
<body>
<div id='aa'> 这是一个div<br/><br/>
{#content#}
</div>
</body>
</html>
结果:
5.7、判断{if}{elseif}{else}
Smarty的{if}
条件判断和PHP的if非常相似,只是增加了一些特性。 每个{if}
必须有一个配对的{/if}
. 也可以使用{else}
和 {elseif}
. 全部的PHP条件表达式和函数都可以在if内使用,如||, or, &&, and, is_array(), 等等.
注意:如果开启了安全机制,那么只有在$php_functions设置允许的php函数才能够使用。
运算符表:
5.8、for
{for}{forelse}用于创建简单的循环
{forelse}在循环不能遍历的时候使用
例子:
5.9、while
Smarty的while循环和PHP中的while循环是几乎一样的,smarty中需要在后面增加</while>来结束
例子:
结果:
5.10、{section}{sectionelse}
可以循环遍历连续数字索引的数组,不能循环关联数组
基本使用:
访问结果:
不使用赋值数组直接输出:
结果:
遍历关联数组:
结果:
Section还有很多关键字强大的功能还没有一一列出来,具体可以参考smarty手册。Foreach相对于section来说显得更加强大,能用section做到的,foreach也能做到,并且foreach使用起来更加方便简单,接下来我们来学习了解foreach。
5.11、foreache与foreachelse
通过类比的方法可以知道foreache是用来循环数组的。如果不存在遍历的数组则执行{foreachelse}部分
注意:这里不存在的数组指的是定义后这个数组没有数据。假若这个数组没有定义,则会发出警告。
简单例子:
<?php
require './libs/Smarty.class.php';
$smarty=new Smarty();
$arr=array('name'=>'小明','sex'=>'男','age'=>'18');
$smarty->assign( 'arr' , $arr );
$smarty->assign('arr0',array());
$smarty->display('./test1.html');
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>smarty test1</title>
</head>
<body>
{foreach $arr as $k=>$v}
{$k}=>{$v}<br/>
{foreachelse}
99999
{/foreach}
<hr/>
{foreach $arr0 as $k=>$v}
{$k}=>{$v}<br/>
{foreachelse}
此处输出foreachelse,无数据
{/foreach}
</body>
</html>
访问结果:
在smarty中使用foreach和我们在PHP中的foreach循环几乎是一样的,就是书写的方式不一样,但形式上是一样的!
foreach具有一些内部关键字:
1、@iteration,当前循环次数,从1开始
2、@index,表示当前索引,从零开始
3、@first当前是首次循环是,first为true
4、@last循环最后一次时,last为true
5、@show,是在{foreach}循环执行后,,检测循环是否有输出,show是一个布尔值
6、@total,{foreach}的循环次数,total可以在{foreach}
内部,或者之后使用
7、{break},停止循环
8、{continue},跳出此次循环
例子:
<?php
require './libs/Smarty.class.php';
$smarty=new Smarty();
$arr=array('name'=>'狗蛋','sex'=>'男','age'=>'18','from'=>'广东','tel'=>'123456789');
$smarty->assign( 'arr' , $arr);
$smarty->display('./test1.html');
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>smarty test1</title>
</head>
<body>
{foreach $arr as $k=>$v} {if $v@iteration==2}
<b>{$k}=>{$v}</b>---这里iteration,从1开始计算<br/>
{continue}
{/if} {if $v@index==2}
<b>{$k}=>{$v}</b>---这里index,从0开始计算<br/>
{continue}
{/if} {if $v@first}
<b>{$k}=>{$v}</b>---这里first,数组第一个元素<br/>
{continue}
{/if} {if $v@last}
<b>{$k}=>{$v}</b>---这里last,数组最后一个元素<br/>
{break}
break将已经跳出去了,不能在输出这里的内容了【这个例子跳出整个循环的现在不能够检验,读者可自己进行测试】
{/if} {$k}=>{$v}<br/> {/foreach}
<hr/>
总循环次数:{$v@total}
{if $v@show}
<hr/>
判断上面循环有输出<br/>
{/if} </body>
</html>
访问结果:
5.12、自定义函数
Smarty自带了一些自定义的函数插件,可以在模板内使用。
以下是参考smarty手册所列的自定义函数:
a、{counter},用于显示一个计数器。 {counter}
可以记住foreach循环的次数。
b、{cycle},用于交替循环一系列值。
c、{fetch},用于获取文件内容、HTTP或者FTP内容,以便输出。
d、{html_checkboxes},是一个自定义函数,用于创建HTML的多选框组和提供数据。
e、{html_image},用于生成HTML的<img>标签。
f、{html_options},可以提供数据,生成HTML<select><option>标签,还可以设置选中项等属性。
g、{html_radios},用于创建HTML的单选框和提供数据。
h、{html_select_data},用于创建一个选择日期的下拉框。 它可以显示任何或者全部的年、月、日。 任何不在上面列表中的键值对属性,都会被输出到<select>
标签中作为属性和值。
i、{html_select_time},用于创建一个选择时间的下拉框。 它可以显示任何或全部的小时、分钟、秒和上下午。
j、{html_table},可以使用数组的形式的数据来创建一个HTML的<table>。
k、{mailto},可以自动创建一个mailto:
链接,而且可以选择编码方式。 对邮件编码可以使邮件地址更难以被网络爬虫抓取。
l、{math},可以让模板设计者在模板中进行一些数学运算。
m、{textformat},是一个用于格式化文本的块函数。
以上是smarty的自定义函数,具体的使用方法请参考smarty手册。
5.13、模板布局
即是模板的继承问题。使用的关键字主要有block、extends
首先,我们先在站点建立一个layout文件夹(主要用来存放父模板文件),然后在文件夹下建立一个模板文件template.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>这个是模板文件</title>
</head>
<body>
<h2>这个是模板文件输出的</h2> <hr/>
子输出一:{block name='first'}{/block}
<hr/>
<hr/>
子输出二:{block name='second'}{/block}
<hr/> <h2>这个是模板文件输出的</h2>
</body>
</html>
接着再建立模板文件test.html,此模板需要继承上面的父模板
{extends file='layout/template.html'}
{block name='first'}
这里是test中的first
{/block}
{block name='second'}
这里是test中的second
{/block}
逻辑文件调用smarty,test.php
<?php
require './libs/Smarty.class.php';
$smarty=new Smarty();
$smarty->display('./test.html');
访问结果:
小结:若含较多的公共部分,则采用布局文件;含公共部分较少,则采用包含文件{include file='文件路径'}
(以上是自己的一些见解,若有不足或者错误的地方请各位指出)
作者:那一叶随风
声明:本博客文章为原创,只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接。
Smarty的基本使用与总结的更多相关文章
- ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案
好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...
- smarty使用
smarty-牛刀小试 smarty 初识 官网 http://www.smarty.net/ Smarty is a template engine for PHP(PHP模板引擎) smarty使 ...
- Smarty模版引擎的原理
Smarty是一个使用php写出来的模版引擎,用来将原本与html代码混杂在一起PHP代码逻辑分离,实现前后端分离. Smarty模板优点: 1. 速度:采用Smarty编写的程序可以获得最大速度的提 ...
- 12月15日下午Smarty模板函数
1.{$var=...} 这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值. <{$a = 10}><!--赋值语句--> <{$a}> ...
- 12月15日smarty模板基本语法
smarty基本语法: 1.注释:<{* this is a comment *}>,注意左右分隔符的写法,要和自己定义的一致. <{* I am a Smarty comment, ...
- 12月13日上午Smarty模版原理
模板主要是用来让前端和后端分离的,前台页面只是一个前台页面,后台页面用php代码写逻辑,写完逻辑拿到前台显示. 一.写法 一般需要以下:写3个页面: 1.显示页面aa.html <!DOCTYP ...
- SMARTY模板中如何使用get,post,request,cookies,session,server变量
{$smarty}保留变量不需要从PHP脚本中分配,是可以在模板中直接访问的数组类型变量,通常被用于访问一些特殊的模板变量.例如,直接在模板中访问页面请求变量.获取访问模板时的时间戳.直接访问PHP中 ...
- 在新浪云SAE中使用smarty引擎模版
在新浪云上使用smarty时会发现又这样的错误信息: “SAE_Fatal_error: Uncaught exception 'SmartyException' with message 'unab ...
- MVC架构学习之Smarty学习——病来而蔫
前两天是五一小长假,而每次假期都想着如何如何刻苦一番,往往是自作多情.. 当然这次是有小病在身,多个借口吧. 一有病就蔫的不行...要锻炼了啊,脚估计也差不多了,游泳试试吧这周. 这次学习Smarty ...
随机推荐
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- ASP.NET Aries 入门开发教程5:自定义列表页工具栏区
前言: 抓紧时间,继续写教程,因为发现用户期待的内容,都在业务处理那一块. 不得不继续勤劳了. 这节主要介绍工具栏区的玩法. 工具栏的默认介绍: 工具栏默认包括5个按钮,根据不同的权限决定显示: 添加 ...
- PowerShell过滤文件中的重复内容
Get-Content -Path E:\test11\data.txt | Sort-Object | Get-Unique 源文件: AA0001 2014-06-30 15:27:13.073 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(72)-微信公众平台开发-消息处理
系列目录 前言 Senparc.Weixin.MP SDK提供了MessageHandler消息处理类 在作者的Wiki中也详细说明了如何定义这个类,下面我们来演示,消息的回复,及效果 了解Messa ...
- .Net Core上用于代替System.Drawing的类库
目前.Net Core上没有System.Drawing这个类库,想要在.Net Core上处理图片得另辟蹊径. 微软给出了将来取代System.Drawing的方案,偏向于使用一个单独的服务端进行各 ...
- 【知识必备】一文让你搞懂design设计的CoordinatorLayout和AppbarLayout联动,让Design设计更简单~
一.写在前面 其实博主在之前已经对design包的各个控件都做了博文说明,无奈个人觉得理解不够深入,所以有了这篇更加深入的介绍,希望各位看官拍砖~ 二.从是什么开始 1.首先我们得知道Coordina ...
- MySQL优化聊两句
原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...
- C++整数转字符串的一种方法
#include <sstream> //ostringstream, ostringstream::str() ostringstream stream; stream << ...
- 听H3絮叨:何以让天下没有难用的流程
最近朋友圈.网站新闻铺天盖地是"让天下没有难用的流程",有人就要问了,H3 BPM何德何能,为BPM站台,让天下没有难用的流程? 这是一个关于"办公室空想"的故 ...
- excel常用技巧
复制表格时,如果要加上行标和列标.页面布局->工作表选项:标题,勾上打印->复制下拉框->复制为图片加上打印样式 一行长拆成几行短或几行短变成一行长的文本拆分,可以通过:填充-> ...