Haki i zdarzenia
Przegląd
Dział zatytułowany „Przegląd”XOOPS zapewnia haki i zdarzenia jako punkty rozszerzenia, które pozwalają modułom wchodzić w interakcję z funkcjonalością rdzeniową i sobą nawzajem bez bezpośrednich zależności.
Haki vs zdarzenia
Dział zatytułowany „Haki vs zdarzenia”| Aspekt | Haki | Zdarzenia |
|---|---|---|
| Cel | Modyfikuj zachowanie/dane | Reaguj na zdarzenia |
| Zwrot | Może zwrócić zmodyfikowane dane | Zazwyczaj void |
| Timing | Przed/podczas akcji | Po akcji |
| Wzorzec | Łańcuch filtrów | Observer/pub-sub |
System haków
Dział zatytułowany „System haków”Rejestracja haków
Dział zatytułowany „Rejestracja haków”// Zarejestruj hak w xoops_version.php$modversion['hooks'][] = [ 'name' => 'user.profile.display', 'callback' => 'mymodule_hook_user_profile', 'priority' => 10,];Callback haku
Dział zatytułowany „Callback haku”function mymodule_hook_user_profile(array $data): array{ $userId = $data['user_id'];
// Dodaj niestandardowe pola profilu $data['fields']['reputation'] = mymodule_get_user_reputation($userId); $data['fields']['badges'] = mymodule_get_user_badges($userId);
return $data;}Dostępne haki rdzeniowe
Dział zatytułowany „Dostępne haki rdzeniowe”| Nazwa haku | Dane | Opis |
|---|---|---|
user.profile.display | Tablica danych użytkownika | Modyfikuj wyświetlanie profilu |
content.render | HTML zawartości | Filtruj wyjście zawartości |
form.submit | Dane formularza | Waliduj/modyfikuj dane formularza |
search.results | Tablica wyników | Filtruj wyniki wyszukiwania |
menu.main | Elementy menu | Modyfikuj menu główne |
System zdarzeń
Dział zatytułowany „System zdarzeń”Dyspozycja zdarzeń
Dział zatytułowany „Dyspozycja zdarzeń”// W kodzie twojego modułu$eventHandler = xoops_getHandler('event');
$eventHandler->trigger('mymodule.article.created', [ 'article_id' => $article->id(), 'author_id' => $article->authorId(), 'title' => $article->title(),]);Słuchanie zdarzeń
Dział zatytułowany „Słuchanie zdarzeń”class MyModulePreload extends \Xmf\Module\Helper\AbstractHelper{ public function eventMymoduleArticleCreated(array $args): void { $articleId = $args['article_id'];
// Powiadom subskrybentów $this->notifyNewArticle($articleId); }
public function eventUserLogin(array $args): void { $userId = $args['userid'];
// Aktualizuj aktywność użytkownika dla modułu $this->updateUserActivity($userId); }}Referencja zdarzeń Preload
Dział zatytułowany „Referencja zdarzeń Preload”Zdarzenia rdzeniowe
Dział zatytułowany „Zdarzenia rdzeniowe”// Nagłówek/stopkapublic function eventCoreHeaderStart(array $args): void {}public function eventCoreHeaderEnd(array $args): void {}public function eventCoreFooterStart(array $args): void {}public function eventCoreFooterEnd(array $args): void {}
// Includepublic function eventCoreIncludeCommonStart(array $args): void {}public function eventCoreIncludeCommonEnd(array $args): void {}
// Wyjątkipublic function eventCoreException(array $args): void {}Zdarzenia użytkownika
Dział zatytułowany „Zdarzenia użytkownika”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 {}Zdarzenia modułu
Dział zatytułowany „Zdarzenia modułu”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 {}Niestandardowe zdarzenia modułu
Dział zatytułowany „Niestandardowe zdarzenia modułu”Definiowanie zdarzeń
Dział zatytułowany „Definiowanie zdarzeń”// Zdefiniuj stałe zdarzeń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';}Wyzwalanie zdarzeń
Dział zatytułowany „Wyzwalanie zdarzeń”class ArticleService{ public function publish(Article $article): void { $article->publish(); $this->repository->save($article);
// Wyzwól zdarzenie $GLOBALS['xoopsPreload']->triggerEvent( ArticleEvents::PUBLISHED, ['article' => $article] ); }}Słuchanie zdarzeń modułu
Dział zatytułowany „Słuchanie zdarzeń modułu”// W Preload.php innego modułu
public function eventMymoduleArticlePublished(array $args): void{ $article = $args['article'];
// Indeksuj dla wyszukiwania $this->searchIndexer->index($article);
// Aktualizuj mapę witryny $this->sitemapGenerator->addUrl($article->url());}Najlepsze praktyki
Dział zatytułowany „Najlepsze praktyki”- Używaj specyficznych nazw - format
module.entity.action - Przekazuj minimalne dane - Tylko to, czego potrzebują nasłuchiwacze
- Dokumentuj zdarzenia - Wypisz zdarzenia w dokumentacji modułu
- Unikaj efektów ubocznych - Utrzymuj nasłuchiwaczy skoncentrowanych
- Obsługuj błędy - Nie pozwól, aby błędy nasłuchiwaczy przerywały przepływ
Powiązana dokumentacja
Dział zatytułowany „Powiązana dokumentacja”- Event-System - Szczegółowa dokumentacja zdarzeń
- ../03-Module-Development/Module-Development - Tworzenie modułu
- ../07-XOOPS-4.0/Implementation-Guides/Event-System-Guide - Zdarzenia PSR-14