2017-07-14 31 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

相關問題