Haken en evenementen
Overzicht
Section titled “Overzicht”XOOPS biedt hooks en gebeurtenissen als uitbreidingspunten waarmee modules kunnen communiceren met kernfunctionaliteit en met elkaar zonder directe afhankelijkheden.
Haken versus evenementen
Section titled “Haken versus evenementen”| Aspect | Haken | Evenementen |
|---|---|---|
| Doel | Gedrag/gegevens aanpassen | Reageren op gebeurtenissen |
| Terug | Kan gewijzigde gegevens retourneren | Typisch ongeldig |
| Tijdstip | Voor/tijdens actie | Na actie |
| Patroon | Filterketen | Waarnemer/pub-sub |
Haaksysteem
Section titled “Haaksysteem”Haken registreren
Section titled “Haken registreren”// Register a hook in xoops_version.php$modversion['hooks'][] = [ 'name' => 'user.profile.display', 'callback' => 'mymodule_hook_user_profile', 'priority' => 10,];Terugbellen op de haak
Section titled “Terugbellen op de haak”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;}Beschikbare kernhaken
Section titled “Beschikbare kernhaken”| Haaknaam | Gegevens | Beschrijving |
|---|---|---|
user.profile.display | Array gebruikersgegevens | Profielweergave aanpassen |
content.render | Inhoud HTML | Inhouduitvoer filteren |
form.submit | Formuliergegevens | Formuliergegevens valideren/wijzigen |
search.results | Resultatenmatrix | Zoekresultaten filteren |
menu.main | Menu-items | Hoofdmenu aanpassen |
Gebeurtenissysteem
Section titled “Gebeurtenissysteem”Verzendevenementen
Section titled “Verzendevenementen”// In your module code$eventHandler = xoops_getHandler('event');
$eventHandler->trigger('mymodule.article.created', [ 'article_id' => $article->id(), 'author_id' => $article->authorId(), 'title' => $article->title(),]);Luisteren naar gebeurtenissen
Section titled “Luisteren naar gebeurtenissen”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); }}Referentie voor vooraf geladen gebeurtenissen
Section titled “Referentie voor vooraf geladen gebeurtenissen”Kerngebeurtenissen
Section titled “Kerngebeurtenissen”// Header/Footerpublic function eventCoreHeaderStart(array $args): void {}public function eventCoreHeaderEnd(array $args): void {}public function eventCoreFooterStart(array $args): void {}public function eventCoreFooterEnd(array $args): void {}
// Includespublic function eventCoreIncludeCommonStart(array $args): void {}public function eventCoreIncludeCommonEnd(array $args): void {}
// Exceptionspublic function eventCoreException(array $args): void {}Gebruikersgebeurtenissen
Section titled “Gebruikersgebeurtenissen”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 {}Module-evenementen
Section titled “Module-evenementen”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 {}Aangepaste module-evenementen
Section titled “Aangepaste module-evenementen”Gebeurtenissen definiëren
Section titled “Gebeurtenissen definiëren”// Define event constantsclass 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';}Triggerende gebeurtenissen
Section titled “Triggerende gebeurtenissen”class ArticleService{ public function publish(Article $article): void { $article->publish(); $this->repository->save($article);
// Trigger event $GLOBALS['xoopsPreload']->triggerEvent( ArticleEvents::PUBLISHED, ['article' => $article] ); }}Luisteren naar modulegebeurtenissen
Section titled “Luisteren naar modulegebeurtenissen”// 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());}Beste praktijken
Section titled “Beste praktijken”- Gebruik specifieke namen -
module.entity.action-indeling - Geef minimale gegevens door - Alleen wat luisteraars nodig hebben
- Documentgebeurtenissen - Lijst gebeurtenissen in moduledocumenten
- Vermijd bijwerkingen - Houd de luisteraars gefocust
- Fouten afhandelen - Zorg ervoor dat luisteraarfouten de stroom niet verstoren
Gerelateerde documentatie
Section titled “Gerelateerde documentatie”- Event-System - Gedetailleerde gebeurtenisdocumentatie
- ../03-Module-ontwikkeling/Module-ontwikkeling - Module-ontwikkeling
- ../07-XOOPS-4.0/Implementatiehandleidingen/Event-System-Guide - PSR-14 gebeurtenissen