Eventos (triggers)
El núcleo y cada módulo disparan eventos (triggers) antes y después de sus acciones principales. Los módulos de terceros se enganchan ahí para ampliar el comportamiento sin modificar el núcleo.
Cómo funciona
- La mayoría de los eventos se disparan dos veces, como un par
beforeyafter. - before: antes de ejecutar la tarea. Si el handler devuelve un error (un BaseObject fallido), puede detener la tarea.
- after: después de completar la tarea. Normalmente se ignora el valor de retorno. Se usa para el procesamiento posterior (envío de notificaciones, actualización de caché, etc.).
Registrar un handler
Decláralo en module.xml y se registra al ejecutar la actualización del módulo.
<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)
{
// 전역 트리거에서 내 모듈 사정으로 코어를 죽이지 않는다
}
}
}Eventos principales
La lista completa es enorme, así que solo anotamos los representativos de cada categoría. La regla de nombres es module.action.
Ciclo de vida de la solicitud
| Evento | Momento |
|---|---|
moduleHandler.init | Preparación del procesamiento de la solicitud |
moduleObject.proc | Antes y después de ejecutar la acción |
act:module.actionName | Engancharse a una acción concreta |
display | Justo antes de la salida final |
Documentos y comentarios
document.insertDocument document.updateDocument document.deleteDocument document.moveDocumentToTrash document.getDocumentList / comment.insertComment comment.updateComment comment.deleteComment, etc.
Miembros
member.insertMember member.updateMember member.deleteMember member.doLogin member.doLogout member.addMemberToGroup, etc.
Archivos y otros
file.insertFile file.deleteFile file.downloadFile / communication.sendMessage / point.setPoint / menu.getModuleListInSitemap (para que tu módulo aparezca en la lista de módulos de la pantalla de agregar menú)
Cómo encontrar el evento exacto
El código es más exacto que la documentación. Busca directamente en el núcleo dónde se dispara el evento.
grep -rn "triggerCall('찾을이름" modules/ classes/En la llamada ModuleHandler::triggerCall('name', 'before|after', $obj) puedes ver exactamente qué datos se pasan en $obj.
Reglas para escribir handlers
- El handler se ejecuta en cada una de las acciones correspondientes. Mantenlo ligero y haz el trabajo pesado solo después de acotar las condiciones.
- No lances excepciones hacia fuera. Las acciones del núcleo, como publicar o iniciar sesión, no deben caerse por problemas de tu módulo.
- Devuelve un error solo cuando quieras detener la tarea en before, y no dependas del valor de retorno en after.