首页 > PHP > Smarty 入手

Smarty 入手

2009年04月04号
查看评论 发表评论 1,301次浏览

使用模板化主要有两个原因:1、可以使用同样的代码基为不同的目标生成数据。2、应用程序设计人员(负责创建和维护界面的人)可以与应用程序 开发人员独立工作,因为用表现和逻辑并非密不可分地纠缠在一起。但模板化引擎如何完成这种分离?有趣的是,大多数实现的做法与编程语言非常相似,为完成各 种与界面有关的任务提供了良好的定义的语法和命令集。

Smarty提供了很多强大的功能。
1、强大的表现逻辑
2、模板编译
3、缓存
4、高度可配置和可扩展
5、安全
如何使用Smarty?
使用Smarty与使用其它任何类库一样。对于初学者,只需要在执行脚本中使Smarty类库可用。实现这一点非常容易,使用 require() 语句即可:
require(“Smarty.class.php”);
之后,就可以实例化Smarty类:
$smarty = new Smarty;
现在,就可以用Smarty来做东西了。下面看看一个小例子:
以下是模板文件 index.tpl :
<html>
<head>
<title>{$title}</title>
</head>
<body bgcolor=”#ffffff” text=”#000000″ link=”#0000ff” vlink=”#800080″ alink=”#ff0000″>
<p>
Hi,{$name}.Welcome to the wonderful world of Smarty.
</p>
</body>
</html>
以下是PHP页面方面代码 index.php:
<?php
require(‘Smarty.class.php’);
$smarty = new Smarty;
$smarty->assign(“name”,”JiangZone”);
$smarty->assign(“title”,”Jiang’s Blog”);

$smarty->display(“index.tpl”);
?>
从以上两段代码可以看得到,index.tpl文件是页面文件,没有业务逻辑代码,只有{$name},{$title},初学者可能觉得怪,不过如果有 Java基础的话,应该看得出,它跟Jsp的EL表达式有点类似,或者跟标签库功能有点像。这样看上去,页面跟程序逻辑就分开来了,设计师专注于他的页面 设计,需要放入处理后的值的话,就加上个{$name}等标记,而程序员则专注于程序逻辑的实现,将处理结果放到模板页面那里相应的变量位置。明眼人可能 很快看得出,上面PHP代码里,
$smarty-&gt;assign(“name”,”JiangZone”);
就是一个对模板赋值的过程,意为为模板 中的变量$name 的值设为字符串”JiangZone”,下面的也是一样,而最后那句,
$smarty->display(“index.tpl”)
则是将上面设 置好的值应用到index.tpl模板上,并将应用后的结果输出到客户端。
Smarty 的表现逻辑
前面只简单的讲述了Smarty里的基本原理,也就传几个变量的值而已,而本节中,将会讲述Smarty的逻辑表示结构,比如它的分支,修饰符,迭代等结构的表达。
(1) 注释:
中Smarty中,也可以使用注释,设计人员可以用注释在模板页面中传递一些说明信息等。在Smarty中的注释为:{* Hello Jiang! *},大家可以看到,Smarty中的注释是用{**}来包围的,可以单行,也可以多行,比如可以这样写:
{* Hello
Jiang! *}
(2)变量修饰符:
在Smarty中,可以为变量添加修饰符,用于对变量进行一些Smarty已定义好的操作,变量修饰符的写法是:
{$var|modifier}
其中,$var 是变量,modifier 是修饰符的单词,意为对指定变量进行某种修饰操作。
1、capitalize 修饰符
capitalize 修饰符用于对变量内的值中所有单词的首字母变为大写,可看示例:
$smarty = new Smarty;
$smarty-&gt;assign(“$title”,”hello jiang zone”);
$smarty-&gt;display(“index.tpl”);
index.tpl 内容为:
{$title|capitalize}
2、count_words
count_words 函数统计变量中的单词总数
3、date_format
date_format 函数是PHP strftime() 函数的包装器,它能将可以被strftime()解析的任何日期/时间格式字符串转换为某种特殊格式。
4、default
default 函数当应用层没有返回值时,default为指示特定变量的默认值提供了一种简单的方式。
5、strip_tags
strip_tags 函数删除变量字符串中的标签符号。如:
$smarty->assign(“name”,”<b>Jiang</b>”);
模板里这样写:{$name|strip_tags}
会输入如下name的值:”Jiang”,它将<b></b>删除了。所以,没有输出粗体
6、truncate
truncate 函数将变量字符串截取为指定数量的字符。]
(3)控制结构
1、if-elseif-else
Smarty 的if语句与PHP语言中的if语句相同,与PHP一样,可以使用一些条件限定符如下:
eq gt gte ge
lt lte le ne
neq is even is not even is odd
is not odd div by event by not
mod odd by == !=
> < <= >=
示例:
{if $var > 5}
<p>Hello JiangZone</p>
{/if}
2、foreach
foreach 标记的作用与PHP语句中的命令相同。但如下所示,其语法大不相同。它有4个参数,其中两个是必要的:
form : 这个必要参数指定目标数组的名。
item : 这个必要参数指定当前元素的名。
key : 这个可选参数指定当前键的名。
name : 这个可选参数指定节的名。这个名是任意的,应当设置为一个描述性的名字。
看看如下例子:
require(“Smarty.class.php”);
$smarty = new Smarty;
$daysofweek = array(“Mon”,”Tues”,”Weds”,”Thu”,”Fri”,”Sat”,”Sun”);
$smarty-&gt;assign(“daysofweek”,$daysofweek);
$smarty-&gt;display(“daysofweek.tpl”);
以下是daysofweek.tpl模板文件:
{foreach from=$daysofweek item=$day}
{$day}<br />
{/foreach}
3、foreachelse
foreachelse 标记与 foreach 一起使用,与用于字符串的 default 标记作用类似,数组为空时 foreachelse 标记可以生成某个候选结果。以下是一个使用 foreachelse 的模板示例:
{foreach key=key item=item from=$titles}
{$key}: {$item}<br />
{foreachelse}
<p>No states matching your query were found.</p>
{/foreach}
注意,foreachelse 不使用结束括号:它嵌入到foreach中,这与elseif嵌入到if语句中很类似。
(4)语句
Smarty 提供了几个用于完成特殊任务的语句。
1、include
include语句与PHP包中的同名语句相同,只是它只用于将其它模板导入到当前模板。例如,假设希望在Smarty模板中导入两个文件,header.tpl 和 footer.tpl ,可以如下完成:
{include file=”header.tpl”}
{include file=”footer.tpl”}
2、insert
insert 标记与 include 标记的功能相同,只是它要导入不会被缓存的数据。例如,可以使用这个函数插入经常更新的数据,如股票价格,天气预报或其它在很短时间内就要改变的内容。它也接受几个参数,一个是必要的,另外三个是可选的:
name : 这个必要参数确定insert函数的名。
assign : 这个可选参数可用于将输出给变量,而不是直接发送到输出。
script : 这个可选参数可以指向在导入文件前直接执行的一个PHP脚本。当输出文件的内容依赖于脚本所完成的某个特定动作时,可以使用此参数。例如,可以执行一个PHP脚本,返回某个默认的股票价格放在不可缓存的输出中。
var : 这个可选参数用于传入所有插入模板使用的其它参数。可以通过这种方式传递很多参数。
3、literal
literal 标记告诉Smarty :标记中嵌入的任何数据都应当原样输出,不需要转换。这个标记量常用于在模板中嵌入JavaScript 和CSS ,从而不需要担心与 Smarty 的定界符冲突。
4、php
可以使用php函数在模板中嵌入PHP代码。{php}{/php}标记中的任何代码都由PHP引擎处理。
Smarty 的配置文件
开发人员一直使用配置文件来存储确定应用程序行为和操作的数据。例如,php.ini 文件负责确定PHP的大量行为。对于Smarty ,模板设计人员也可以利用配置文件的强大作用。例如,设计人员可以使用配置文件存储页面标题、用户消息以及有必要集中存储的任何信息。
以下是一个示例配置文件 (名为 app.config):
#Global Variables
appName = “PMNP News Service”
copyright = “Copyright 2005 PMNP News Service, Inc.”
[Aggregation]
title = “Recent News”
warning = “Copyright warning.Use of this information is for personal use only.”
[Detail]
title = “A Closer Look…”
中括号中包围的项称为节(section)。节之外的项都认为是全局的。这此项应当在定义任何节之前定义。
下面将展示如何使用config_load 函数来加载配置文件,还会解释如何在模板中引用配置变量。
配置文件存储在 configs 目录中,并使用Smarty函数 config_load 加载。下面是加载配置文件 app.config 的示例:
{config_load file=”app.config”}
但是要记住,此调用只能加载配置文件的全局变量。如果要加载特定的节,需要使用 section 属性指定。所以,可以使用以下语法加载 app.config 的节 Aggregation:
{config_load file=”app.config” section=”Aggregation”}

页面: 1 2

类别PHP 标签
  1. nhl pittsburgh penguins jerseys
    发表于 2010年06月13号 17时12分40秒 | 1楼

    Haha! Cute post. Very interesting…

  2. nike basketball shoes
    发表于 2010年06月13号 17时32分07秒 | 2楼

    I was just scanning this posting and was reminded of what I once read.

  3. mike jenkins dallas jersey
    发表于 2010年06月17号 11时57分23秒 | 3楼

    Hmmmm… I think he answers this question clearly!

  4. LV handbags
    发表于 2010年06月18号 06时45分31秒 | 4楼

    Thanks online editor. We love it.

  5. rolex oyster watch
    发表于 2010年06月20号 08时58分25秒 | 5楼

    I complitely agree with you..Thank you for bringing it up!

  6. jimmy choo handbags
    发表于 2010年06月22号 17时17分43秒 | 6楼

    beautiful story… It sounds a bit like my life.

  7. mbt sport shoes
    发表于 2010年06月24号 04时02分28秒 | 7楼

    I love your show when the mind remind us what is precious.

  8. paul smith shirt
    发表于 2010年06月25号 05时02分42秒 | 8楼

    These words mean a great deal to me today. Truly, it is necessary to let go – I see that.

  9. 6 inch timberland boots
    发表于 2010年07月01号 14时55分18秒 | 9楼

    I was thinking today that being grateful every moment is great freedom.

  10. discount herve leger
    发表于 2010年07月08号 06时48分31秒 | 10楼

    well and truly spoken…

  11. black Herve Leger
    发表于 2010年07月11号 01时44分33秒 | 11楼

    Thankyou for sharing.

  12. air force 1 low shoes
    发表于 2010年07月16号 12时11分46秒 | 12楼

    I guess that was my intial thought too.

  13. Herve Leger Sale
    发表于 2010年07月19号 18时50分49秒 | 13楼

    yes, very wise

  14. timberland chukka boot
    发表于 2010年07月19号 20时06分16秒 | 14楼

    I agree wholeheartedly.

  15. miu miu handbag sale
    发表于 2010年07月19号 22时36分24秒 | 15楼

    Thank you, enjoyed the stories, your comments and pictures very, very much.

评论页数:
1 2 159
  1. 目前没有通告
你必需 登陆 才能发表评论.