跳到主要內容
文件

開發者指南

事件(觸發器)

核心與各模組會在主要動作的前後觸發事件(觸發器)。第三方模組可以介入其中,在不修改核心的情況下擴充行為。

運作原理

  • 大部分事件會以 before 與 after 一組,觸發兩次。
  • before:作業執行前。若處理常式回傳錯誤(BaseObject 失敗),就能中止作業。
  • after:作業完成後。回傳值通常會被忽略。用於後續處理(傳送通知、更新快取等)。

註冊處理常式

在 module.xml 中宣告,執行模組更新後即完成註冊。

<eventHandlers>
	<eventHandler before="document.insertDocument" class="Controllers\Trigger" method="beforeInsertDocument" />
	<eventHandler after="document.insertDocument" class="Controllers\Trigger" method="afterInsertDocument" />
</eventHandlers>
<?php

namespace Zittme\Modules\Mymodule\Controllers;

class Trigger extends Base
{
	// $obj 에 대상 데이터(문서 등)가 참조로 들어옵니다
	public function afterInsertDocument(&$obj)
	{
		try
		{
			// 예: 새 글 등록 시 외부 알림
		}
		catch (\Throwable $e)
		{
			// 전역 트리거에서 내 모듈 사정으로 코어를 죽이지 않는다
		}
	}
}

主要事件

完整列表十分龐大,這裡只列出各類別的代表事件。命名規則是 module.action。

請求生命週期

事件時機
moduleHandler.init準備處理請求
moduleObject.proc動作執行前後
act:module.actionName以特定動作為單位介入
display最終輸出之前

文章・留言

document.insertDocument document.updateDocument document.deleteDocument document.moveDocumentToTrash document.getDocumentList / comment.insertComment comment.updateComment comment.deleteComment 等

會員

member.insertMember member.updateMember member.deleteMember member.doLogin member.doLogout member.addMemberToGroup 等

檔案・其他

file.insertFile file.deleteFile file.downloadFile / communication.sendMessage / point.setPoint / menu.getModuleListInSitemap(要讓自己的模組出現在新增選單畫面的模組列表時)

找到正確事件的方法

程式碼比文件更準確。請直接在核心中尋找觸發事件的位置。

grep -rn "triggerCall('찾을이름" modules/ classes/

查看 ModuleHandler::triggerCall('name', 'before|after', $obj) 的呼叫處,就能確認哪些資料會以 $obj 傳入。

撰寫守則

  • 處理常式會在每一次相關動作時執行。請保持輕量,繁重的工作應先縮小條件再進行。
  • 不要把例外往外拋。不能因為您模組自身的狀況,讓發文・登入等核心動作中斷。
  • 只有要在 before 中止時才回傳錯誤,在 after 中不要依賴回傳值。