Smarty3下模版开发规范和问题

736次阅读  |  发布于5年以前

介绍

在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:

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压缩的时候需要注意。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8