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的基本使用与总结的更多相关文章

  1. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  2. smarty使用

    smarty-牛刀小试 smarty 初识 官网 http://www.smarty.net/ Smarty is a template engine for PHP(PHP模板引擎) smarty使 ...

  3. Smarty模版引擎的原理

    Smarty是一个使用php写出来的模版引擎,用来将原本与html代码混杂在一起PHP代码逻辑分离,实现前后端分离. Smarty模板优点: 1. 速度:采用Smarty编写的程序可以获得最大速度的提 ...

  4. 12月15日下午Smarty模板函数

    1.{$var=...} 这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值. <{$a = 10}><!--赋值语句--> <{$a}> ...

  5. 12月15日smarty模板基本语法

    smarty基本语法: 1.注释:<{* this is a comment *}>,注意左右分隔符的写法,要和自己定义的一致. <{* I am a Smarty comment, ...

  6. 12月13日上午Smarty模版原理

    模板主要是用来让前端和后端分离的,前台页面只是一个前台页面,后台页面用php代码写逻辑,写完逻辑拿到前台显示. 一.写法 一般需要以下:写3个页面: 1.显示页面aa.html <!DOCTYP ...

  7. SMARTY模板中如何使用get,post,request,cookies,session,server变量

    {$smarty}保留变量不需要从PHP脚本中分配,是可以在模板中直接访问的数组类型变量,通常被用于访问一些特殊的模板变量.例如,直接在模板中访问页面请求变量.获取访问模板时的时间戳.直接访问PHP中 ...

  8. 在新浪云SAE中使用smarty引擎模版

    在新浪云上使用smarty时会发现又这样的错误信息: “SAE_Fatal_error: Uncaught exception 'SmartyException' with message 'unab ...

  9. MVC架构学习之Smarty学习——病来而蔫

    前两天是五一小长假,而每次假期都想着如何如何刻苦一番,往往是自作多情.. 当然这次是有小病在身,多个借口吧. 一有病就蔫的不行...要锻炼了啊,脚估计也差不多了,游泳试试吧这周. 这次学习Smarty ...

随机推荐

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧

    这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...

  3. 如何创建Vim Dotfile?

    Dotfile是电脑系统里的隐藏文件,它是专门给更高级的用户,如开发者.程序员或工程师使用的,让他们用来调整系统.如何创建Vim-Dotfile? 可以参考以下步骤: 1. 首先,你要检查一下.vim ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(69)-微信公众平台开发-功能概述

    系列目录 为什么要先发这个文章? 因为接下来的文章是关于微信开发的系列,心中一定要有一个概念,知道自己接下来要做什么功能. 而且微信到处都是坑,我首先要把微信与本地跑通起来才敢发布,否则中间出现坑导致 ...

  5. 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。

    前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...

  6. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  7. 从netty-example分析Netty组件

    分析netty从源码开始 准备工作: 1.下载源代码:https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程. netty提 ...

  8. Android实现TCP断点上传,后台C#服务实现接收

    终端实现大文件上传一直都是比较难的技术,其中涉及到后端与前端的交互,稳定性和流量大小,而且实现原理每个人都有自己的想法,后端主流用的比较多的是Http来实现,因为大多实现过断点下载.但稳定性不能保证, ...

  9. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  10. .Net语言 APP开发平台——Smobiler学习日志:手机应用的TextTabBar快速实现方式

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...