07月06, 2011

Smarty3下模版开发规范和问题

介绍

在smarty2的时候,之前写过一篇文章,Smarty中实现模板继承功能,文中就是结合smarty2的一些特点如何实现模块功能的。

现在Smarty3出来了,带来了非常多新的特性,包括:模版继承、自定义模版函数、直接调用PHP函数、模版里很方便的构造数据等。

本文不介绍如何使用Smarty3,简单的使用可以去官方网站查看文档。本文主要介绍Smarty3下模版开发规范和一些问题的解决方案

Smarty3开发规范

1、每个模块下都有layout和util文件,

2、layout命名为inc_layout.html,用来布局页面

3、util命名为inc_util.html,用来存放模版里自定义的函数

4、block命名方式必须是block_打头

5、function命名方式必须是fn_打头,主要是让模块里的自定义函数和php系统函数区分。(php里是不允许函数重定义的)

6、基础block命名有统一的命名方式,具体如下面

block命名方式和分组

模块里的inc_layout.html里定义了如下的block:

  • block_assign ,定义ui变量。
  • block_include ,用来引入模块里的util(即引用inc_util.html文件)。
  • block_title 页面标题
  • block_meta 页面keywords,description等
  • block_head_css 页面头部的css
  • block_head_js 页面头部的js
  • block_head 页面头部内容
  • block_content 页面主题内容
  • block_foot 页面底部内容
  • block_foot_js 页面底部js 在smarty3中,具体展示型页面里只能存在extends和block(其他的会被smarty忽略),所以要引入当前模块下的inc_util.html的话,必须放在block_include里。

smarty3里的block支持append和prepend的,block是可以多级继承的,如果没有加append和prepend,那么是直接替换之前父级已经定义的block,如果定义了append和prepend,则把内容追加上去,这点是非常有用的。

模块inc_layout.html基本内容

<&block name='block_assign'&>
<&$pageMode='ui-cols2'&>
<&/block&>
<&block name='block_include'&>
    <&capture&>
        <&include file="base/inc_util.html" inline&>
    <&/capture&>
<&/block&>
<!DOCTYPE html>
<html>
<!--STATUS OK-->
<head>
<title><&block name='block_title'&>百度空间<&/block&></title>
<&block name='block_meta'&>
<&/block&>
<&block name='block_head_css'&>
    <&include file="base/mod/top_css.html"&>
<&/block&>
<&block name='block_head_js'&>
    <&include file="base/mod/top_inline_js.html"&>
<&/block&>
</head>
<body id="doc">
<&block name='block_head'&>
    <&include file="appinc/app_page_top.html" &>
<&/block&>
<&block name='block_content'&>
    xxx
<&/block&>
<&block name='block_foot'&>
<&/block&>
<&block name='block_foot_js'&>
<&/block&>
</body>
</html>

模块inc_util.html基本内容

inc_util.html里面的内容主要就是自定义一些模版函数

<&function name='fn_test' args=""&>
xxx
<&/function&>

具体页面里的内容

<&extends file="xxx/inc_layout.html"&>
<&block name='block_content' append&>
    <&fn_test1 name='welefen'&>
<&/block&>

以上主要是开发时的一些规范,同时Smarty3相对于Smarty2也带来了一些问题,具体的看下面的介绍。

Smarty3开发注意的地方

虽然smarty3相对于smarty2做到了很多地方的兼容,但还是有些地方不兼容的,下面一一列举。

1、Smarty3定界符后的空格问题

smarty2支持定界符后有空格的,类似与:<& if($x ==1) &>,但到了Smarty3,默认是不支持这个的。这给开发者带来非常多的不变。一方面即使直接使用smarty3,可能定界符是特殊字符,不加空格的化代码很难读,另一方面给smarty2迁移到smarty3带来了非常多的困难。幸好smarty3是支持这个功能的,只是默认给关闭罢了。具体的如下:

$smarty = new Smarty();
$smarty->auto_literal = false; //将auto_literal设置为false就能支持空格了。

如果在实例化smarty的时候设置很麻烦的话,可以直接改动smarty3的源代码。大约在126行。

2、Smarty3中的编码问题

smarty3默认是使用UTF-8编码的,但有些老产品一般使用都是GBK,如果从smarty2迁移到smarty3的话,需要将编码设置为GBK。可以定义如下的宏。

define('SMARTY_RESOURCE_CHAR_SET', 'GB2312');

或者直接改smarty3的源代码。大约在60行。

3、插件配置目录的问题。

smarty2中一般使用下面的方式设置自定义插件目录

$smarty->plugins_dir = array('plugins', $plugins_dir); //其中$plugins_dir为自定义插件目录。

在Smarty3中,这种方式就无效了。可以通过下面的方式设置插件目录。

$smarty->addPluginsDir($plugins_dir);

如果在smarty2迁移到smarty3中发生这种问题的化,并且实例化smarty有多处的时候,上面的方式可能要改动多处。可以直接改Smarty3的源代码来解决。

在foreach((array)$this->plugins_dir as $_plugin_dir) { 行后加入如下的代码(大约在703行)

if($_plugin_dir === 'plugins'){
      $_plugin_dir = SMARTY_PLUGINS_DIR;
}

4、插件问题

smarty3中有些插件不好用了,目前发现的有:escape, date_formate, cicle等

5、引用inc_util.html的方式

smarty中的include最终会编译成php中的include的,如果用下面的方式include

<&include file="xxx/inc_utilt.html"&>

会发现inc_util.html里定义的函数在具体页面的模版里无法使用。主要是这种方式smarty3没有特殊处理,直接变为php的include了,可以通过下面的方式解决。

<&capture&>
    <&include file="base/inc_util.html" inline&>
<&/capture&>

在include加上inline,并且外面加上capture,避免有内容输出。

6、构造数据问题

目前smarty3中构造数据支持下面的方式:

<& $arr = ['1','2', '3']&>

但不支持php的语法

<& $arr = array('1', '2')&>

这点很悲剧,不知道之后会不会支持

7、smarty3的性能问题

由于这个涉及东西很多,之后准备用一篇文章来说明以及如何去优化。

8、具体页面只允许extends和block

子页面里只解析extends和block,并且extends必须放在第一行。extends和第一个block之间至少有个空格、还行等特殊字符, 这个在做HTML压缩的时候需要注意。

本文链接:http://welefen.com/post/smarty3-regular.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。