Opanowanie hookow PrestaShop: przewodnik dla deweloperow dla wersji 1.7, 8.x i 9.x
Hooki to sposób, w jaki moduły wchodzą w interakcję z PrestaShop bez modyfikowania plików rdzenia. Zrozumienie, którego hooka użyć, kiedy się uruchamia i jakie dane dostarcza, to wiedza niezbędna dla każdego programisty PrestaShop. Ta referencja obejmuje hooki, których będziesz używać najczęściej.
Hooki wyświetlania vs. hooki akcji
PrestaShop ma dwa typy hooków:
- Hooki wyświetlania (prefiks:
display) — renderują treść w określonych miejscach na stronie. Twoja metoda hooka zwraca HTML. Przykład:displayHeader,displayProductAdditionalInfo - Hooki akcji (prefiks:
action) — uruchamiane, gdy coś się dzieje. Twoja metoda hooka wykonuje logikę, ale nie zwraca niczego widocznego. Przykład:actionCartSave,actionOrderStatusPostUpdate
Hooki wyświetlania front office
Struktura strony
displayHeader— wewnątrz<head>. Dodawaj CSS, meta tagi, odniesienia do JS. Uruchamia się na każdej stronie frontowej.displayTop/displayNavFullWidth— obszar górnej nawigacji. Banery, ogłoszenia.displayHome— obszar treści strony głównej. Wyróżnione produkty, slidery, promocje.displayFooter/displayFooterBefore— treść stopki. Zapis na newsletter, znaki zaufania.
Strona produktu
displayProductAdditionalInfo— pod przyciskiem dodaj do koszyka. Szacowany czas dostawy, ostrzeżenia o stanach.displayProductExtraContent— dodaje zakładki do strony produktu. Zwraca obiektPrestaShop\PrestaShop\Core\Product\ProductExtraContent.displayAfterProductThumbs— pod zdjęciami produktu. Dodatkowe media, widoki 360 stopni.displayProductListReviews— w listach produktów, pod każdym produktem. Oceny gwiazdkowe.
Koszyk i kasa
displayShoppingCartFooter— pod tabelą koszyka. Sugestie cross-sell.displayPaymentReturn— strona potwierdzenia zamówienia. Wiadomości z podziękowaniem, informacje o śledzeniu.displayOrderConfirmation— również na potwierdzeniu zamówienia. Skrypty śledzenia analityki.
Kluczowe hooki akcji
Zdarzenia koszyka
actionCartSave— uruchamia się po każdej modyfikacji koszyka. Używaj do sprawdzania stanów w czasie rzeczywistym lub przeliczania cen.actionCartUpdateQuantityBefore— przed zmianami ilości. Pozwala walidować lub blokować zmianę.
Zdarzenia zamówień
actionValidateOrder— uruchamia się przy tworzeniu zamówienia. Zawiera pełny obiekt zamówienia, koszyk, klienta i walutę.actionOrderStatusPostUpdate— po zmianie statusu zamówienia. Wyzwalaj powiadomienia, aktualizuj systemy zewnętrzne, koryguj stany.actionPaymentConfirmation— gdy płatność zostanie potwierdzona. Różni się od walidacji zamówienia dla metod płatności z odroczeniem.
Zdarzenia klientów
actionCustomerAccountAdd— rejestracja nowego klienta. Synchronizacja z CRM, wyzwolenie powitalnego e-maila.actionAuthentication— logowanie klienta. Aktualizacja ostatniego logowania, synchronizacja danych sesji.
Zdarzenia produktów
actionProductSave— produkt utworzony lub zaktualizowany. Synchronizacja z feedami, aktualizacja cache.actionProductDelete— produkt usunięty. Sprzątanie powiązanych danych modułu.actionUpdateQuantity— zmiany stanów magazynowych. Wyzwalanie alertów o niskim stanie, aktualizacja dostępności.
Hooki dynamiczne (PS 1.7.7+)
PrestaShop generuje hooki dynamicznie na podstawie encji i akcji:
action{Entity}{Action}Before
action{Entity}{Action}After
Na przykład: actionProductFormBuilderModifier pozwala dodawać pola do formularza edycji produktu w panelu administracyjnym.
Hook setMedia
actionFrontControllerSetMedia to właściwe miejsce do rejestracji plików CSS i JavaScript. W odróżnieniu od displayHeader, uruchamia się przed renderowaniem strony i dostarcza kontekst kontrolera: Dla mniej technicznego przeglądu przeczytaj nasz przewodnik jak moduły komunikują się ze sklepem przez hooki. Moduł wydajności pomoże zidentyfikować wolne hooki.
public function hookActionFrontControllerSetMedia($params)
{
$controller = $this->context->controller;
if ($controller instanceof ProductController) {
$this->context->controller->registerStylesheet(
'my-module-css',
'modules/' . $this->name . '/views/css/product.css'
);
}
}
Typowe pułapki
- Ciężkie zapytania bazodanowe w hookach wyświetlania — hooki wyświetlania uruchamiają się przy każdym załadowaniu strony. Cache'uj swoje zapytania lub używaj lazy loading.
- Rejestrowanie hooków, których nie używasz — każdy zarejestrowany hook dodaje narzut, nawet jeśli metoda nic nie zwraca.
- Zapomnienie o
registerHook()winstall()— hooki muszą być zarejestrowane podczas instalacji modułu. Brak tego to przyczyna nr 1, dlaczego hooki nie działają. - Brak sprawdzania klasy kontrolera — jeśli Twój hook powinien działać tylko na stronach produktów, sprawdź
instanceof ProductControllerprzed wykonaniem pracy.
Hooki są potężne, ale wymagają dyscypliny. Używaj odpowiedniego hooka do odpowiedniego zadania, utrzymuj swoje metody hooków szybkimi i zawsze testuj z włączonym cache, aby wcześnie wyłapać problemy z wydajnością. Nasz moduł Checkout Revolution wykorzystuje wiele z tych hooków do stworzenia zoptymalizowanego procesu zakupowego.
Komentarze (2)
Zostaw komentarz