Hooks and Events
Overview
Section titled “Overview”XOOPS provides hooks and events as extension points that allow modules to interact with core functionality and each other without direct dependencies.
Hooks vs Events
Section titled “Hooks vs Events”| Aspect | Hooks | Events |
|---|---|---|
| Purpose | Modify behavior/data | React to occurrences |
| Return | Can return modified data | Typically void |
| Timing | Before/during action | After action |
| Pattern | Filter chain | Observer/pub-sub |
Hook System
Section titled “Hook System”Registering Hooks
Section titled “Registering Hooks”// Register a hook in xoops_version.php$modversion['hooks'][] = [ 'name' => 'user.profile.display', 'callback' => 'mymodule_hook_user_profile', 'priority' => 10,];Hook Callback
Section titled “Hook Callback”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;}Available Core Hooks
Section titled “Available Core Hooks”| Hook Name | Data | Description |
|---|---|---|
user.profile.display | User data array | Modify profile display |
content.render | Content HTML | Filter content output |
form.submit | Form data | Validate/modify form data |
search.results | Results array | Filter search results |
menu.main | Menu items | Modify main menu |
Event System
Section titled “Event System”Dispatching Events
Section titled “Dispatching Events”// In your module code$eventHandler = xoops_getHandler('event');
$eventHandler->trigger('mymodule.article.created', [ 'article_id' => $article->id(), 'author_id' => $article->authorId(), 'title' => $article->title(),]);Listening for Events
Section titled “Listening for Events”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); }}Preload Events Reference
Section titled “Preload Events Reference”Core Events
Section titled “Core Events”// 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 {}User Events
Section titled “User Events”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 Events
Section titled “Module Events”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 {}Custom Module Events
Section titled “Custom Module Events”Defining Events
Section titled “Defining Events”// 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';}Triggering Events
Section titled “Triggering Events”class ArticleService{ public function publish(Article $article): void { $article->publish(); $this->repository->save($article);
// Trigger event $GLOBALS['xoopsPreload']->triggerEvent( ArticleEvents::PUBLISHED, ['article' => $article] ); }}Listening to Module Events
Section titled “Listening to Module Events”// 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());}Best Practices
Section titled “Best Practices”- Use Specific Names -
module.entity.actionformat - Pass Minimal Data - Only what listeners need
- Document Events - List events in module docs
- Avoid Side Effects - Keep listeners focused
- Handle Errors - Don’t let listener errors break flow
Related Documentation
Section titled “Related Documentation”- Event-System - Detailed event documentation
- ../03-Module-Development/Module-Development - Module development
- ../07-XOOPS-4.0/Implementation-Guides/Event-System-Guide - PSR-14 events