[关闭]
@mircode 2016-07-12T11:36:00.000000Z 字数 5566 阅读 634

Smarty模板引擎

smarty


一、Smarty是什么

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

二、Smarty优点

  1. 速度:采用Smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。
  2. 编译型:采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下)
  3. 插件技术:Smarty可以自定义插件。插件实际就是一些自定义的函数,因此这种模板语言完全可以扩展。
  4. 模板定界符:所以支持你可以使用{}, {{}} 等等,作为模板的定界符。
  5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。

三、Smarty基本语法

1、注释

模板注释被*星号包围,而两边的星号又被定界符包围。
例如:

  1. {* this is a comment *}

注意:
Smarty注释不会在模板文件的最后输出中出现,这与HTML注释不同。

2、变量

模板变量用美元符号$开始,可以包含数字、字母和下划线。

  1. {assign var=foo value="helloword"}
  2. {*{assign}用来在模板运行时为模板变量赋值*}
  3. {$foo}
  4. {*${foo}来引用变量*}

*注意
GET、SESSION等PHP全局变量,可以通过$smarty引用。


  1. {* display value of page from URL ($_GET) http://www.example.com/index.php?page=fo
  2. {$smarty.get.page}
  3. {* display the variable "page" from a form ($_POST['page']) *}
  4. {$smarty.post.page}

3、函数

每一个smarty标签输出一个变量或者调用某种函数。在定界符内函数(一般定界符‘{}’包住)和其属性(同样在定界符内)将被处理和输出。例如: {funcname attr1="val" attr2="val"}

注意:
函数的属性实际为函数的参数。

4、内置函数

Smarty自带了一些内置函数,这些内置函数是Smarty模板引擎的组成部分。他们被编译成相应的内嵌PHP代码,以获得最大性能。
如:

  1. {$var=}
  2. {append}
  3. {assign}
  4. {block}
  5. {call}

这里,我们找一些典型的函数介绍一下。

  1. {include} 包含

改标签用于在当前模板中包含其它模板。当前模板中的任何有效变量在被包含模板中同样可用。

  1. <html>
  2. <head>
  3. <title>{$title}</title>
  4. </head>
  5. <body>
  6. {*引入页面头*}
  7. {include file='page_header.tpl'}
  8. {*引入页面主题内容,支持file属性为$变量引用*}
  9. {include file="$page_content.tpl"}
  10. {*引入页面尾巴*}
  11. {include 'page_footer.tpl'}
  12. </body>
  13. </html>

2、条件

  1. {if isset($name) && $name == 'Blog'}
  2. {* do something *}
  3. {elseif $name == $foo}
  4. {* do something *}
  5. {/if}
  6. {if is_array($foo) && count($foo) > 0}
  7. {* do a foreach loop *}
  8. {/if}

3、循环函数

  1. <?php
  2. $arr = array('red', 'green', 'blue');
  3. $smarty->assign('myColors', $arr);
  4. ?>
  5. Template to output $myColors in an un-ordered list
  6. <ul>
  7. {foreach $myColors as $color}
  8. <li>{$color}</li>
  9. {/foreach}
  10. </ul>
  11. The above example will output:
  12. <ul>
  13. <li>red</li>
  14. <li>green</li>
  15. <li>blue</li>
  16. </ul>

6、自定义函数

用户可以使用Smarty自带的一组自定义函数。当然我们也可以自己自定义函数。(详见第四章节)

  1. {html_checkboxes}
  2. {html_image}
  3. {html_options}
  4. {html_radios}
  5. {html_select_date}
  6. {html_select_time}
  7. {html_table}

四、自定义插件

2.0版本引入了被广泛应用于自定义Smarty函数功能的插件架构。它包括如下类型:
functions 函数插件
modifiers 调节器插件
block functions 块函数插件
compiler functions 编译函数插件
prefilters 预滤器插件
postfilters 后滤器插件
outputfilters 输出过滤器插件
resources 资源插件
inserts 嵌入插件

1、插件命名规范

插件文件必须命名如下:

  1. type.name.php

2、函数模板插件

模板传递给模板函数的所有属性都包含在关联数组params中。
在模板中,函数的输出内容(返回值)在原位置用函数标签代替,例如{fetch}函数。作为另一种选择,函数也可以单纯地用来做些非输出内容的任务,如{assign}函数。
如果函数需要分配(俗话说的赋值)一些变量给模板或者使用Smarty提供的一些函数,可以通过smarty对象实现,如$smarty->foo()。

例如:带输出的函数插件

  1. <?php
  2. /*
  3. * Smarty plugin
  4. * -------------------------------------------------------------
  5. * File: function.eightball.php
  6. * Type: function
  7. * Name: eightball
  8. * Purpose: outputs a random magic answer
  9. * -------------------------------------------------------------
  10. */
  11. function smarty_function_eightball($params, $smarty)
  12. {
  13. $answers = array('Yes',
  14. 'No',
  15. 'No way',
  16. 'Outlook not so good',
  17. 'Ask again soon',
  18. 'Maybe in your reality');
  19. $result = array_rand($answers);
  20. return $answers[$result];
  21. }
  22. ?>
  23. which can be used in the template as:
  24. Question: Will we ever have time travel?
  25. Answer: {eightball}.

3、块函数模板

块函数的形式是这样的:{func} .. {/func}。换句话说,他们被封闭在一个模板区域内,然后对该区域的内容进行操作。块函数优先于同名的自定义函数,即是说,你不能同时使用自定义函数{func}和块函数{func} .. {/func}。

  1. <?php
  2. /*
  3. * Smarty plugin
  4. * -------------------------------------------------------------
  5. * File: block.translate.php
  6. * Type: block
  7. * Name: translate
  8. * Purpose: translate a block of text
  9. * -------------------------------------------------------------
  10. */
  11. function smarty_block_translate($params, $content, $smarty, &$repeat)
  12. {
  13. // only output on the closing tag
  14. if(!$repeat){
  15. if (isset($content)) {
  16. $lang = $params['lang'];
  17. // do some intelligent translation thing here with $content
  18. return $translation;
  19. }
  20. }
  21. }
  22. ?>

4、调节器

调节器插件的第一个参数应该直接了当地声明处理什么类型(可以是字符串、数组、对象等等这些类型)。其它的参数是可选的,取决于执行的操作类型。
调节器必须返回处理结果。

例如:日期调节器

  1. {$smarty.now|date_format}
  2. {$smarty.now|date_format:"%A, %B %e, %Y"}
  3. {$smarty.now|date_format:"%H:%M:%S"}

自定义调节器

  1. <?php
  2. /*
  3. * Smarty plugin
  4. * -------------------------------------------------------------
  5. * File: modifier.capitalize.php
  6. * Type: modifier
  7. * Name: capitalize
  8. * Purpose: capitalize words in the string
  9. * -------------------------------------------------------------
  10. */
  11. function smarty_modifier_capitalize($string)
  12. {
  13. return ucwords($string);
  14. }
  15. ?>

其他形式的函数,请自行查询Smarty的文档
Smarty模板手册

  1. {*声明一个数组变量*}
  2. {assign var=colors value=['red', 'green', 'blue']}
  3. {colors[1]} {*访问第一个元素*}
  4. {*分支和循环*}
  5. {foreach colors as $color}
  6. {if $color=='red'}
  7. <li style='color:red'>{$color}</li>
  8. {else}
  9. <li>{$color}</li>
  10. {/if}
  11. {/foreach}
  12. {*函数插件:随机回答*}
  13. function smarty_function_eightball($params, $smarty){
  14. $answers = array('Yes','No');
  15. $result = array_rand($answers);
  16. return $answers[$result];
  17. }
  18. eg:
  19. Question: Will we ever have time travel?
  20. Answer: {eightball}.
  21. {*块函数插件:将translate标签中的内容进行翻译*}
  22. function smarty_block_translate($params, $content, $smarty, &$repeat){
  23. // only output on the closing tag
  24. if(!$repeat){
  25. if (isset($content)) {
  26. $lang = $params['lang'];
  27. // do some intelligent translation thing here with $content
  28. return $translation;
  29. }
  30. }
  31. }
  32. eg: {translate lang='zh_CN'}hello{/translate} => 你好
  33. {*调节器插件:首字母大写*}
  34. function smarty_modifier_capitalize($string){
  35. return ucwords($string);
  36. }
  37. eg: {$str|capitalize}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注