注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

记录~~~

Stay Hungry. Stay Foolish.

 
 
 

日志

 
 

在smarty模板中调用PHP自定义函数(从smarty2到smarty3)【转】  

2013-10-30 09:34:16|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://blog.csdn.net/huli870715/article/details/6526268

这两天研究了一下smarty,熟悉了它的一些基本语法后便开始用它开发一个留言版(真正的开发中一般不会有程序员使用smarty去开发一个留言版的,杀鸡焉用牛刀?),主要是为了将所学的知识点串联起来。在开发的过程中,遇到了一个问题,如题,我在PHP文件中定义了一个函数,现在想在.tpl模版中调用,该如何调用呢?通过在网上查找一些资料,下面给出具体的解决方案:

大家都知道,在smarty中提供了许多在模板中使用的调节器,但是在很多时候,这些调节器无法提供我们需要的功能,这时候,我们就需要自己定义PHP函数,然后在模板中调用。

首先,谈谈在smarty2中的解决方法:

在smarty2中提供了一个函数,register_function,在官方文档上它的原型为

void register_function(string name,
                       mixed impl,
                       bool cacheable,
                       mixed cache_attrs);

我们可以使用该函数来动态注册在模板中使用的自定义函数,它的第一个参数是我们将在模板中使用的函数名,第二个参数是我们定义的PHP函数名,该参数既可以是一个包含函数名称的字符串,也可以是一个array(&$object,$method)数组,其中&$object是表示对象引用,$method表示该对象的方法,第三个和第四个参数在绝大多数情况下都可以省略。它的用法很简单:下面给出一个简单的例子并加以说明 :

//.php
function htmlcode($paras) {
extract($paras);
Return str_replace('/n/r','<br>',str_replace(' ','&nbsp;',$cont));
}
$smarty=new Smarty();
$smarty>register_function('format_content','htmlcode');
$smarty->display("list.html");

//list.html
<table width="500px" border="0" cellspacing="5" cellpadding="1" bgcolor="#add3ef">
{section name=reply loop=$content}
<tr bgcolor="#eff3ff">
<td>标题:{$content[reply].title} 用户:{$content[reply].user}</td>
</tr>
<tr bgcolor="#ffffff">
<td>内容:{format_content cont=$content[reply].content}</td>
</tr>
{/section}
</table>

在服务器端,也就是PHP文件中,我定义了自己所需的功能函数htmlcode函数,然后使用register_function函数将它注册到format_content中,其中,format_content就是在模板中使用的函数名,在模板中,我们使用{format_content 参数1 参数2 ……}来调用函数,其中函数名后之后带的参数(参数1,2等等)被组合中一个数组作为实参传入到了PHP自定义函数中,本例中,,cont参数被组合成只有一个元素的数组传入到了htmlcode函数中来进行调用,也就是说htmlcode的形参$paras是一个数组,它的每一个元素对应我们在模版中给它传递的一个参数。

说到这里,大家应该知道该如何使用了吧,好了,下面来谈谈在smarty3中的解决方法。

在smarty3中,我尝试用register_function函数,可出现了function call 'register_function' is unknown or deprecated的错误,于是我差了一下官方的文档,发现register_function这个函数在smarty3中已经被淘汰了,取而代之的是一个名为registerPlugin的一个功能更为强大的函数,该函数的原型为

void registerPlugin(string type,
                    string name,
                    mixed callback,
                    bool cacheable,
                    mixed cache_attrs);

可以看到,该函数仅仅比register_function多了第一个参数,string type,那么该参数是做什么用的呢?文档上是这么定义的:

type defines the type of the plugin. Valid values are "function", "block", "compiler" and "modifier".

翻译过来也就是说该参数定义了插件的类型,有效值为"function","block","complier","modifier"中的一个,看到这里大家应该明白了吧,在register_function中,只能注册function这一种类型,而该函数可以注册四种类型,其余的用法和register_function基本一致。

在list.html中,我们不需要改动,而仅仅需要在PHP文件中稍作改动:

function htmlcode($paras) {
extract($paras);
Return str_replace('/n/r','<br>',str_replace(' ','&nbsp;',$cont));
}
$smarty=new Smarty();
$smarty->registerPlugin('function','format_content','htmlcode');
$smarty->display("list.html");


  评论这张
 
阅读(81)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017