毫无疑问,作为一款成功的社区建站软件,Discuz在很多方面确实是花了功夫,尤其是是让数万开发者加入其中,可以这么说,现在Discuz的发展离不开这些第三方的开发者。Discuz应用中心之所以有这么多开发者,这得益于其本身的便捷性,让具备技术功底的开发者能够较快上手对其进行二次开发。
做过Discuz二次开发的童鞋都知道,我们所需要做的就是增加templat和plugin目录,也就是通过自定义的插件和模版来改造属于我们自己个性化的Discuz。而插件开发中不可以不得不提的就是插件嵌入点(hook)了,类似的其他开源程序也有类似的概念,就比如说WordPress其实也有。
我们知道Discuz默认情况下有许多自带的嵌入点,我们可以在config/config_global.php加入如下代码后在网站的前台查看各个自带嵌入点的位置:
$_config['plugindeveloper'] = 2;
可以这么说,这些自带的嵌入点已经帮我们考虑了大多数页面嵌入的场景。然而,我们同时做过插件开发及模版开发的童鞋可能就有体会,有时候当我们的某个插件和自己的某个模版整合后,我们希望在除默认嵌入点之外的位置放上额外的嵌入点。比如我们手机模版forumdisplay.htm这个文件中,有其中如下代码:
<li><!--{hook/forumdisplay_thread_mobile $key}--><a href="forum.php?mod=viewthread&tid=$thread[tid]&extra=$extra"><h6>{$thread[subject]}</h6>.......</a></li>
这里官方的默认嵌入点已经给了我们在这条记录上方的一个嵌入点,这个嵌入点可以让我们通过插件来操作这一部分内容。但我们有时候想在h6的下方嵌入内容,那怎么办呢?当然不是一定需要自定义嵌入点,各位民间开发者自然有自己的神奇的技巧,但我只想说如果有自定义嵌入点该多好啊。
我们能想到,那就意味着Discuz可能已经做到。没错!确实做到了,从其官方文档(传送门)我们可以知道是支持自定义嵌入点的,而且实现起来非常简单。但是据了解,部分人看文档的时候可能会觉得文档不好理解,有时候甚至搞半天才成功执行。文档原文为:
函数名并不限于以上列表,您可以自定义,只要符合以下规则,函数就会在适当的地方被调用。
function CURMODULE_USERDEFINE[_output]()
CURMODULE指明了此函数在哪个模块执行,可通过常量 CURMODULE 得到当前页面的 CURMODULE 值。 USERDEFINE 可自定义,如果函数名以“_output”结尾则会在模板输出前调用,否则会在模块执行前调用。
其实很简单,意思就是只要是[脚本名_自定义名称]即可,而CURMODULE常量就是代表当前的脚本名称,比如论坛的首页的CURMODULE值应该是forum,不同页面中我们可以输出下常量就知道是什么,后面就是下划线,接着就是我们自定义的其他名称(建议这个名称是有意义的,让他人和你自己一看这个函数名称就知道这个插件大概干嘛,当然这也是通常的命名规则)。
一个实例
还是拿刚才最开始举的例子来说,就是那个说在手机页面的。这个页面就是手机版的主题列表页面,自定义的位置就是用来显示由插件读取出来的主题的前四张附件图片。对应的这个类的主体代码如下:
//全局嵌入点类class mobileplugin_muquan_m_seting { //代码块}//脚本嵌入点类class mobileplugin_muquan_m_seting_forum extends mobileplugin_muquan_m_seting{ //读取前面四张附件图片的方法,用于显示在主题列表中 public function forumdisplay_threadsimglist_output(){ //代码块 } //其他方法}
其中forumdisplay_threadsimglist_output这个方法就是为了自定义嵌入点而创造的,而其中的forumdisplay就是CURMODULE,threadsimglist就是USERDEFINE。在模版中的嵌入点为
<!--{hook/forumdisplay_threadsimglist $key}-->
相信到这里,大家结合官方文档应该知道如何自定义前端点了,以上实例是我开发的的一个插件的部分代码,所以肯定是可以实现的的。如果在实践中遇到问题,欢迎留言或者联系我交流。