2017-07-14 20 views
0

我编写Dokuwiki插件的第一次尝试是针对动作事件,当编辑后的页面被保存到磁盘时。我写了一个动作插件类,它扩展了DokuWiki_Action_Plugin;它包含一个register方法与控制器注册了两个挂钩:为什么在保存操作中多次调用Dokuwiki IO_WIKIPAGE_SAVE动作插件?

$controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_pagewrite_before', array()); 
$controller->register_hook('IO_WIKIPAGE_WRITE', 'AFTER', $this, 'handle_pagewrite_after', array()); 

(“之前”方法被调用页面的内容被写入之前,和方法“后”被称为它的写法后)

我已经写了两种方法handle_pagewrite_beforehandle_pagewrite_after的存根。我在所有三个存根中放入dbglog调用来记录进入和退出。

从维基,我访问一个页面,并编辑它。在这一点上我看到三个来自register方法的调试消息出现在data/cache/debug.log中。在我编辑的第一次按键时,出现register的第四条调试消息。当我点击保存保存该页面时,会出现第五个register消息,然后是来自挂钩的两组消息,其中我预期只有一个消息,随后是更多register消息。总之,

21:32:34 10.0.1.24: Enter gloss:action:register 
21:32:34 10.0.1.24: Enter gloss:action:register 
21:32:34 10.0.1.24: Enter gloss:action:register 
21:33:56 10.0.1.24: Enter gloss:action:register 
21:35:46 10.0.1.24: Enter gloss:action:register 
21:35:46 10.0.1.24: Enter gloss:action:handle_pagewrite_before 
21:35:46 10.0.1.24: Exit gloss:action:handle_pagewrite_before 
21:35:46 10.0.1.24: Enter gloss:action:handle_pagewrite_after 
21:35:46 10.0.1.24: Exit gloss:action:handle_pagewrite_after 
21:35:46 10.0.1.24: Enter gloss:action:handle_pagewrite_before 
21:35:46 10.0.1.24: Exit gloss:action:handle_pagewrite_before 
21:35:46 10.0.1.24: Enter gloss:action:handle_pagewrite_after 
21:35:46 10.0.1.24: Exit gloss:action:handle_pagewrite_after 
21:35:46 10.0.1.24: Enter gloss:action:register 
21:35:46 10.0.1.24: Enter gloss:action:register 
21:35:47 10.0.1.24: Enter gloss:action:register 

为什么有这么多看似多余的电话?这是正常的吗?

回答

2

每次插件系统初始化时,都会调用您的插件的注册方法。由于PHP是基于请求的,每次请求都会发生。加载页面会创建多个请求(页面,JS调度程序,CSS调度程序,索引webbug,ajax调用等)。

你的第二个问题是在这里找到答案:

在更新现有页面此事件被称为两次,一次为旧版本转移到阁楼(REV将有一个值)和一次写网页的新版本到维基(REV为false)

https://www.dokuwiki.org/devel:event:io_wikipage_write

相关问题