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='文件路径'}
(以上是自己的一些见解,若有不足或者错误的地方请各位指出)
作者:那一叶随风
声明:本博客文章为原创,只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接。