#1 jake

Smarty模板通常情况下,是无法使用许多PHP或者自定义函数的,如果开发者需要在Smarty模板中使用一些自定义的函数,可以对函数进行“注册到模板”的操作,才可以在模板中使用这些函数。

注册函数,使用的方法是通过SpeedPHP的核心函数之一——spAddViewFunction


spAddViewFunction的介绍

  • 参数,函数定义spAddViewFunction($alias, $callback_function),第一个参数$alias是该函数在模板中的名称,也就是模板内的函数名。第二个参数 $callback_function是回调函数的定义,支持函数名或array(类, 成员函数)的两种方式,指代当模板中执行名为$alias的函数的时候,将会执行的操作。
  • 位置,spAddViewFunction的加入可以放置在模板使用“注册函数”之前。通常spAddViewFunction和指定的函数/类,都放到入口文件全局位置或是在入口文件全局位置载入的函数库文件中。
有关于入口文件和全局位置的介绍,请参考相关教程。
观察spAddViewFunction如何注册spUrl

spUrl是框架默认注册到模板的函数之一,我们通过观察spUrl的注册过程来了解spAddViewFunction的使用。


  • spView.php文件约40行:spAddViewFunction('spUrl', array(& $this, '__smarty_spUrl')); 这里是通过将$this(view的对象)中的__smarty_spUrl函数注册到smarty,别名是spUrl。请注意,是注册__smarty_spUrl函数,而并非spUrl函数本身。
  • spView类的__smarty_spUrl成员函数和spAddViewFunction('spUrl', array(& $this, '__smarty_spUrl'));都是在spView的构造函数中定义,和在入口文件全局位置定义是相同效果,当然我们建议开发者在入口文件全局位置来定义,不修改框架文件。
  • spView.php文件约90行,__smarty_spUrl函数的内容。可以看出这个函数只有一个参数$params,这是注册到模板的函数的标准形式。__smarty_spUrl函数内部是将spUrl需要的四个参数,从$params中获取然后再给spUrl函数,最后返回spUrl函数返回的数据。
如何注册将日期显示函数注册到模板中使用?

首先,我们有一个显示日期的函数tpl_date,参数的格式按照Smarty注册函数的标准进行设置。

function tpl_date($params){
        // Smarty注册函数的参数只能是一个数组,数组分别指代在模板中的参数,请注意$params的几个值,下面还会说明
        $format = $params["format"];
        $timestamp = $params["timestamp"];
        return date($format, $timestamp); // 简单起见,直接通过PHP的date函数来处理,当然开发者可以进行更复杂的操作
}
然后是spAddViewFunction将tpl_date函数注册到模板中,模板中使用的名称是view_date。
spAddViewFunction('view_date','tpl_date');
在模板中,我们可以使用:
<{view_date format="Y-m-d" timestamp="1231212323"}>

当模板中调用了view_date的时候,Smarty就会调用tpl_date函数,调用的参数format和timestamp就对应了tpl_date的$params数组的值。获取到返回值后就在模板中显示出来。

这样,就可以实现将函数注册到模板中使用了。还需要注意一下,通常以下代码都是写在一起的,并且是放在入口文件全局位置中。

function tpl_date($params){
        $format = $params["format"];
        $timestamp = $params["timestamp"];
        return date($format, $timestamp);
}
spAddViewFunction('view_date','tpl_date');

2012-08-04 15:05:02