请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 18747|回复: 0

[模板引擎] Smarty模板引擎全教程

[复制链接]
发表于 2012-8-4 14:40:42 | 显示全部楼层 |阅读模式
前面已经介绍了在SpeedPHP框架中使用Smarty模板引擎的方法,下面我们来更详细地介绍Smarty的使用方法。
本章是对Smarty常用的一些功能进行了详述,让您在最短的时间内掌握Smarty模板的日常开发。如果您需要更深入的了解Smarty这个优秀的PHP模板引擎技术,请参考Smarty中文手册。

Smarty 3 中文手册地址:http://www.speedphp.com/smarty/


一、对模板赋值

将变量输入到模板
  1. 程序:
  2. $this->hello = "Hello world";
  3. 模板:
  4. <{$hello}>
  5. 输出:
  6. Hello world
复制代码
将数组输入到模板
  1. 程序:
  2. $this->color = array('red' => '红色', 'yellow' => '黄色', 'green' => '绿色');
  3. 模板可以使用:
  4. <{$color['red']}>
  5. 同时也可以:
  6. <{$color.red>
  7. 输出:
  8. 红色
复制代码
二、模板内部语法
if,elseif,else 条件判断
  1. <{if $color == "red"}>
  2. 这是红色的。
  3. <{elseif $color == "green" || $color == "white"}>
  4. 这是绿色或者白色的。
  5. <{else}>
  6. 这不知道什么颜色
  7. <{/if}>
复制代码

Smarty中的if/else除了不使用括号外和PHP的if/else几乎是一样的。

include 包含文件

  1. <{include file="header.html"}>
复制代码
请注意include的包含是以'template_dir'的设置为根目录的,而且并不存在相对目录。所以比如我们的footer.html在"模板目录/main/footer.html",我们将使用
  1. <{include file="main/footer.html"}>
复制代码
来进行包含。


在Smarty中还有include_php,和include一样,只是include_php包含的是可执行的PHP文件。同时,如果使用include_php函数,将可能涉及到Smarty的安全特性,这和{php}语法也是有关的。详细请参考Smarty中文手册。
当然,在基于Smarty的模板开发中,我们原则上不建议在模板内使用PHP的功能。

foreach,foreachelse

和PHP的foreach一样,循环处理数组。

  1. $this->color = array('red' => '红色', 'yellow' => '黄色', 'green' => '绿色');


  2. <{foreach item=colorname from=$color key=enname}>
  3. <{$enname}>: <{$colornam}>

  4. <{/foreach}>
复制代码

将输出:

red:红色

yellow:黄色

green:绿色

多维数组也是同样处理,请留意以下的多维数组:

例:

  1. $students =
  2.    array(
  3.       'name' => 'He Qing',
  4.       'age' => 17,
  5.       'score' => array(
  6.          'math' => 76,
  7.         'english' => 92,
  8.          'PE' => 72
  9.       ),
  10.    ),
  11.    array(
  12.       'name' => 'Lee Wen',
  13.       'age' => 18,
  14.       'score' => array(
  15.          'math' => 69,
  16.         'english' => 80,
  17.          'PE' => 79
  18.       ),
  19.    ),
  20. );
  21. $this->students = $students ;
复制代码
模板:
  1. 学生成绩:

  2. <{foreach item=person from=$students}>
  3. 姓名:<{$person.name}>

  4. 年龄:<{$person.age}>

  5. 分数:
  6. <{foreach item=num key=subject from=$person.score}>
  7. <{$subject}>:<{$num}>




  8. <{/foreach}>
  9. <{foreachelse}>
  10. 暂无学生数据!
  11. <{/foreach}>
复制代码

foreachelse是在变量未赋值的时候将显示。

和foreach差不多的还有section,详细请参考Smarty中文手册。

literal

literal主要用于显示有可能包含大括号等字符信息的 javascript 脚本. 当这些javascript 脚本处于 {literal}{/literal} 标签中时,模板引擎将不分析它们,而直接显示。

有时候我们在使用Smarty模板时,会遇到程序正常却仅输出空白页面;这时我们可以检查一下,是否该模板中包含了javascript脚本。在这些javascript外边加上literal就不会有问题了。

  1. <{literal}>
  2. <script language=javascript>
  3.   <!--
  4.   function isblank(field) {
  5.   if (field.value == '')
  6.   { return false; }
  7.   else
  8.   {
  9.   document.loginform.submit();
  10.   return true;
  11.   }
  12.   }
  13.   // -->
  14. </script>
  15. <{/literal}>
复制代码

literal和下面介绍的strip虽然在一般的Smarty教程中很少有介绍,但的确literal和strip对日常的开发是非常有帮助的,尤其是strip。

strip

Smarty将清除{strip} ... {/strip}之间的全部空格以及回车。

建议马上在您的模板中使用strip标签,根据实际开发的估计,一般的页面在使用了strip标签几乎可以减少四分之一的html文件大小,尤其在内容特别多的页面(比如首页)在网页的打开速度和显示速度上面有着明显的提高。

例子:

  1. {strip}
  2. <table border=0>
  3. <tr>
  4. <td>
  5. <A HREF="{$url}">
  6. <font color="red">This is a test</font>
  7. </A>
  8. </td>
  9. </tr>
  10. </table>
  11. {/strip}
复制代码
显示:
  1. <table border=0><tr><td><A HREF="http://my.domain.com">
  2. <font color="red">This is a test</font></A></td></tr></table>
复制代码
三、SpeedPHP框架在Smarty模板中的函数
在模板中,除了可以使用Smarty本身自带的函数外,sp框架还提供了一些常用的函数,下面我们里了解一下:

spUrl

和输出spUrl()函数结果一样,显示一个URL地址

比如:

程序中:echo spUrl('article', 'list', array('page'=>3, 'pageSize' => 10)); // 显示文章列表的第三页

在模板中使用就是:

  1. <{spUrl c='article' a='list' page=3 pageSize=10}>
复制代码

T

和输出 T()函数的结果一样,显示多语言情况下的翻译结果

比如:

程序中:echo T("welcome"); // 显示在特定语言下的欢迎信息

在模板中则是:

  1. <{T w='welcome'}>
复制代码
四、HTML相关函数
Smarty提供了一系列的HTML代码生成函数。以下例子均出自Smarty手册,详细说明请参考Smarty中文手册。

html_checkboxes

生成多个多选框
程序:

  1. $this->cust_checkboxes = array(
  2.             1000 => 'Joe Schmoe',
  3.             1001 => 'Jack Smith',
  4.             1002 => 'Jane Johnson',
  5.             1003 => 'Charlie Brown'
  6. );
  7. $this->customer_id' = 1001;
复制代码
模板:
  1. <{html_checkboxes name="id" options=$cust_checkboxes checked=$customer_id separator="
  2. "}>
复制代码
输出:
  1. <label><input type="checkbox" name="checkbox[]" value="1000" />Joe Schmoe</label>

  2. <label><input type="checkbox" name="checkbox[]" value="1001" checked="checked" />Jack Smith</label>

  3. <label><input type="checkbox" name="checkbox[]" value="1002" />Jane Johnson</label>

  4. <label><input type="checkbox" name="checkbox[]" value="1003" />Charlie Brown</label>
复制代码

html_image

生成图片img标签,html_image将自动获取图片长宽。
模板:

  1. <{html_image file="pumpkin.jpg"}>
复制代码
输出:
  1. <img src="pumpkin.jpg" alt="" border="0" width="44" height="68" />
复制代码

html_options

生成多个下拉框选项组,需要自行加上<select>
程序:

  1. $this->cust_options= array(
  2.             1000 => 'Joe Schmoe',
  3.             1001 => 'Jack Smith',
  4.             1002 => 'Jane Johnson',
  5.             1003 => 'Charlie Brown'
  6. );
  7. $this->customer_id' = 1001;
复制代码
模板:
  1. <select name=customer_id>
  2.     <{html_options options=$cust_options selected=$customer_id}>
  3. </select>
复制代码
输出:
  1. <select name=customer_id>
  2.     <option value="1000">Joe Schmoe</option>
  3.     <option value="1001" selected="selected">Jack Smith</option>
  4.     <option value="1002">Jane Johnson</option>
  5.     <option value="1003">Charlie Brown</option>
  6. </select>
复制代码

html_radios

生成多个单选框
程序:

  1. $this->cust_radios = array(
  2.             1000 => 'Joe Schmoe',
  3.             1001 => 'Jack Smith',
  4.             1002 => 'Jane Johnson',
  5.             1003 => 'Charlie Brown'
  6. );
  7. $this->customer_id' = 1001;
复制代码
模板:
  1. <{html_radios name="id" options=$cust_radios checked=$customer_id separator="
  2. "}>
复制代码
输出:
  1. <input type="radio" name="id[]" value="1000">Joe Schmoe

  2. <input type="radio" name="id[]" value="1001" checked="checked">

  3. <input type="radio" name="id[]" value="1002">Jane Johnson

  4. <input type="radio" name="id[]" value="1003">Charlie Brown
复制代码

html_select_date

生成年月日下拉框
模板:

  1. {html_select_date month_format="%m" field_order="YMD" start_year="1950" }

  2. html_select_time 生成时分秒下拉框
  3. {html_select_time use_24_hours=true}
复制代码

html_table

生成一个表格
程序:

  1. $this->data = array(1,2,3,4,5,6,7,8,9);
复制代码
模板:
  1. {html_table loop=$data cols=4 }
复制代码
输出:
  1. <table border="1">
  2. <tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
  3. <tr><td>5</td><td>6</td><td>7</td><td>8</td></tr>
  4. <tr><td>9</td><td> </td><td> </td><td> </td></tr>
  5. </table>
复制代码
五、对模板变量的修饰
针对输入到模板的变量,有时候我们需要进行一些转换修饰,比如对网址进行URL编码等。下面我们将介绍几个常用的变量修饰器(Modifiers)

default

默认值
在变量为空或未赋值的时候,将由默认值替代输出。
例:<{$user_name|default:'游客'}>,如果$user_name并未赋值,则输出“游客”。

escape

对字符串进行编码,常用的编码方式:有html(进行HTML转码)url(进行URL转码)javascript(javascript转码)等
例:$this->url = "http://www.163.com";
模板:<{$url|escape:"url"}>
输出:http%3A%2F%2Fwww.163.com

lower 小写 upper 大写

对字符串进行小写或大写的转换
例:$this->hello = "Hello World!";
模板:
<{$hello|lower}>  
将输出 hello world!
<{$hello|upper}>  
将输出 HELLO WORLD!

replace

替换,与str_replace效果相同
例:$this->num = "101010101010101";
模板:<{$num|replace:"1":"0"}>  // 1被替换成了0
输出:111111111111111

strip_tags

去除HTML标签,也就是去除<>中间的字符串
例:$this->myword = "<b>hi</b>, <font color=red>this is red font.</font>";
模板:<{$myword|strip_tags}>
输出:hi,this is red font.


在Smarty手册中,我们还可以看到一些计算字符串长度和截取字符串的变量修饰器,可是在使用汉字的情况下,目前这些变量修饰器却不能正常的使用。这个情况我们可以使用sp框架的spAddViewFunction函数功能,将能够计算汉字的函数和正确截取汉字的函数注册到模板之中,使得这些函数可以像Smarty内置函数一样使用。这样一方面可以令您的应用程序功能更加强大,另一方面也符合了Smarty的设计理念,不破坏模板引擎的功能最小化原则。

当然,上面讲述的SpeedPHP框架在Smarty模板中的函数T与spUrl,也都是通过spAddViewFunction方式注册到模板引擎中的。

在日常开发中,我们将经常需要对输入到模板的变量进行调试,所以可以开启Smarty的调试功能进行调试。详细介绍可以参考《
您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2020-4-4 09:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表