视图引擎Smarty的简单使用

来源:互联网 发布:迈阿密热线知乎 编辑:程序博客网 时间:2024/06/06 14:17

参考: http://www.jb51.net/article/5091.htm

参考:http://baike.baidu.com/link?url=FFySw2r-dsE-lTdQgGy2DpLhciXM-JqUagEIydE_aFY3rGMnlYrf4eOOWw-fK-MFNFMp8v7ddMOrmlnIHTlP4K

其中还包含来自对慕课网的学习。

       

       什么是模版引擎 
   
 不知道从什么时候开始,有人开始对 HTML 内嵌入 Server Script 觉得不太满意。然而不论是微软的 ASP 或是开放源码的 PHP,都是属于内嵌 Server Script 的网页伺服端语言。因此也就有人想到,如果能把程序应用逻辑 (或称商业应用逻辑) 与网页呈现 (Layout) 逻辑分离的话,是不是会比较好呢? 
   
 其实这个问题早就存在已久,从交互式网页开始风行时,不论是 ASP 或是 PHP 的使用者都是身兼程序开发者与视觉设计师两种身份。可是通常这些使用者不是程序强就是美工强,如果要两者同时兼顾,那可得死掉不少脑细胞... 
   
 所以模版引擎就应运而生啦!模版引擎的目的,就是要达到上述提到的逻辑分离的功能。它能让程序开发者专注于资料的控制或是功能的达成;而视觉设计师则可专注于网页排版,让网页看起来更具有专业感!因此模版引擎很适合公司的网站开发团队使用,使每个人都能发挥其专长! 

       

       Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。


下面记录一下关于Smarty的基础使用:

1、安装Smarty

首先从Smarty官网下载:http://www.smarty.net/

然后解压出来,并且文件目录结构,修改为如下:(方面使用而已)


可以将其他不用的文件删除。

2、配置Smarty并进行简单使用

       下面我们创建如下类似目录结构(这要包括cache Smarty的缓存目录、template_c Smarty的编译结果目录、tpl Smarty的视图模板目录 —— 这配置Smarty的过程中会引用这些目录)

 

       在 test.php 文件中 配置Smarty:(记得先导入Smarty的主文件 Smarty.class.php)

<?php require('../smarty-3.1.29/libs/Smarty.class.php');$smarty = new Smarty();//Smarty的口诀“五配置方法”//五配置的介绍$smarty->left_delimiter = "{"; //左定界符$smarty->right_delimiter = "}"; //右定界符$smarty->template_dir = "tpl"; //html模板的地址            //要把对应的目录创建好$smarty->compile_dir = "template_c"; //模板编译生成的文件$smarty->cache_dir = "cache"; //缓存//以下是开启缓存的另两个配置。因为通常不用smarty的缓存机制,所以此项为了解。$smarty->caching = true; //开启缓存$smarty->cache_lifetime = 120; //缓存时间//在smarty模板变量的赋值$smarty->assign('articletitle', '文章标题'); //注册到smarty模板里面去(变量名,变量值)//展示编写好的模板,该函数能对模板进行编译和展示$smarty->display('test.tpl');?>
       通过 $smarty->assign('articletitle', '文章标题'); 将变量articletitle注册到Smarty模板。并且使用视图 test.tpl (当然后缀名可以为 .html,实际上网页开发也是用 .html)。

       test.tpl(在tpl目录下创建)

{$articletitle} <br/>
       这样我们就能使用刚注册到Smarty模板的变量 articletitle 了。

       访问过程为:执行test.php文件,创建Smarty对象,配置Smarty,将变量articletitle 注册到Smarty,选择视图进行显示(Smarty会对视图进行编译将视图中以{}为定界符包起来的变量解析为变量的值,然后显示在页面)。这样实现了界面层与逻辑层的分离。逻辑层通过注册数据到Smarty,通过控制显示对应的界面,界面就可以使用逻辑层返回的数据进行显示。

3、Smarty变量的访问

3.1、访问一维数组

$arr = array('title'=>'smarty的学习', 'author' => '小明');$smarty->assign('arr', $arr);

在视图中(下面这两种方式都可以正常访问):

{$arr.title} {$arr.author} <br/>{$arr['title']} {$arr['author']} <br/>


3.2、访问二维数组

$arr2 = array('articlecontent'=>array('title'=>'smarty的学习', 'author' => '小明'));$smarty->assign('arr2', $arr2);
在视图中:

{$arr2['articlecontent']['title']} {$arr2['articlecontent']['author']} <br />


3.3、访问对象

class My_Object {function meth1($params) {return $params[0].'已经'.$params[1];}}$myobj = new My_Object();$smarty->assign("myobj",$myobj);
在视图中:

输出对象{$myobj->meth1(array('苹果','熟了'))}<br /><br />

3.4、访问php其他数据类型

       访问php其他数据类型,与在php中使用访问类似,这里就不再给出案例。

(注:对于变量的访问,可以将访问变量的语句嵌套在 html 代码中)

4、条件判断

4.1、基本句式(视图中使用(或者说是html界面))

{if $name eq "a1"}Welcome Sir.{elseif $name eq "a2"}Welcome Ma'am.{else}Welcome, whatever you are.{/if}
4.2、条件修饰符有很多,简单的有:eq(==)   neq(!=)  gt(>)  lt(<)

4.3、修饰词时必须和变量或常量用空格开

5、Smarty的循环

5.1、section

section、sectionelse 功能多,参数多。是Smarty用来做循环操作的函数之一。

基本属性有name和loop

       除了name和loop属性外,还有以下属性

start   循环执行的初始位置。如果该值为负数,开始位置从数组的尾部算起。例如:如果数组中有7个元素,指定start为-2,那么指向当前数组的索引为5.非法值(超过了循环数组的下限)将被自动调整为最接近的合法值。

step    该值决定循环的步长。例如指定step = 2将只遍历下标为0、2、4等元素。如果step为负值,那么遍历数组的时候从后向前遍历。

max   设定循环最大执行次数。

show    决定是否显示该循环。

案例:

test.php中

//在smarty模板变量的赋值$articlelist = array(array("title" => "第一篇文章","author" => "小王","content" => "第一篇文章该写点啥呢"),array("title" => "第二篇文章","author" => "小李","content" => "又写了一篇不知所云的文章"));$smarty->assign("articlelist", $articlelist);
视图中:

<!-- section 在smarty中函数的一种,函数以</函数名>结尾 -->section循环<br />{section name = article loop = $articlelist max=1}{$articlelist[article].title}{$articlelist[article].author}{$articlelist[article].content}<br />{/section}<br />
5.2、foreach循环(与PHP中的foreach类似)

视图中:

foreach循环<br />{foreach item = article from = $articlelist}{$article.title}{$article.author}{$article.content}<br />{foreachelse} <!-- 当数组为空是 显示下面的这句话-->当前没有文章{/foreach}<br />foreach循环——PHP形式<br />{foreach $articlelist as $article}{$article.title}{$article.author}{$article.content}<br />{foreachelse}当前没有文章{/foreach}<br />
建议使用类似PHP形式的foreach循环,便于记忆使用。

6、Smarty模板的引用

       将其他模板引入到当前模板:使用include

在当前模板中使用,例如:

创建入口文件 test03.php

<?php require('../smarty-3.1.29/libs/Smarty.class.php');$smarty = new Smarty();//Smarty的自编口诀“五配置方法”//五配置的介绍$smarty->left_delimiter = "{"; //左定界符$smarty->right_delimiter = "}"; //右定界符$smarty->template_dir = "tpl"; //html模板的地址            //要把对应的目录创建好$smarty->compile_dir = "template_c"; //模板编译生成的文件$smarty->cache_dir = "cache"; //缓存//以下是开启缓存的另两个配置。因为通常不用smarty的缓存机制,所以此项为了解。$smarty->caching = true; //开启缓存$smarty->cache_lifetime = 120; //缓存时间//展示编写好的模板,该函数能对模板进行编译和展示$smarty->display('test03.tpl');?>

创建当前模板 test03.tpl

{include file="header.tpl" sitename="哈哈"} <!-- include还有其他属性(包括 sitename),其他属性的名称可以自定义,它的值可以传给引入的模板--> <!-- 这些自定义的属性仅仅只能在引入的文件中使用,如sitename属性只能在header.tpl中使用-->
其中被引入的模板为 header.tpl,属性sitename是自定义的,可以按照PHP的命名方式进行命名。表示传递到被引入的模板的变量,可以在被引入的模板中使用该变量。

       header.tpl

头文件——{$sitename}

7、变量调节器

7.1、首字母大写 capitalize

如:{$articleTitle|capitalize}

7.2、字符串连接 cat
如:{$articleTitle|cat:" aaaa"}

7.3、日期格式化 date_format

如:{$yesterday|date_format}

      {$yesterday|date_format:" :"%A, %B %e, %Y %H:%M:%S"}

7.4、为未赋值或为空的变量指定默认值default

如:{$articleTitle|default:"no title"}

7.5、转码escape

       用于html转码,url转码,在没有转码的变量上转换单引号,十六进制转码,十六进制美化,或者javascript转码。默认是html转码。

7.6、小写lower 大写upper

将变量字符串小(大)写

如:{$articleTitle|lower}   {$articleTitle|upper}

7.7、所有的换行符将被替换成<br/>nl2br功能同PHP中nl2br()函数一样

如:{$articleTitle|nl2br}

7.8、其他函数

可以参见手册,原则上应该通过php直接处理完再赋值到smarty变量里,少用smarty函数。


8、使用php内置函数

基本格式为: {参数1|php内置函数名:参数2:参数3:...}

案例如下:

$smarty->assign('time',time());$smarty->assign('str', 'abcdefg');
视图中:

Smarty函数的使用(使用PHP的内置函数)date -1<br />在Smarty中函数的调用 | 函数名 ,其中“|”前为函数的第一个参数,函数名后为函数的第二个参数<br />而在php中的date函数,第一个参数为时间戳,第二个参数为时间的格式。所以在使用下面的写法<br />{"Y-m-d"|date:$time} <br />Smarty函数的使用(使用PHP的内置函数)str_replace -2<br /><!-- 在php中的使用 str_replace('d','h',$str) -->{'d'|str_replace:'h':$str} <br />
9、自定义Smarty函数

案例:

//自定义函数function test($params) {/*print_r($params);exit;*/$p1 = $params['p1'];$p2 = $params['p2'];return '传入的参数1值为'.$p1.',传入的参数2值为'.$p2;}$smarty->registerPlugin('function', 'f_test', 'test');
这样就可以在视图中使用test函数了,如下:

Smarty函数的使用——自定义函数 -3{f_test p1='abc' p2='edf'} <!-- p1 p2 参数(或者称为属性)会打包成数组发送给f_test函数-->
10、Smarty插件的学习

10.1、什么是Smarty插件:

       Smarty的插件本质上是function函数

10.2、Smarty插件常用类型:

       functions 函数插件

       modifiers  修饰插件

       block functions 区块函数插件

10.3、如何来制作、使用插件:

(1)使用registerPlugin方法注册写好的自定义的函数

(2)将写好的插件放入Smarty解压目录中lib目录下的plugins目录里

(3)php的内置函数,可以自动以修饰插件(变量调节器插件)的形式在模板里使用

具体实现:略。



0 0