Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

巧妙实现插件新核心

[复制链接]
选峰工作室 发表于 2009-12-11 04:46:06 | 显示全部楼层 |阅读模式
本帖最后由 选峰工作室 于 2009-12-11 09:52 编辑

所谓插件新核心,在本文是指不修改DZ源文件的情况下,能实现想要的插件功能。
能否在没有插件嵌入点时也能应用新核心?答案是肯定的。

方法一:利用showmessage实现程序结束时的新核心。
比如某推广中心插件想实现注册之后记录推荐人,要获得用户注册后的uid和推荐人一起写入数据库,看似不修改文件的情况下很难实现。
又如,某主题海报插件想实现发表主题后对post_top或post_middle里包含的附件进行处理,要获得tid之后与附件信息一起写入数据库,看似不修改文件的情况下,也很难实现。
因为这两个需求都有个特点,那就是,不能用全局包含的方法来实现,因为获得uid或tid是在全局包含之后。
山穷水尽疑无路,柳暗花明又一村。所幸DZ在showmessage函数里包含了include template('showmessage');
我们会发现,showmessage.htm里和其它模板一样,含有页面的嵌入节点。
真是太棒了,我们可以利用这个特征来用曲线救国的方式实现新核心。那就是,加_output的嵌入点函数,然后对达到那里的条件进行判断。
比如
        function post_newthread_output($a){
                        if($a['template']=='showmessage'){
                                if($_POST){
                                        if($action == 'newthread'&&$tid){
                                                //xxxxxxx
                                        }
                                }
                        }
                }
当然,我们发现,这个有时候并不好用,那是因为如果后台开启了直接跳转,那么早在运行到包含showmessage.htm之前,已经进行了直接跳转。怎么办?方法就是,在插件里先关闭跳转,再在插件里实现直接跳转。
        function post_newthread_output($a){
                if($a['template']=='showmessage'){
                                if($_POST){
                                        if($action == 'newthread'&&$tid){
                                                //xxxxxxx
                                                        if($GLOBALS['closequickforward']){
                                                                $url_forward="viewthread.php?tid=$tid&extra=$extra";
                                                                updatesession();
                                                                dheader("location: ".str_replace('&', '&', $url_forward));
                                                        }

                                        }
                                }
                        }
        }
        function post_closequickforward(){
                global $action;
                if($_POST&&($action=='newthread')){
                        $msgforward = unserialize($GLOBALS['_DCACHE']['settings']['msgforward']);
                        if($msgforward['quick']){
                                $msgforward['quick']=0;
                                $GLOBALS['_DCACHE']['settings']['msgforward']=serialize($msgforward);
                                $GLOBALS['closequickforward']=1;
                        }else{
                                $GLOBALS['closequickforward']=0;
                        }
                }
        }
这样就可以实现在即使用户开启直接跳转的情况下也可以实现新核心了。

方法二:利用JS,实现不修改模板而实现想要的效果。
比如,我想在首页的某个有命名ID的div层里或下面加点内容或替换它的内容,不修改文件怎么实现呢?那就是利用已有的插件嵌入点,比如index_bottom 或global_footer 这类嵌入点,然后在里面输出JS操作。
比如 $(‘xxx’).innerHTML+=’xxxx’。
又如,我并不想修改模板,但我想预设后台某个页面的输入框的前缀或改变下页面,但那里没有任何直接的插件嵌入点,又怎么实现呢?方法是在全局包含里输出一段JS代码,比如
<script>
                window.onload=function (){
                        $(‘xxx’).value=’xxx’;
                }
</script>
这样就可以实现在页面加载完后再运行JS的操作,比如改变页面的显示。

其实这两个方法表明了,在DZ的PHP,几乎都可以运行插件,在DZ的模板,也几乎都可以加入插件。
那就是说,几乎都可以通过插件来实现,只是有些直接,有些委婉。

评分

1

查看全部评分

wmanor 发表于 2009-12-11 05:51:15 | 显示全部楼层
回复

使用道具 举报

meiit 发表于 2009-12-11 07:08:03 | 显示全部楼层
学习了
回复

使用道具 举报

 楼主| 选峰工作室 发表于 2009-12-11 09:54:02 | 显示全部楼层
编辑了一下,更正了 $a['template']=='showmessage'
回复

使用道具 举报

sean2050 发表于 2009-12-14 23:20:43 | 显示全部楼层
虽然没有看懂,但是 也要收藏、顶
回复

使用道具 举报

abcnic18 发表于 2009-12-16 10:51:03 | 显示全部楼层
学习!!!
回复

使用道具 举报

host 发表于 2010-2-2 23:30:11 | 显示全部楼层
本帖最后由 host 于 2010-02-02 23:32 编辑

如何在插件类中的output()里面使用showmessage来提示用户一些信息呢?
  1. //__进入公会区域的权限检查
  2.         function forumdisplay_top_output()
  3.         {
  4.                 global $adminid,$discuz_uid;
  5.                 if($this->selForum['famid']>0 )
  6.                 {
  7.                         require_once "./plugins/family/family.class.php";
  8.                         $family=new familyClass();
  9.                         $MyFamily=$family->CheckUserInFamliy($discuz_uid);
  10.                         if (!$MyFamily)
  11.                                 $this->_ShowMSGDialog("本板块为公会专属板块,仅供公会内部成员使用");
  12.                         else
  13.                                 if ($MyFamily[fmid]!=$this->selForum['famid'] || $MyFamily["status"]=="waitJoin" || $MyFamily["status"]=="waitExit")
  14.                                         $this->_ShowMSGDialog("你不是本板块所属公会的正式会员,不能进入这个板块");
  15.                 }
  16.         }
  17. //___此处我非常想使用showmessage函数,但是不行,会出现错误
  18.         function _ShowMSGDialog($msg)
  19.         {
  20.                 echo  ("<script>");
  21.                 echo ("alert('".$msg."');");
  22.                 echo ("history.back();");
  23.                 echo ("</script>");

  24.         }
  25.        
复制代码
回复

使用道具 举报

 楼主| 选峰工作室 发表于 2010-2-3 10:10:51 | 显示全部楼层
回复 7# host


    不能在页面嵌入内使用showmessage,可能会引起死循环。
回复

使用道具 举报

host 发表于 2010-2-3 15:13:39 | 显示全部楼层
回复  host


    不能在页面嵌入内使用showmessage,可能会引起死循环。
选峰工作室 发表于 2010-02-03 10:10



    确实存在这个问题,那么我该怎么做呢?
回复

使用道具 举报

ilei365 发表于 2010-2-9 03:40:38 | 显示全部楼层
这个要顶了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-6-2 11:03 , Processed in 0.106882 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表