Ganchos y eventos
Descripción general
Sección titulada «Descripción general»XOOPS proporciona ganchos y eventos como puntos de extensión que permiten que los módulos interactúen con la funcionalidad principal y entre sí sin dependencias directas.
Ganchos vs Eventos
Sección titulada «Ganchos vs Eventos»| Aspecto | Ganchos | Eventos |
|---|---|---|
| Propósito | Modificar comportamiento/datos | Reaccionar a ocurrencias |
| Retorno | Puede devolver datos modificados | Típicamente nulo |
| Timing | Antes/durante acción | Después de la acción |
| Patrón | Cadena de filtros | Observer/pub-sub |
Sistema de ganchos
Sección titulada «Sistema de ganchos»Registrar ganchos
Sección titulada «Registrar ganchos»// Registrar un gancho en xoops_version.php$modversion['hooks'][] = [ 'name' => 'user.profile.display', 'callback' => 'mymodule_hook_user_profile', 'priority' => 10,];Gancho de devolución de llamada
Sección titulada «Gancho de devolución de llamada»function mymodule_hook_user_profile(array $data): array{ $userId = $data['user_id'];
// Agregar campos de perfil personalizados $data['fields']['reputation'] = mymodule_get_user_reputation($userId); $data['fields']['badges'] = mymodule_get_user_badges($userId);
return $data;}Ganchos principales disponibles
Sección titulada «Ganchos principales disponibles»| Nombre del gancho | Datos | Descripción |
|---|---|---|
user.profile.display | Matriz de datos de usuario | Modificar visualización de perfil |
content.render | HTML de contenido | Filtrar salida de contenido |
form.submit | Datos del formulario | Validar/modificar datos del formulario |
search.results | Matriz de resultados | Filtrar resultados de búsqueda |
menu.main | Elementos del menú | Modificar menú principal |
Sistema de eventos
Sección titulada «Sistema de eventos»Despachando eventos
Sección titulada «Despachando eventos»// En su código de módulo$eventHandler = xoops_getHandler('event');
$eventHandler->trigger('mymodule.article.created', [ 'article_id' => $article->id(), 'author_id' => $article->authorId(), 'title' => $article->title(),]);Escuchando eventos
Sección titulada «Escuchando eventos»class MyModulePreload extends \Xmf\Module\Helper\AbstractHelper{ public function eventMymoduleArticleCreated(array $args): void { $articleId = $args['article_id'];
// Notificar a los suscriptores $this->notifyNewArticle($articleId); }
public function eventUserLogin(array $args): void { $userId = $args['userid'];
// Actualizar último inicio de sesión para módulo $this->updateUserActivity($userId); }}Referencia de eventos de precarga
Sección titulada «Referencia de eventos de precarga»Eventos principales
Sección titulada «Eventos principales»// Encabezado/Pie de páginapublic function eventCoreHeaderStart(array $args): void {}public function eventCoreHeaderEnd(array $args): void {}public function eventCoreFooterStart(array $args): void {}public function eventCoreFooterEnd(array $args): void {}
// Inclusionespublic function eventCoreIncludeCommonStart(array $args): void {}public function eventCoreIncludeCommonEnd(array $args): void {}
// Excepcionespublic function eventCoreException(array $args): void {}Eventos de usuario
Sección titulada «Eventos de usuario»public function eventUserLogin(array $args): void {}public function eventUserLogout(array $args): void {}public function eventUserRegister(array $args): void {}public function eventUserActivate(array $args): void {}public function eventUserDelete(array $args): void {}Eventos del módulo
Sección titulada «Eventos del módulo»public function eventSystemModuleInstall(array $args): void {}public function eventSystemModuleUninstall(array $args): void {}public function eventSystemModuleUpdate(array $args): void {}public function eventSystemModuleActivate(array $args): void {}public function eventSystemModuleDeactivate(array $args): void {}Eventos personalizados del módulo
Sección titulada «Eventos personalizados del módulo»Definición de eventos
Sección titulada «Definición de eventos»// Definir constantes de eventoclass ArticleEvents{ public const CREATED = 'mymodule.article.created'; public const UPDATED = 'mymodule.article.updated'; public const DELETED = 'mymodule.article.deleted'; public const PUBLISHED = 'mymodule.article.published';}Desencadenar eventos
Sección titulada «Desencadenar eventos»class ArticleService{ public function publish(Article $article): void { $article->publish(); $this->repository->save($article);
// Desencadenar evento $GLOBALS['xoopsPreload']->triggerEvent( ArticleEvents::PUBLISHED, ['article' => $article] ); }}Escuchando eventos del módulo
Sección titulada «Escuchando eventos del módulo»// En el Preload.php de otro módulo
public function eventMymoduleArticlePublished(array $args): void{ $article = $args['article'];
// Índice para búsqueda $this->searchIndexer->index($article);
// Actualizar mapa del sitio $this->sitemapGenerator->addUrl($article->url());}Mejores prácticas
Sección titulada «Mejores prácticas»- Usar nombres específicos - Formato
módulo.entidad.acción - Pasar datos mínimos - Solo lo que necesitan los escuchadores
- Documentar eventos - Listar eventos en los documentos del módulo
- Evitar efectos secundarios - Mantener los escuchadores enfocados
- Manejar errores - No permitir que los errores de los escuchadores rompan el flujo
Documentación relacionada
Sección titulada «Documentación relacionada»- Sistema de eventos - Documentación detallada de eventos
- ../03-Module-Development/Module-Development - Desarrollo de módulos
- ../07-XOOPS-4.0/Implementation-Guides/Event-System-Guide - Eventos PSR-14