含义:php
Smarty是PHP的一个引擎模板,能够更好的进行逻辑与显示的分离,即咱们常说的MVC,这个引擎的做用就是将C分离出来。css
环境需求:PHP5.2或者更高版本html
我使用的环境是:PHP5.3,windows 环境ios
安装:windows
在网上下载Smarty包直接将其解压,咱们须要的仅仅是里面的libs文件夹。Libs文件里面都是库文件,咱们不该该修改里面的任何内容。解压完毕后就直接将libs文件夹放入到咱们须要使用的网站根目录。数组
使用:浏览器
首先打开Smarty.class.php文件看看里面的一些代码:缓存
Smarty的构造器:安全
templates:默认存放模板文件夹cookie
templates_c:默认存放混编文件的文件夹
cache:存放缓存
configs:存放配置文件
默认左右边界符:
在PHP中的简单使用:
(一)、使用前准备工做与简单实例
从上文了解到Smarty须要一些文件夹用来分别存放不一样类别的文件。有templates、templates_c、cache、configs等文件夹。这是默认文件夹名称,你能够根据你的喜爱对它们进行更改。
一、下是我创建的文件夹:
二、简单实例
先在templates文件夹下准备本身须要的模板文件。test1.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>smarty test1</title> 6 </head> 7 <body> 8 它的名字叫{$name} 9 </body> 10 </html>
接着在根目录下创建访问的逻辑文件。test1.php
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $name='刘二狗'; 5 $smarty->assign( 'name' , $name ); 6 $smarty->display('./test1.html');
访问test1.php结果为:
当访问完后将会在templates_c中生成一个相应的混编文件
这就是Smarty在PHP中的简单使用。
(二)、一些经常使用的语法:
一、普通变量的声明与使用
一共有两种声明变量的方法。
第一种:上面的例子已经使用过,即$smarty->assign('name','值');
第二种:在模板文件中声明(html中),即{assign var='name' value='值'}
使用:{$name}
注意:也能够定义与使用数组。倘若上面定义的name为一个一维数组,使用时即:{$name[2]}、{$name['aa']}={$name.aa}等等使用方式。
二、注释
{* 这里面是注释内容 *}
Smarty的注释是不会在最终页面输出显示的,即:若在html里则效果像<!--注释-->同样,不过也有必定的区别,Smarty的注释在浏览器里查看源代码也是不显示的,而html的注释是显示的。例如:
三、数组
Smarty对数组的使用:数组[下标]、数组.下标
四、对象
对象的声明和变量同样,经过assign来声明
使用采用 -> 来调用对象的属性
五、保留变量
Smarty中有一个特殊的变量(就是smarty)能够经过这个变量很容易就能够访问到一些环境变量。就像PHP中的超全局变量同样神奇。
注意:在使用这个保留变量的时候:smarty是对于大小写敏感的,咱们须要的是小写的smarty
例子:
1、使用smarty访问PHP中的超全局数组变量:
一、获取$_GET {$smarty.get.name} 获取get中的name值
二、获取$_POST {$smarty.post.name} 获取post中的name值
三、获取$_COOKIE {$smarty.cooke.name} 获取cookie中的name值
同理,还能够获取$_SERVER
, $_ENV
和 $_SESSION
等等
注意:虽然Smarty提供了较方便直接访问PHP超全局变量的方法,但必须谨慎使用。 直接访问超全局变量会弄乱应用程序底层代码和模板语法。 最佳的实践是从PHP将须要的变量对模板进行赋值再使用。
2、获取当前时间戳
{$smarty.now}其原理就是调用了timr()函数
3、直接访问PHP常量
{$smarty.const.常量名}即{$smarty.const.AGE}
PHP定义常量
smarty直接调用常量
结果
4、其余
获取配置变量:{$smarty.config}
返回当前模板名称:{$smarty.template}
返回当前模板对象:{$smarty.template_object}
返回当前目录名称:{$smarty.current_dir}
等等
六、配置文件
以前根据需求创建的Configs文件夹能够派上用处啦!咱们在这个文件夹下创建Smarty.conf配置文件(命名任意,木有明确规定),配置文件可让设计者将全局的模板变量以文件的方式管理起来。
首先咱们先来定义一些配置变量来对它进行简单的了解:
定义以下所示:
引入配置文件:{config_load file=’Smarty.conf’}
引用配置变量:{#配置变量#}、{$smarty.config.配置变量}
显示结果:
了解段落变量定义与引用:
在Smarty配置文件中大致分为两种变量,一种为全局变量,另外一种为段落变量。全局全局变量故名思议就是就是每次载入这个配置文件的时候这些变量都会被加载。而段落变量则有选择的进行加载。
段落变量的定义语法:
[段落名字]
段落名字:这里能够是任意字符但不包括’[‘和’]‘,具体定义看下面Smarty.conf
调用段落变量:在引入配置文件后面加上这段代码 section='段落名字'。
注意:section只能使用一次,如有多个section引入多个段落变量则最后一个会覆盖前面的全部section引入的段落变量,即只有最后一个引入的段落变量有用其余做废。
Smarty.conf文件
1 #这里是注释,#为注释符号 2 #这里是全局变量,也就是说title和bodyColor变量每次都会被加载 3 title='标题' 4 bodyColor='#eee' 5 6 #段落变量 7 [firstStyle] 8 color='#00f' 9 width='200px' 10 height='300px' 11 12 [.secondStyle] 13 color='#00f' 14 width='200px' 15 height='300px' 16 17 [other] 18 other='这是其余'
test1.html文件
1 {config_load file='Smarty.conf' section='firstStyle'} 2 <!DOCTYPE html> 3 <html> 4 <head> 5 <meta charset="utf-8"> 6 <title>smarty test1</title> 7 </head> 8 <body> 9 <!-- 这里是html注释 --> 10 {*这是Smarty注释*} 11 名字:{$jane->name }<br/> 12 性别:{$jane->sex}<br/> 13 年龄:{$jane->age} 14 <hr/> 15 常量年龄:{$smarty.const.AGE} 16 <hr/> 17 使用配置变量1:{#title#}<br/> 18 使用配置变量2:{$smarty.config.bodyColor} 19 <hr/> 20 段落变量加载:<br/> 21 {#color#} 22 <br/> 23 {#other#} 24 </body> 25 </html>
访问结果:
注意:
一、若全局变量与被加载的段落变量有相同的变量名,则段落名的值将覆盖全局变量的值。
二、若某个段落变量里含有相同的变量名,则最后一个的变量的值将会覆盖前面的值。
三、在整个smarty.conf文件中,点(.)拥有相对较高的权限的。点的做用是将一个变量或者整个段落隐藏,不能被使用。(个人理解就是至关于被注释掉不能被使用)
段落变量的一个简单应用:
倘若咱们要使一个网站能够在多种风格的界面转换,这时咱们使用段落变量就能够很容易就实现了。
test1.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>smarty test1</title> 6 <style type="text/css"> 7 #aa{width: 200px;height: 200px;background: red;} 8 </style> 9 </head> 10 <body> 11 <div id='aa'> 12 这是一个div 13 </div> 14 </body> 15 </html>
访问结果:
访问结果出现一个错误。因为使用了smarty模板,因此在html的全部{}将会被smarty解析。
解决方法:
一、更换定界符
二、在({)前面加一个空格,
三、使用{literal}{/literal} literal:原样的,原义的
简单应用,让一个div实现两种背景颜色:
test1.php
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $smarty->display('./test1.html');
Smarty.conf
1 #段落变量 2 #第一种颜色风格 3 [firstStyle] 4 color='#00f' 5 width='300px' 6 height='300px' 7 content='第一种风格' 8 9 #第二种颜色风格 10 [secondStyle] 11 color='#0f0' 12 width='500px' 13 height='500px' 14 content='第二种风格'
测试1:
test1.html
1 {config_load file='Smarty.conf' section='firstStyle'} 2 <!DOCTYPE html> 3 <html> 4 <head> 5 <meta charset="utf-8"> 6 <title>smarty test1</title> 7 <style type="text/css"> 8 #aa{ width: {#width#};height: {#height#};background: {#color#};} 9 </style> 10 </head> 11 <body> 12 <div id='aa'> 13 14 这是一个div<br/><br/> 15 {#content#} 16 </div> 17 </body>
结果:
测试2:
test2.html
1 {config_load file='Smarty.conf' section='secondStyle'} 2 <!DOCTYPE html> 3 <html> 4 <head> 5 <meta charset="utf-8"> 6 <title>smarty test1</title> 7 <style type="text/css"> 8 #aa{ width: {#width#};height: {#height#};background: {#color#};} 9 </style> 10 </head> 11 <body> 12 <div id='aa'> 13 14 这是一个div<br/><br/> 15 {#content#} 16 </div> 17 </body> 18 </html>
结果:
七、判断{if}{elseif}{else}
Smarty的{if}
条件判断和PHP的if很是类似,只是增长了一些特性。 每一个{if}
必须有一个配对的{/if}
. 也可使用{else}
和 {elseif}
. 所有的PHP条件表达式和函数均可以在if内使用,如||, or,&&, and, is_array(), 等等.
注意:若是开启了安全机制,那么只有在$php_functions设置容许的php函数才可以使用。
运算符表:
八、for
{for}{forelse}用于建立简单的循环
{forelse}在循环不能遍历的时候使用
例子:
九、while
Smarty的while循环和PHP中的while循环是几乎同样的,smarty中须要在后面增长</while>来结束
例子:
结果:
十、{section}{sectionelse}
能够循环遍历连续数字索引的数组,不能循环关联数组
基本使用:
访问结果:
不使用赋值数组直接输出:
结果:
遍历关联数组:
结果:
Section还有不少关键字强大的功能尚未一一列出来,具体能够参考smarty手册。Foreach相对于section来讲显得更增强大,能用section作到的,foreach也能作到,而且foreach使用起来更加方便简单,接下来咱们来学习了解foreach。
十一、foreache与foreachelse
经过类比的方法能够知道foreache是用来循环数组的。若是不存在遍历的数组则执行{foreachelse}部分
注意:这里不存在的数组指的是定义后这个数组没有数据。倘若这个数组没有定义,则会发出警告。
简单例子:
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $arr=array('name'=>'小明','sex'=>'男','age'=>'18'); 5 $smarty->assign( 'arr' , $arr ); 6 $smarty->assign('arr0',array()); 7 $smarty->display('./test1.html');
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>smarty test1</title> 6 </head> 7 <body> 8 {foreach $arr as $k=>$v} 9 {$k}=>{$v}<br/> 10 {foreachelse} 11 99999 12 {/foreach} 13 <hr/> 14 {foreach $arr0 as $k=>$v} 15 {$k}=>{$v}<br/> 16 {foreachelse} 17 此处输出foreachelse,无数据 18 {/foreach} 19 </body> 20 </html>
访问结果:
在smarty中使用foreach和咱们在PHP中的foreach循环几乎是同样的,就是书写的方式不同,但形式上是同样的!
foreach具备一些内部关键字:
一、@iteration,当前循环次数,从1开始
二、@index,表示当前索引,从零开始
三、@first当前是首次循环是,first为true
四、@last循环最后一次时,last为true
五、@show,是在{foreach}循环执行后,,检测循环是否有输出,show是一个布尔值
六、@total,{foreach}的循环次数,total能够在{foreach}
内部,或者以后使用
七、{break},中止循环
八、{continue},跳出这次循环
例子:
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $arr=array('name'=>'狗蛋','sex'=>'男','age'=>'18','from'=>'广东','tel'=>'123456789'); 5 $smarty->assign( 'arr' , $arr); 6 $smarty->display('./test1.html');
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>smarty test1</title> 6 </head> 7 <body> 8 {foreach $arr as $k=>$v} 9 10 11 {if $v@iteration==2} 12 <b>{$k}=>{$v}</b>---这里iteration,从1开始计算<br/> 13 {continue} 14 {/if} 15 16 {if $v@index==2} 17 <b>{$k}=>{$v}</b>---这里index,从0开始计算<br/> 18 {continue} 19 {/if} 20 21 {if $v@first} 22 <b>{$k}=>{$v}</b>---这里first,数组第一个元素<br/> 23 {continue} 24 {/if} 25 26 {if $v@last} 27 <b>{$k}=>{$v}</b>---这里last,数组最后一个元素<br/> 28 {break} 29 break将已经跳出去了,不能在输出这里的内容了【这个例子跳出整个循环的如今不可以检验,读者可本身进行测试】 30 {/if} 31 32 {$k}=>{$v}<br/> 33 34 {/foreach} 35 <hr/> 36 总循环次数:{$v@total} 37 {if $v@show} 38 <hr/> 39 判断上面循环有输出<br/> 40 {/if} 41 42 </body> 43 </html>
访问结果:
十二、自定义函数
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手册。
1三、模板布局
便是模板的继承问题。使用的关键字主要有block、extends
首先,咱们先在站点创建一个layout文件夹(主要用来存放父模板文件),而后在文件夹下创建一个模板文件template.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>这个是模板文件</title> 6 </head> 7 <body> 8 <h2>这个是模板文件输出的</h2> 9 10 <hr/> 11 子输出一:{block name='first'}{/block} 12 <hr/> 13 <hr/> 14 子输出二:{block name='second'}{/block} 15 <hr/> 16 17 <h2>这个是模板文件输出的</h2> 18 </body> 19 </html>
接着再创建模板文件test.html,此模板须要继承上面的父模板
1 {extends file='layout/template.html'} 2 {block name='first'} 3 这里是test中的first 4 {/block} 5 {block name='second'} 6 这里是test中的second 7 {/block}
逻辑文件调用smarty,test.php
1 <?php 2 require './libs/Smarty.class.php'; 3 $smarty=new Smarty(); 4 $smarty->display('./test.html');
访问结果:
小结:若含较多的公共部分,则采用布局文件;含公共部分较少,则采用包含文件{include file='文件路径'}