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.
