在smarty2的时候,之前写过一篇文章,Smarty中实现模板继承功能,文中就是结合smarty2的一些特点如何实现模块功能的。
现在Smarty3出来了,带来了非常多新的特性,包括:模版继承、自定义模版函数、直接调用PHP函数、模版里很方便的构造数据等。
本文不介绍如何使用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命名有统一的命名方式,具体如下面
模块里的inc_layout.html里定义了如下的block:
smarty3里的block支持append和prepend的,block是可以多级继承的,如果没有加append和prepend,那么是直接替换之前父级已经定义的block,如果定义了append和prepend,则把内容追加上去,这点是非常有用的。
<&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里面的内容主要就是自定义一些模版函数
<&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相对于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压缩的时候需要注意。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8