Aller au contenu

Crochets et événements

XOOPS fournit des crochets et des événements comme points d’extension qui permettent aux modules d’interagir avec les fonctionnalités principales et entre eux sans dépendances directes.

AspectCrochetsÉvénements
ObjectifModifier le comportement/donnéesRéagir aux occurrences
RetourPeut retourner des données modifiéesGénéralement vide
TimingAvant/pendant l’actionAprès l’action
MotifChaîne de filtresObserver/pub-sub
// Register a hook in xoops_version.php
$modversion['hooks'][] = [
'name' => 'user.profile.display',
'callback' => 'mymodule_hook_user_profile',
'priority' => 10,
];
include/hooks.php
function mymodule_hook_user_profile(array $data): array
{
$userId = $data['user_id'];
// Add custom profile fields
$data['fields']['reputation'] = mymodule_get_user_reputation($userId);
$data['fields']['badges'] = mymodule_get_user_badges($userId);
return $data;
}
Nom du crochetDonnéesDescription
user.profile.displayTableau de données utilisateurModifier l’affichage du profil
content.renderHTML du contenuFiltrer la sortie de contenu
form.submitDonnées du formulaireValider/modifier les données du formulaire
search.resultsTableau des résultatsFiltrer les résultats de recherche
menu.mainÉléments de menuModifier le menu principal
// In your module code
$eventHandler = xoops_getHandler('event');
$eventHandler->trigger('mymodule.article.created', [
'article_id' => $article->id(),
'author_id' => $article->authorId(),
'title' => $article->title(),
]);
class/Preload.php
class MyModulePreload extends \Xmf\Module\Helper\AbstractHelper
{
public function eventMymoduleArticleCreated(array $args): void
{
$articleId = $args['article_id'];
// Notify subscribers
$this->notifyNewArticle($articleId);
}
public function eventUserLogin(array $args): void
{
$userId = $args['userid'];
// Update last login for module
$this->updateUserActivity($userId);
}
}
// Header/Footer
public function eventCoreHeaderStart(array $args): void {}
public function eventCoreHeaderEnd(array $args): void {}
public function eventCoreFooterStart(array $args): void {}
public function eventCoreFooterEnd(array $args): void {}
// Includes
public function eventCoreIncludeCommonStart(array $args): void {}
public function eventCoreIncludeCommonEnd(array $args): void {}
// Exceptions
public function eventCoreException(array $args): void {}
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 {}
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 {}
// Define event constants
class 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';
}
class ArticleService
{
public function publish(Article $article): void
{
$article->publish();
$this->repository->save($article);
// Trigger event
$GLOBALS['xoopsPreload']->triggerEvent(
ArticleEvents::PUBLISHED,
['article' => $article]
);
}
}
// In another module's Preload.php
public function eventMymoduleArticlePublished(array $args): void
{
$article = $args['article'];
// Index for search
$this->searchIndexer->index($article);
// Update sitemap
$this->sitemapGenerator->addUrl($article->url());
}
  1. Utiliser des noms spécifiques - Format module.entity.action
  2. Passer des données minimales - Seulement ce dont les écouteurs ont besoin
  3. Documenter les événements - Lister les événements dans la documentation du module
  4. Éviter les effets secondaires - Garder les écouteurs concentrés
  5. Gérer les erreurs - Ne pas laisser les erreurs d’écouteur casser le flux
  • Event-System - Documentation d’événement détaillée
  • ../03-Module-Development/Module-Development - Développement de module
  • ../07-XOOPS-4.0/Implementation-Guides/Event-System-Guide - Événements PSR-14