欢迎访问服务百科信息网!
首页 >科技 >Smarty
Smarty

Smarty

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

    PHP模板

    如何使PHP脚本从设计中独立出来?这是在PHP邮件列表上所提问的最多的问题之一。虽然PHP被标榜为“HTML嵌入式语言”,在写过许多PHP和HTML混合式的工程之后,一个分离表单和内容的想法产生了。而且,在许多公司里规划设计者的角色和程序设计者是分开的。于是,这样的一个模板解决方案产生了……

    例如在一个公司,一个应用程序的开发流程如下:在提交计划文档之后,界面设计者[美工]制作了网站的外观模型,然后把它交给后台程序员。程序员使用PHP实现商业逻辑,同时使用外观模型做成基本架构。然后工程被返回到HTML页面设计者继续完善。就这样工程可能在后台程序员和页面设计者之间来来回回好几次。由于后台程序员不喜欢干预任何有关HTML标签,同时也不需要美工们和PHP代码混在一起;美工设计者只需要配置文件,动态区块和其他的界面部分,不必要去接触那些错综复杂的PHP代码。因此,这时候有一个很好的模板支持就显得很重要了。

    纵观现今存在的许多PHP模板解决方案(比如PHPLIB),大多数都只是提供了用模板取代变量和将动态区块的功能有限的格式化的基本方法。但是我们的需求比这个要高的多。我们完全不想要PHP程序员去设计HTML页面,可是这又是不可避免的。例如:如果美工想要在动态区块之间交替不同的背景颜色,他就可能得和程序员预先说好。同样,美工们也应该有自己对于页面设计的配置文件,这同样可以通过变量把他们拉到模板里边去

    优点

    1. 速度:采用Smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。

    2. 编译型:采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下)

    3. 缓存技术:Smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。

    4. 插件技术:Smarty可以自定义插件。插件实际就是一些自定义的函数。

    5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。

    不适合使用Smarty的地方

    需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,这类型的程序使用smarty会使模板处理速度变慢。

    小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用Smarty会在一定程度上丧失PHP开发迅速的优点。

    (PS:不过为了整个项目的规范,请大家尝试去使用模板引擎。其实习惯了,开发速度会更加快,以上是没有用习惯模板引擎的开发者遇到的问题)

    诞生过程

    早在1999年后期,就已经开始为模板引擎写说明文档。在完成这个文档之后,开始尝试用C写一个模板引擎,并有希望被包含到PHP里去。在撞上了许多的技术难题的同时,“什么是模板应该做的,什么不该做”这个问题,也被热烈的讨论着。从这些经验决定应该用PHP将模板引擎写成一个类,让任何觉得合适的人使用它。所以就有了Smarty。(注:这个类从来没有公开发表过)。这个类几乎达到了我们所有的要求:常规变量替换,支持引用其他模板,使用配置文件集成设置,嵌入PHP代码,限制'if'语句的作用,还有更多的可以多层嵌套的健壮的动态区块。它用正则表达式做到这一切,于是代码变得相当令人费解。在每次调用的时候,都要去解析那些语法和正则表达式,于是在大型应用的时候,它显然慢了下来。在程序员的眼光看来,最大的问题还是使用PHP脚本建立和处理模板和动态区块的所有必要工作。我们应该如何使它变得更简单?

    我们可以想象Smarty应该有怎样的最后表现。我们知道PHP代码如果没有了模板解析的开销将有多快,我们也知道从一般的美工看来PHP语言是多么的“恐怖”,然而这一切可以被一种更简单的模板语法掩饰掉。我们应该怎样把这两种方法的长处结合起来?

    于是,Smarty诞生了……

    简明教程

    一. 安装

    下载最新版本的Smarty。解压下载的文件。

    接下来演示给大家一个安装实例,看过应该会举一反三的。

    (1) 在根目录下建立了新的目录learn/,再在learn/里建立一个目录smarty/。将刚才解压缩出来的目录的libs/拷贝到smarty/里,再在smarty/里新建templates目录,templates里新建cache/,templates/,templates_c/, config/。

    (2) 新建一个模板文件:index.tpl,将此文件放在learn/smarty/templates/templates目录下,代码如下:

    DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"此处DOCTYPE

    声明不全,下午纠结了好一会,终于看到了,新手朋友们关注下">

    Smarty

    {#$hello#}

    新建index.php,将此文件放在learn/下:

    require 'smarty/libs/Smarty.class.php';

    $smarty = new Smarty();//设置各个目录的路径,这里是安装的重点

    $smarty->template_dir ="smarty/templates/templates";

    $smarty->compile_dir ="smarty/templates/templates_c";

    $smarty->config_dir = "smarty/templates/config";

    $smarty->cache_dir ="smarty/templates/cache";

    //smarty模板有高速缓存的功能,如果这里是true的话即打开caching,但是会造成网页不立即更新的问题,当然也可以通过其他的办法解决

    $smarty->caching = false;

    $smarty->left_delimiter = "{#"; //重新定义边界,因为默认边界“{}“符,在html页面中嵌入js脚本文件编写代码段时使用的就是”{}“符,自定义边界符还可以是<{ }>, {/ /} 等

    $smarty->right_delimiter = "#}";

    $hello = "Hello World!";//赋值

    $smarty->assign("hello",$hello);//引用模板文件

    $smarty->display('index.tpl');?>

    (3) 执行index.php就能看到Hello World!了。

    二. 赋值

    在模板文件中需要替换的值用大括号{}括起来,值的前面还要加$号。例如{$hello}。这里可以是数组,比如{$hello.item1},{$hello.item2}…

    而PHP源文件中只需要一个简单的函数assign(var , value)。

    简单的例子:

    *.tpl:

    *.php:

    $hello[name]= “Mr. Green”;

    $hello[time]=”morning”;

    $smarty->assign(“exp”,$hello);

    output:

    Hello,Mr.Green!Good morning

    三. 引用

    网站中的网页一般header和footer是可以共用的,所以只要在每个tpl中引用它们就可以了。

    示例:*.tpl:

    {include file="header.tpl"}

    {* body of template goes here *}

    {include file="footer.tpl"}

    判断

    模板文件中可以使用if else等判断语句,即可以将一些逻辑程序放在模板里。"eq","ne", "neq", "gt", "lt","lte", "le", "gte" "ge","is even", "is odd", "is not even", "is notodd", "not", "mod", "div by", "evenby", "odd by","==","!=",">","<","<=",">="这些是if中可以用到的比较。看看就能知道什么意思吧。

    eq相等,

    ne、neq不相等,

    gt大于,

    lt小于,

    gte、ge大于等于,

    lte、le 小于等于,

    not非, mod求模。

    is [not] div by是否能被某数整除

    ,B z M E m I w0 is [not] even是否为偶数,

    $a is [not] even by $b即($a / $b) % 2 == 0,

    is [not] odd是否为奇,

    $a is not odd by $b即($a / $b) % 2 != 0

    示例:

    {if $name eq "Fred"}

    WelcomeSir.

    {elseif $name eq "Wilma"}

    WelcomeMa'am.

    {else}

    Welcome,whatever you are.

    {/if}

    循环

    在Smarty里使用循环遍历数组的方法是section,如何赋值遍历都是在模板中解决,php源文件中只要一个assign就能解决问题。

    示例:

    {* this examplewill print out all the values of the $custid array *}

    {section name=‘customer’ loop=$custid}

    id: {$custid[customer]}

    {/section}

    OUTPUT:

    id: 1000
    id: 1001
    id: 1002

    Smarty还可以使用类似PHP的foreach来进行遍历,在最新版本的Smarty里的语法与PHP更相似。

    示例:

    {foreach item='article' from=$art} //{foreach $art as $item}

    {$article.title}

    {$article.author}

    {$article.content}

    {/foreach}

    常见问题

    Smarty将所有大括号{}里的东西都视为自己的逻辑程序,于是我们在网页中想插入javascript函数就需要literal的帮忙了,literal的功能就是忽略大括号{}。

    示例:

    {literal}

    {/literal}

    解释程序

    我们可以看到,smarty的程序部分实际就是符合php语言规范的一组代码,我们依次来解释一下:

    1:/**/语句:

    包含的部分为程序篇头注释。主要的内容应该为对程序的作用,版权与作者及编写时间做一个简单的介绍,这在smarty中不是必需的,但从程序的风格来讲,这是一个好的风格。

    2:include_once语句:

    它将安装到网站的smarty文件包含到当前文件中,注意包含的路径一定要写正确。

    3:$smarty = new Smarty():

    这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。

    4:$smarty->templates(""):

    这一句指明$smarty对象使用tpl模板时的路径,它是一个目录,在没有这一句时,Smarty默认的模板路径为当前目录的templates目录,实际在写程序时,我们要将这一句写明,这也是一种好的程序风格。

    5:$smarty->templates_c(""):

    这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言,而这个目录,就是它编译模板的目录,要注意,如果站点位于linux服务器上,请确保

    teamplates_c里定义的这个目录具有可写可读权限,默认情况下它的编译目录是当前目录下的templates_c,出于同样的理由我们将其明确的写出来。

    6:$smarty->left_delimiter与$smarty->right_delimiter:

    指明在查找模板变量时的左右分割符。默认情况下为"{"与"}",但在实际中因为我们要在模板中使用