Efektywne wykorzystanie haków PrestaShop w rozwoju modułów

Jeśli poświęciłeś trochę czasu na budowanie Moduły PrestaShopHooki to prawdopodobnie miejsce, w którym stoczyłeś większość swoich bitew. To sposób, w jaki Twój moduł komunikuje się z rdzeniem – sposób, w jaki podłączasz funkcjonalność bez otwierania pliku, którego nie powinieneś otwierać. Wiedza o ich istnieniu to jedno. Korzystanie z nich bez strzelania sobie w stopę to drugie.

Czym właściwie jest haczyk

Najprościej rzecz ujmując, hook to moment w działaniu PrestaShop, w którym zatrzymuje się i sprawdza, czy ktoś słucha. Jeśli Twój moduł jest zarejestrowany dla tego hooka, ma on szansę na odpowiedź.

Istnieją dwa typy, które warto rozróżnić: haki akcji i haki wyświetlania. Haki akcji służą do uruchamiania logiki powiązanej ze zdarzeniem, złożeniem zamówienia, zapisaniem produktu i tym podobnymi. Haki wyświetlania służą do wstrzykiwania kodu HTML w określone miejsca w witrynie sklepowej lub zapleczu. To rozróżnienie wpływa na sposób pisania metody. Haki akcji przetwarzają coś i zazwyczaj nie zwracają niczego znaczącego. Haki wyświetlania zwracają wyrenderowany kod HTML, który PrestaShop umieszcza na stronie.

Gdzie programiści popełniają błędy w rejestracji

Najczęstszym błędem na początku jest rejestrowanie haków w niewłaściwym miejscu lub w sposób nieuporządkowany. Rejestracja powinna być wpisana w ustawieniach modułu. zainstalować() metoda poprzez $this->registerHook()Możesz przekazać tablicę nazw haków w jednym wywołaniu — jest to o wiele bardziej przejrzyste niż łączenie powtarzających się wywołań.

Równie ważne: wyrejestruj ich z odinstaluj()Łatwo to pominąć i łatwo żałować. Osieroconych rejestracji hooków, które pozostały w bazie danych po usunięciu modułu, może w przyszłości prowadzić do naprawdę mylącego zachowania. Czysty wzorzec wygląda mniej więcej tak:

publiczny funkcjonować zainstalować()

{

    powrót roślina mateczna::zainstalować()

        && $to->rejestracja Hook(['displayHeader',

           'actionOrderStatusUpdate',

           'wyświetlProduktStopki']);

}


Podaj prawidłowe nazwy metod

PrestaShop rozwiązuje metody hooków zgodnie z konwencją: hookHookName(), z nazwą haka w formacie camelCase. Więc wyświetlNagłówek mapy do hookDisplayHeader(). Zepsuj wielkość liter, a PrestaShop po prostu pominie Twoją metodę, bez błędu, bez wpisu w dzienniku, bez niczego. 

To jeden z tych błędów, którego znalezienie może zająć zatrważająco dużo czasu na debugowaniu.

Każda metoda haka otrzymuje $paramy Tablica. To, co się w niej znajduje, zależy wyłącznie od tego, który hak ją uruchomił. Podczas tworzenia, zrzuć $paramy raz, zanim napiszesz jakąkolwiek prawdziwą logikę. Dokumentacja stanowi dobry punkt wyjścia, ale nie zawsze odzwierciedla to, co faktycznie jest przekazywane.

 

Prawidłowe obchodzenie się z hakami ekspozycyjnymi

W przypadku haków wyświetlania standardowym podejściem jest przypisanie zmiennych do Smarty i zwrócenie danych wyjściowych $this->display() wskazując na .tpl plik. Zachowaj swoje szablony w widoki/szablony/hak/ wewnątrz modułu obowiązuje konwencjonalna struktura, dzięki której nawigacja staje się łatwiejsza w miarę rozrastania się modułu.

Warto podkreślić jeden szczegół: zawsze powrót Nigdy nie powtarzaj danych wyjściowych. System hooków zbiera wartości zwracane i umieszcza je w odpowiednim miejscu w układzie. Jeśli użyjesz bezpośredniego powtórzenia, dane wyjściowe pojawią się na górze strony, niezależnie od tego, gdzie faktycznie znajduje się hook.

Kiedy wbudowane haki nie wystarczają

Natywne hooki PrestaShop obejmują wiele obszarów, ale zdarzają się sytuacje — zwłaszcza podczas tworzenia modułów przeznaczonych do rozbudowy — w których potrzebujesz czegoś bardziej ukierunkowanego. Możesz zarejestrować niestandardowy hook za pomocą Hook::register() i wystrzel go używając Hook::exec() z dowolnego miejsca w bazie kodu.

Niestandardowe hooki są szczególnie przydatne w projektach wielomodułowych. Zamiast modułów wywołujących się bezpośrednio, udostępniasz hook i pozwalasz innym modułom reagować niezależnie. Dzięki temu architektura pozostaje przejrzysta, a przyszłe zmiany są znacznie mniej uciążliwe.

Nie ignoruj ​​strony wydajnościowej

Łatwo jest niedoszacować, jak wielkie szkody może wyrządzić źle zoptymalizowana metoda haka. Haki takie jak wyświetlNagłówek uruchamiają się przy niemal każdym załadowaniu strony. Jeśli Twoja metoda korzysta z bazy danych lub wywołuje zewnętrzne API bez buforowania, szybkość ładowania strony znacznie spada — a Twoi klienci zauważą to wcześniej niż Ty.

Kilka nawyków może się przydać. Buforuj wszystko, co nie zmienia się między żądaniami. Używaj wbudowanej warstwy pamięci podręcznej PrestaShop tam, gdzie to konieczne. A jeśli logika hooka działa tylko w określonych warunkach, sprawdź te warunki na początku metody i wróć wcześniej, jeśli nie są spełnione. To utrzymuje narzut na niskim poziomie, a kod jest czytelny.

Kiedy hak nie działa

Gdy coś nie działa zgodnie z oczekiwaniami, pierwszą rzeczą, którą należy sprawdzić, jest to, czy moduł jest rzeczywiście podłączony do haka. Przejdź do sekcji Moduły > Pozycje w zapleczu lub sprawdź bezpośrednio tabelę haków w bazie danych. Moduł może zostać zainstalowany, mimo że rejestracja haka nie powiodła się podczas konfiguracji.

Niestandardowe usługi programistyczne

Rozwiązania dostosowane do Twoich potrzeb od Knowband dla sukcesu Twojego eCommerce

Szukasz wydajnych i skalowalnych rozwiązań? Knowband oferuje profesjonalne usługi programistyczne, które pomogą Ci z łatwością tworzyć wydajne funkcje eCommerce.

✔ Tworzenie niestandardowych modułów
✔ Wtyczki eCommerce
✔ Integracja API
✔ Optymalizacja wydajności
✔ Integracja z rozwiązaniami innych firm

Warto również wziąć pod uwagę: kolejność wykonywania. Jeśli moduł we wcześniejszym etapie łańcucha zgłosi nieobsłużony wyjątek, PrestaShop może zatrzymać przetwarzanie wszystkich innych elementów w tym haku. Panel Pozycje pozwala dostosować kolejność, a czasami to wystarczy, aby naprawić coś, co wygląda na tajemniczo znikający hak.

Jedzenie na wynos

Haki to jest to, co tworzy Moduły PrestaShop Właściwie modułowe. Dobrze wykorzystane, pozwalają budować czyste integracje, które nie naruszają rdzenia ani innych modułów. Podstawy nie są skomplikowane: zarejestruj się w zainstalować(), precyzyjnie nazywaj swoje metody, wracaj z haków wyświetlania, buforuj haki o dużym natężeniu ruchu i sięgaj po niestandardowe haki, gdy wbudowany zestaw okaże się niewystarczający.

Gdy stanie się to nawykiem, proces rozwoju stanie się o wiele płynniejszy, a baza kodu pozostanie czymś, do czego będziesz chciał później wracać

At KnowbandNasz zespół programistów regularnie pracuje ze złożonymi architekturami modułów PrestaShop, gdzie efektywne wykorzystanie hooków ma kluczowe znaczenie dla wydajności i skalowalności. Jeśli chcesz przyspieszyć rozwój lub wdrożyć zaawansowane funkcje, skorzystanie z profesjonalnie zaprojektowanych modułów i rozwiązań może zaoszczędzić Ci czasu i wysiłku.

Jak korzystać z systemu nadpisywania w PrestaShop bez naruszania rdzenia

System nadpisywania w PrestaShop pozwala dostosować działanie rdzenia bez ingerencji w oryginalne pliki. Jednak nieostrożne jego użycie prowadzi do powstania niestabilnych sklepów, które przestają działać po aktualizacjach. Ten poradnik Knowbanda omawia, jak działają nadpisywania, kiedy ich używać i trzy kluczowe pułapki, które powinien znać każdy programista.

Czym jest system nadrzędny?

PrestaShop wykorzystuje dziedziczenie PHP, aby umożliwić Ci podmianę dowolnej klasy podstawowej bez ingerencji w oryginały. Każda klasa podstawowa ma nazwę z sufiksem Core, na przykład ProductCore. Jeśli utworzysz plik /override/classes/Product.php z klasą o nazwie Product, która rozszerza ProductCore, PrestaShop załaduje Twoją wersję. To samo dotyczy kontrolerów.

Nadpisuj tylko te metody, które chcesz zmienić, nigdy nie kopiuj całego pliku klasy. Dzięki temu nadpisanie będzie prostsze i znacznie zmniejszy się ryzyko kolizji z przyszłymi aktualizacjami.

Przykład: ujawnienie bieżącej nazwy kontrolera w szablonie nagłówka:

Gdzie umieścić pliki nadrzędne

Nadpisania mogą znajdować się w dwóch miejscach. Globalny katalog /override/ w katalogu głównym instalacji jest aktywny natychmiast po wyczyszczeniu pamięci podręcznej. Lepszym rozwiązaniem jest umieszczenie nadpisań w module.

Umieszczenie nadpisu w module (np. /modules/mymodule/override/classes/Product.php) powoduje, że PrestaShop kopiuje go do /override/ podczas instalacji i usuwa bezproblemowo podczas deinstalacji. Jest to zalecane podejście.

Szybki przykład nadpisania klasy. Załóżmy, że chcesz udostępnić nazwę bieżącego kontrolera w szablonie nagłówka:

// /override/classes/controllers/FrontController.php

klasa FrontController rozszerza FrontControllerCore {

    funkcja publiczna initHeader() {

        self::$smarty->assign('currentController', get_class($this));

        zwróć nadrzędny::initHeader();

    } }

Zawsze wywołuj metodę nadrzędną, chyba że masz ku temu celowy powód. Pominięcie jej spowoduje przerwanie działania podstawowej funkcjonalności.

Nadpisywanie klas modułów i kontrolerów

Od PrestaShop 1.6 można również nadpisywać klasy modułów. Dodaj „Override” do nazwy klasy (np. BlockUserInfoOverride rozszerzające BlockUserInfo) i umieść ją w katalogu /override/modules/. To samo dotyczy kontrolerów modułów. Po każdym nadpisaniu wyczyść pamięć podręczną, a konkretnie usuń plik /cache/class_index.php, w przeciwnym razie nie zostanie ono uwzględnione.

Kiedy NIE używać nadpisów

Nadpisania są wyłączne — może istnieć tylko jedno na klasę. Są one również zabronione w modułach marketplace i powinny być zarezerwowane dla prywatnych dostosowań sklepu. Zanim sięgniesz po nadpisania, rozważ jedną z poniższych alternatyw:

  • Haczyki: PrestaShop uruchamia zdarzenia hook przy każdym ładowaniu strony — możesz z nich korzystać z poziomu modułu, aby uruchamiać niestandardowy kod lub umieszczać treść na stronie bez konieczności korzystania z klasy podstawowej.
  • Nadpisania usługi Symfony: Części PrestaShop, które zostały zmigrowane do Symfony, zapewniają bardziej przejrzystą ścieżkę przez kontener usług. Dekorujesz lub zastępujesz usługę, zamiast deptać samą klasę.
  • Niestandardowy model obiektu: Potrzebujesz dodać pola do encji głównej? Zbuduj własny ObjectModel z własną tabelą, zamiast łatać istniejący.

Zachowywanie bezpieczeństwa nadpisów poprzez aktualizacje

Aktualizacje PrestaShop mogą po cichu zmieniać sygnatury metod, pozostawiając nadpisanie działające na podstawie nieaktualnych założeń. Traktuj każde nadpisanie jako coś, do czego należy wracać po każdej aktualizacji. Skomentuj zmiany i ich uzasadnienie, sprawdź dziennik zmian i staraj się, aby nadpisanie było jak najmniejsze. Wąskie, dobrze skomentowane nadpisanie, które poprawnie wywołuje metody nadrzędne, przetrwa aktualizacje. Pełna kopia klasy to błąd, który tylko czeka, aby się ujawnić.

Pamięć podręczna „Ghost”: dlaczego Twoja nadpisana pamięć wydaje się niewidoczna

Najczęstszy powód, dla którego programiści uważają, że ich nadpisanie jest uszkodzone: PrestaShop nie skanuje pliku /override/ przy każdym żądaniu. Kompiluje mapę klas do pliku /cache/class_index.php i dopóki ten plik nie zostanie usunięty i wygenerowany ponownie, nadpisanie jest niewidoczne, niezależnie od poprawności kodu. Wyczyszczenie pamięci podręcznej Smarty nie wystarczy. Usuń plik class_index.php ręcznie przez FTP/SSH, w zakładce Parametry zaawansowane > Wydajność w panelu administracyjnym lub za pomocą konsoli Symfony.

Rysunek 1: Przepływ informacji w systemie nadpisywania PrestaShop i rola pliku /cache/class_index.php.

 

The Symfony Wall: starsze nadpisy nie działają w przypadku nowoczesnych kontrolerów

Ten starszy system PHP działa tylko na starszej warstwie ObjectModel PrestaShop. Od PS 1.7 kluczowe obszary zaplecza, w tym nowa strona produktu i ekrany zamówień, zostały przepisane w Symfony. System nadpisywania kodu PHP nie ma wpływu na te kontrolery Symfony. Dla tych użyj Dekoracja serwisowa, opakowanie lub zastąpienie usługi za pomocą pliku services.yml modułu. Jeśli nadpisanie nie daje efektu nawet po wyczyszczeniu pliku class_index.php, kontroler prawdopodobnie został zmigrowany przez Symfony.

Rozwiązywanie konfliktów: gdy dwa moduły chcą tej samej klasy

Gdy dwa moduły nadpisują tę samą klasę, PrestaShop zgłasza błąd podczas drugiej instalacji i pozostawia nadpisanie nieaktywne. Rozwiązanie jest ręczne: otwórz oba pliki, scal wszystkie metody w jeden plik /override/, który rozszerza klasę Core, a następnie usuń plik class_index.php. Dodaj komentarze identyfikujące moduły, które wniosły każdą metodę. Właśnie dlatego nadpisania są zakazane w modułach na platformie sprzedażowej – konflikty stają się problemem dla sprzedawcy. Jeśli tworzysz dla innych, używaj hooków.

Rysunek 2: Jak powstają konflikty nadpisywania, gdy dwa moduły są przeznaczone dla tej samej klasy, oraz jak rozwiązać ręczne scalanie.

O Knowbandie

Knowband to zaufany dostawca wtyczek i rozszerzeń do handlu elektronicznego z wieloletnim doświadczeniem w pomaganiu sprzedawcom internetowym w budowaniu szybszych, inteligentniejszych i bogatszych w funkcje sklepów. Niezależnie od tego, czy prowadzisz swój sklep na PrestaShop, OpenCart, Shopify, WooCommerce, Magentolub dowolnej innej dużej platformie, Knowband oferuje szeroką gamę gotowych do użycia wtyczek i rozszerzeń, które pomogą Ci zwiększyć funkcjonalność, poprawić wydajność i zapewnić lepsze wrażenia zakupowe, bez konieczności budowania wszystkiego od podstaw.