Override w PrestaShop to kopia klasy rdzenia umieszczona w katalogu /override/, którą sklep ładuje zamiast oryginału. Sięga się po niego dopiero wtedy, gdy hook nie wystarcza, bo trzeba zmienić logikę istniejącej metody. Problem polega na tym, że źle zrobiony override działa po cichu i ujawnia się dopiero przy aktualizacji albo przy konflikcie z innym modułem. Poniżej masz kryteria wyboru między override, hookiem i modułem, kolejność prac oraz listę kontrolną do przejścia przed wdrożeniem na produkcję.
Override to kopia klasy rdzenia PrestaShop umieszczona w katalogu /override/, którą sklep ładuje zamiast oryginału. Nazwa pliku musi być identyczna z nazwą klasy z rdzenia: Product.php nadpisuje classes/Product.php. Nie tworzysz pliku ProductCore.php — klasa Core zostaje nietknięta i służy jako klasa bazowa.
PrestaShop szuka override'ów w trzech miejscach:
/override/classes/ — klasy modeli i helperów: Product.php, Cart.php, Tools.php. Podkatalogi muszą odwzorować strukturę rdzenia, np. /override/classes/pdf/ przy zmianie generowania faktury./override/controllers/ — kontrolery frontowe i administracyjne, np. /override/controllers/front/ProductController.php./override/modules/ — klasy modułów. Tu pliki trafiają automatycznie, gdy instalujesz moduł, który sam używa override'ów.Skąd PrestaShop wie, który plik wczytać? Z indeksu klas w cache/class_index.php. To mapa: nazwa klasy → ścieżka pliku. Jeśli dodasz override i nie wyczyścisz tego indeksu, sklep nadal będzie używał wersji rdzeniowej — a Ty będziesz szukać błędu w kodzie, który w ogóle się nie wykonuje. Po każdej zmianie: Panel → Zaawansowane parametry → Wydajność → Wyczyść cache albo usunięcie pliku cache/class_index.php (odtworzy się przy pierwszym żądaniu). Szybka kontrola z terminala: ls -R override pokaże, co faktycznie leży na serwerze.
Kolejność ma znaczenie, bo PrestaShop nie scala dwóch override'ów tej samej klasy. Jeśli dwa moduły nadpiszą Product, zostanie jeden plik — ten wgrany później. Funkcja z pierwszego modułu po cichu przestaje działać. Dlatego przy wdrożeniach PrestaShop przed instalacją kolejnego modułu z override'ami sprawdzamy, co już leży w /override/. Mechanizm opisuje dokumentacja dla deweloperów PrestaShop.
Większość konfliktów w projektach bierze się z jednego nieporozumienia: „override” to potocznie trzy różne mechanizmy o różnych konsekwencjach.
Override klasy. Plik /override/classes/Product.php z klasą class Product extends ProductCore. Dziedziczysz po klasie rdzenia, więc masz dostęp do wszystkich metod, ale musisz zachować sygnatury — ta sama nazwa, te same argumenty, ten sam typ zwracany. Jeśli kopiujesz metodę z rdzenia, kopiuj całą. Skrócona wersja bez obsługi przypadku brzegowego (np. brak wpisu w tabeli stanów magazynowych) to typowa przyczyna błędów przy składaniu zamówienia, które ujawniają się tylko u części klientów.
Override kontrolera. Plik w /override/controllers/front/, np. OrderConfirmationController.php. Nazwy metod i ich argumenty muszą zostać zachowane, inaczej moduły wołające parent:: przestaną działać. Bezpieczny wzorzec: nadpisz initContent() i wywołaj parent::initContent() przed własną logiką.
Nadpisanie szablonu. Kopiujesz plik z rdzenia lub modułu do katalogu motywu — w PrestaShop 1.7 i 8.x: themes/twoj-motyw/templates/ dla plików rdzenia i themes/twoj-motyw/modules/nazwa-modulu/ dla szablonów modułów. W 1.6 odpowiednio themes/twoj-motyw/ i themes/twoj-motyw/modules/. Nie dotykasz PHP, nie kolidujesz z innymi modułami, a zmiana jest widoczna po wyczyszczeniu cache. Minus: po dużej aktualizacji Twój plik nie dostanie nowych pól z rdzenia — trzeba go porównać z nową wersją. To jeden z powodów, dla których migrację sklepu PrestaShop planuje się razem z audytem override'ów, a nie po fakcie.
Prosta reguła: układ, komunikaty i wygląd → szablon. Sposób liczenia (cena, rabat, koszt dostawy) → klasa. Parametry URL, przekierowania, uprawnienia → kontroler.
Zacznij od pytania: czy zmieniasz wynik istniejącej metody, czy dokładasz coś obok? To rozstrzyga wybór szybciej niż preferencje zespołu.
Konsekwencje są praktyczne. Override modyfikuje logikę rdzenia. Znika razem z Twoim repozytorium, ale zostaje na serwerze nawet po odinstalowaniu modułu, który go dodał — jeśli wgrywałeś plik ręcznie, nie usunie go żaden automat. Hook działa obok: rdzeń wykonuje swój kod, a Twój moduł dopina się w punkcie zaczepienia. Odinstalowanie modułu zwykle usuwa cały jego kod, a aktualizacja PrestaShop rzadziej psuje hook niż nadpisaną metodę.
Kiedy hook nie wystarcza. Sprawdź najpierw, czy hook istnieje w miejscu, którego potrzebujesz. Lista jest długa — displayHeader, actionCartSave, actionValidateOrder albo displayProductAdditionalInfo pokrywają większość typowych potrzeb. Podglądasz je w Panelu: Design → Pozycje, albo szukając Hook::exec w kodzie. Jeżeli hook istnieje, ale nie zawiera danych, których potrzebujesz (bo liczą się w połowie metody), albo nie ma go tam wcale, zostaje override metody lub kontrolera. Wtedy bierzesz na siebie utrzymanie tego fragmentu: każda aktualizacja rdzenia wymaga porównania z nową wersją. Zanim to zrobisz, zapisz w repozytorium, po co powstał override — bez notatki po roku nikt nie wie, czy można go bezpiecznie usunąć.
| Sytuacja | Rozwiązanie | Dlaczego |
|---|---|---|
| Zmiana wyniku istniejącej metody (np. inny sposób liczenia ceny) | Override klasy | Hook wykona się przed lub po metodzie, ale nie zmieni jej wyniku |
| Dodanie zachowania w istniejącym punkcie zaczepienia | Hook we własnym module | Rdzeń zostaje nietknięty, moduł wyłączasz jednym kliknięciem |
| Nowa funkcjonalność, nowa strona, integracja z zewnętrznym API | Własny moduł | Nie zależy od struktury klas rdzenia, łatwiej przenieść go na nowszą wersję |
| Hook nie istnieje w potrzebnym miejscu | Override kontrolera lub klasy | Nadpisujesz punkt wejścia — świadomie bierzesz na siebie utrzymanie kodu |
Krok 1 – znajdź oryginał i skopiuj sygnaturę. Klasy modeli leżą w /classes/ (np. /classes/Product.php zawiera klasę ProductCore), kontrolery w /controllers/front/ i /controllers/admin/ (np. CartController.php → CartControllerCore). Otwórz plik i skopiuj dokładnie sygnaturę metody: nazwę, kolejność i typy parametrów oraz wartości domyślne. Zmieniona sygnatura to najczęstszy powód, dla którego override działa na Twoim serwerze, a wywala się u klienta na innej wersji PHP.
Krok 2 – plik w /override/ z lustrzaną strukturą katalogów. /classes/Product.php → /override/classes/Product.php, /controllers/front/CartController.php → /override/controllers/front/CartController.php. Klasa dziedziczy po wersji Core i gubi sufiks Core z nazwy:
class Product extends ProductCore
{
public function getPrice($id_product, $id_product_attribute = null, ...)
{
// Twoja logika
return parent::getPrice($id_product, $id_product_attribute, ...);
}
}W klasach legacy (katalogi /classes/, /controllers/) nie dodawaj namespace. Jeśli nadpisujesz coś z /src/ (nowe API Symfony w 1.7+), namespace jest obowiązkowy i musi być identyczny jak w oryginale.
Krok 3 – wyczyść cache i sprawdź, czy metoda faktycznie się wykonuje. Usuń zawartość /var/cache/dev i /var/cache/prod albo użyj czyszczenia cache w panelu. Wstaw tymczasowo PrestaShopLogger::addLog('override getPrice', 1); lub error_log() i wykonaj realne zamówienie testowe. Brak błędu nic nie znaczy – sprawdzasz, czy kod w ogóle wchodzi.
Zasada: nadpisuj tylko metody, które faktycznie zmieniasz. Skopiowanie całej klasy (w Product.php to kilkaset metod i tysiące linii) oznacza, że każdą aktualizację PrestaShop porównujesz ręcznie, a przy nowej wersji PHP debugujesz kod, którego nikt nie potrzebował.
| Co nadpisujesz | Plik rdzenia | Plik override | Nazwa klasy |
|---|---|---|---|
| Model / logika | /classes/Product.php | /override/classes/Product.php | class Product extends ProductCore |
| Kontroler front | /controllers/front/CartController.php | /override/controllers/front/CartController.php | class CartController extends CartControllerCore |
| Kontroler admin | /controllers/admin/AdminOrdersController.php | /override/controllers/admin/AdminOrdersController.php | class AdminOrdersController extends AdminOrdersControllerCore |
| Nowe API (Symfony) | /src/Core/… | /override/… (namespace jak w oryginale) | class X extends XCore |
Zacznij od inwentaryzacji. Struktura /override/ jest lustrem rdzenia, więc jedno polecenie daje pełny obraz: find override -name "*.php" albo grep -rl "extends .*Core" override/. Każdy plik porównaj z listą zainstalowanych modułów (Moduły → Moduły i usługi). Moduły do płatności, kurierów i integracji ERP bardzo często dostarczają własne override'y – i to one wchodzą w konflikt najczęściej.
Sprawdź, skąd naprawdę pochodzi metoda. Najszybszy test to refleksja: (new ReflectionMethod('Product', 'getPrice'))->getFileName() zwróci Ci konkretną ścieżkę pliku – rdzeń, override modułu czy Twój własny. get_class($product) pokaże Product, a nie ProductCore, co potwierdza, że override jest aktywny. W trybie debug w 1.7+ masz jeszcze profiler Symfony z listą wywołań, a z Xdebug pełny stack trace – widać, czy metoda idzie z modułu, czy z rdzenia.
Objawy konfliktu i jak je czytać. Dwa moduły nadpisujące tę samą klasę to jedna klasa PHP, więc wygrywa ten, który został zainstalowany później – pierwszy przestaje działać bez żadnego komunikatu. Typowe sygnały: biały ekran (przy display_errors = 0), metoda, która ewidentnie się nie wykonuje, albo błąd Cannot redeclare class i Call to undefined method po włączeniu trybu debug w Zaawansowane → Wydajność. Czytaj komunikat do końca: ścieżka pliku w treści błędu wskazuje, który override wygrał.
Jeżeli konflikt dotyczy modułu, którego nie da się przepisać, rozwiązaniem jest jeden override łączący obie logiki z wywołaniem parent:: w środku, a nie dwa pliki walczące o tę samą metodę. Zanim postawisz własną warstwę nadpisań, warto wiedzieć, co i tak robimy w ramach wdrożeń PrestaShop – część rzeczy da się załatwić hookiem, bez wchodzenia w rdzeń.
| Objaw | Co najczęściej oznacza | Gdzie szukać |
|---|---|---|
| Biały ekran bez komunikatu | Fatal error ukryty, bo display_errors = 0 | Włącz tryb debug, log PHP /var/logs |
| Metoda „nie działa”, brak błędu | Moduł zainstalowany później nadpisał Twoją klasę | ReflectionMethod::getFileName(), porównanie /override/ z modułami |
| Cannot redeclare class | Dwa pliki definiują tę samą klasę | Treść błędu podaje ścieżkę pliku |
| Call to undefined method | Metoda zniknęła z rdzenia po aktualizacji | Diff pliku rdzenia między wersjami |
Jedno jest pewne: aktualizacja – przez moduł 1-Click Upgrade albo ręcznie – nie kasuje katalogu /override/. Twoje pliki zostaną na miejscu. Ryzyko polega na czymś innym: rdzeń pod nimi się zmienia i override może przestać pasować.
Możliwe są trzy scenariusze. Pierwszy: metoda nadal istnieje z tą samą sygnaturą – override działa bez zmian. Drugi: metoda zmieniła sygnaturę lub logikę – Twój kod nadpisuje nową wersję starą logiką i cicho psuje funkcję, np. przeliczenia cen czy podatków. Trzeci, najgorszy: metoda została usunięta z rdzenia – wtedy albo dostajesz błąd, albo override przestaje być wywoływany, bo nikt go już nie woła, a Ty nie zauważasz tego przez kilka tygodni.
Jak wyłapać to przed produkcją. Trzymaj własne override'y w repozytorium git i przed każdą aktualizacją zrób diff plików rdzenia między wersjami. Źródła PrestaShop są publiczne – porównanie classes/Product.php z tagu 1.7.x i 8.x zajmuje kilka minut i od razu pokazuje, które metody zniknęły albo zmieniły parametry. To samo dotyczy migracji 1.7 → 8: część klas legacy została przepisana na Symfony, a przy przejściu 8 → 9 dochodzi kwestia usuniętych metod. Nie zakładaj z góry, że Twoja metoda przetrwała – sprawdź to w kodzie.
Test na kopii sklepu, nie na produkcji. Postaw staging z kopią bazy (dane klientów zanonimizuj), wgraj override'y i przejdź pełną ścieżkę: dodanie do koszyka, zamówienie, płatność, mail potwierdzający, faktura, panel administracyjny. Jeśli metoda zniknęła z rdzenia, override trzeba usunąć albo przepisać na hook lub nowe API – nie „naprawiać” na ślepo. Szerszy plan takich prac opisujemy w materiale o migracji sklepu PrestaShop.
| Co się zmieniło w rdzeniu | Efekt dla Twojego override | Działanie |
|---|---|---|
| Metoda bez zmian | Override działa jak wcześniej | Brak, tylko test na stagingu |
| Zmieniona sygnatura lub logika | Nadpisujesz nową wersję starą logiką | Porównaj z rdzeniem i zaktualizuj metodę |
| Metoda usunięta | Błąd lub brak wywołania | Przepisz na hook / nowe API albo usuń override |
| Klasa legacy przepisana na Symfony | Override w starym miejscu nie działa | Przenieś logikę do nowej klasy z namespace |
Trzy awarie wracają najczęściej i wszystkie mają wspólną cechę: nie krzyczą od razu. Poniżej objawy i sposoby sprawdzenia, zanim klient zgłosi brak zamówienia.
1. Metoda nadpisana bez zgodnej sygnatury i bez parent::. Objaw: w koszyku widać 3 produkty, a w zamówieniu zapisują się 2; rabat nalicza się tylko części klientów. Wykrycie: otwórz override/classes/Cart.php i porównaj z classes/Cart.php. Jeśli w Twojej metodzie nie ma wywołania parent::nazwaMetody(), cała oryginalna logika znika. Sygnatura musi się zgadzać co do liczby i typów argumentów. Rozjazd kończy się fatal error, a przy wyłączonym display_errors – białą stroną, którą trudno zdiagnozować.
2. Skopiowana cała klasa zamiast jednej metody. Objaw: po aktualizacji rdzenia (np. z 8.1 na 9) zaczynają dziać się rzeczy, których nikt nie zamawiał – bo w override siedzi kod sprzed trzech lat. Wykrycie: porównaj liczbę linii pliku z /override/ z oryginałem w /classes/. Jeśli są zbliżone, prawdopodobnie skopiowano klasę w całości. Nadpisuj jedną metodę, resztę zostaw rdzeniowi.
3. Twarda edycja szablonu zamiast override w motywie. Objaw: po aktualizacji motywu ginie dodatkowe pole w koszyku albo komunikat o darmowej dostawie. Wykrycie: zestaw pliki .tpl z katalogu motywu z wersją z themes/classic. Poprawna droga to kopia szablonu do własnego motywu.
Po każdej zmianie w /override/ usuń zawartość katalogu cache (w 1.7+ var/cache/, w starszych cache/class_index.php) – inaczej sklep dalej użyje starej klasy. Kolejność takich prac opisujemy w sekcji o wdrożeniach PrestaShop, a szczegóły techniczne override znajdziesz w dokumentacji dla deweloperów PrestaShop.
| Pułapka | Objaw | Jak wykryć |
|---|---|---|
| Brak parent:: i zmieniona sygnatura | Ciche braki pozycji w koszyku lub zamówieniu | Diff pliku z /override/ i klasy bazowej w /classes/ |
| Kopia całej klasy | Niespodzianki po aktualizacji rdzenia | Porównanie liczby linii pliku override z oryginałem |
| Edycja szablonu zamiast override w motywie | Poprawki znikają po aktualizacji motywu | Porównanie .tpl z motywu i z themes/classic |
Samodzielny override ma sens, dopóki nie dotyka pieniędzy i da się go szybko cofnąć. Granica przebiega w trzech miejscach.
Brak repozytorium. Jeśli zmiany w /override/ leżą tylko na produkcji, nie cofniesz błędu i nie sprawdzisz, co zmieniono pół roku temu. Git to punkt wyjścia, nie dodatek.
Brak środowiska testowego. Testy na żywym sklepie to zgadywanie, ile zamówień przepadło. Potrzebna kopia plików i bazy, na której przejdziesz scenariusze: dodanie do koszyka, kupon, zmiana statusu zamówienia, płatność.
Override dotyka płatności, zamówień albo podatków. Klasy Cart, Order, OrderDetail, PaymentModule – jeden błąd to niezaksięgowane wpłaty albo złe kwoty na fakturze.
Praca z deweloperem bez pośredników rozlicza się godzinowo, nie „pakietem”. Realistyczne widełki: 2–4 h na audyt istniejących override i plan, 3–6 h na pojedynczą metodę poza logiką zamówień (z testami), 10–25 h na override w klasach zamówień i płatności ze scenariuszami testowymi, 20–40 h, jeśli dochodzi moduł, hooki i staging. Stawki godzinowe bywają różne – potwierdź je u wykonawcy. Cena to godziny razy stawka, a nie liczba z sufitu. Jeśli wykonawca nie umie podać liczby godzin, to sygnał ostrzegawczy.
Opieka po wdrożeniu: SLA określa czas reakcji (np. jeden dzień roboczy) i zakres. Utrzymanie override przy aktualizacjach rdzenia to przegląd metod przed wdrożeniem nowej wersji, testy po aktualizacji i dopisanie zmian wynikających z rdzenia. Ustal z góry, kto płaci za dostosowanie do nowej wersji. Zasady przygotowania takiej zmiany opisaliśmy przy migracji sklepu PrestaShop.
| Zakres prac | Orientacyjny czas | Kiedy potrzebne |
|---|---|---|
| Audyt istniejących override i plan | 2–4 h | Przed pierwszą zmianą w /override/ |
| Jedna metoda poza logiką zamówień | 3–6 h | Z testami na kopii sklepu |
| Cart / Order / OrderDetail / PaymentModule | 10–25 h | Scenariusze: koszyk, kupon, płatność |
| Override + moduł + hooki + staging | 20–40 h | Gdy dochodzi narzędzie dla klienta |
Skopiowanie całej klasy rdzenia do /override/ zamiast samej zmienianej metody.
Jak wykryć: Otwórz plik override i oryginał z /classes/ – jeśli w override są metody, których nie zmieniasz, to kopia, a nie nadpisanie.
Jak naprawić: Zostaw w pliku wyłącznie metody, które realnie modyfikujesz. Każda dodatkowa metoda to fragment rdzenia, który starzeje się razem z wersją PrestaShop.
Brak wyczyszczenia cache po dodaniu pliku override – sklep nadal korzysta ze starej mapy klas.
Jak wykryć: Plik istnieje w /override/, a metoda się nie wykonuje. Sprawdź, czy w cache/class_index.php jest wpis wskazujący na Twój plik.
Jak naprawić: Wyczyść cache z panelu (Zaawansowane → Wydajność) lub usuń pliki z katalogu /cache/ poza .htaccess. Po każdej zmianie w /override/ czyść cache zawsze.
Mylenie override klasy z nadpisaniem szablonu .tpl.
Jak wykryć: Szukasz pliku w /override/, a problem dotyczy wyglądu strony albo treści bloku w motywie.
Jak naprawić: Zmiany wizualne rób w szablonach w katalogu motywu. Override klasy stosuj tylko wtedy, gdy zmieniasz dane albo logikę, nie warstwę prezentacji.
Zmiana sygnatury metody względem klasy rdzenia – dodanie, usunięcie lub zmiana kolejności parametrów.
Jak wykryć: Fatal error w logu PHP, komunikaty o niezgodności argumentów albo brak wywołania metody z parametrem, którego rdzeń oczekuje.
Jak naprawić: Skopiuj sygnaturę metody 1:1 z klasy Core, łącznie z typami i wartościami domyślnymi. Zmieniaj tylko ciało metody.
Dwa moduły nadpisują tę samą klasę lub tę samą metodę – wygrywa ten, który załaduje się później.
Jak wykryć: Funkcja jednego z modułów przestaje działać po instalacji drugiego. Porównaj zawartość /override/ z listą zainstalowanych modułów i sprawdź, który plik zawiera dublującą się metodę.
Jak naprawić: Scal zmiany w jednym pliku override zamiast trzymać dwa, albo wyłącz jeden z modułów. Po scaleniu przetestuj oba scenariusze na kopii sklepu.
Ręczna edycja pliku override należącego do modułu – poprawka znika przy aktualizacji tego modułu.
Jak wykryć: Po aktualizacji modułu wcześniej wprowadzona zmiana przestaje działać, a plik wraca do stanu z paczki modułu.
Jak naprawić: Nie edytuj plików, które przychodzą z modułem. Zgłoś zmianę autorowi modułu albo przenieś logikę do własnego, prostego modułu z hookiem.
Override to narzędzie do zmiany logiki istniejącej metody rdzenia, a nie do drobnych poprawek, które da się załatwić hookiem albo szablonem motywu. W pliku w /override/ trzymaj wyłącznie nadpisywane metody, zachowaj sygnatury 1:1 i zawsze czyść cache po zmianie. Największym ryzykiem nie jest sama aktualizacja, tylko sytuacja, w której Twój override przestaje pasować do nowej wersji klasy rdzenia albo koliduje z innym modułem. Dlatego każdy override warto udokumentować i zweryfikować na stagingu przed wdrożeniem.
Nie, pliki w katalogu /override/ zostają na miejscu. Ryzyko jest inne: po aktualizacji zmieniają się klasy rdzenia, więc Twój override może przestać pasować do rzeczywistości. Metoda mogła zostać usunięta, zmienić nazwę albo dostać inne parametry. Dlatego przed każdą aktualizacją trzeba porównać nadpisywane metody z nową wersją rdzenia.
Override podmienia istniejącą metodę rdzenia – zmienia jej logikę. Hook to punkt zaczepienia, w którym dokładasz własne zachowanie obok kodu rdzenia. Hook jest bezpieczniejszy przy aktualizacjach, bo rzadziej koliduje ze zmianami w rdzeniu. Override stosuj tylko wtedy, gdy hooka w potrzebnym miejscu po prostu nie ma.
W katalogu /override/, w podkatalogach odpowiadających strukturze rdzenia: /override/classes/, /override/controllers/ i /override/modules/. PrestaShop buduje mapę klas i zapisuje ją w cache/class_index.php. Po dodaniu nowego pliku trzeba wyczyścić cache, żeby mapa została przebudowana i wskazała na Twoją wersję klasy.
Najprościej sprawdzić class_index.php albo użyć get_class na obiekcie i porównać ścieżkę pliku, z którego pochodzi metoda. W bardziej złożonych przypadkach pomaga debugger, np. Xdebug, i breakpoint ustawiony w metodzie. Nazwa klasy z sufiksem Core w pliku override też jednoznacznie wskazuje, że mamy do czynienia z nadpisaniem.
Tak i w większości przypadków tak trzeba. Szablony Smarty nadpisujesz w katalogu swojego motywu, bez dotykania rdzenia. Taka zmiana przeżyje aktualizację PrestaShop lepiej niż plik w /override/, bo motyw jest Twoją warstwą, a nie kopią cudzego kodu.
PrestaShop ładuje jeden plik override dla danej klasy – wygrywa ten, który znalazł się w mapie klas jako ostatni. Efekt jest taki, że logika jednego z modułów po cichu przestaje działać. Objawia się to brakiem wywołania metody, białym ekranem albo błędami po włączeniu trybu debug. Rozwiązanie to scalenie zmian w jednym pliku lub rezygnacja z jednego z modułów.
Zapisz dokładnie, co ma się zmienić: nowa funkcja, dodatkowe zachowanie w punkcie zaczepienia czy zmiana logiki istniejącej metody. Nowa funkcjonalność to moduł, dodatkowe zachowanie to hook, a zmiana istniejącej metody to najczęściej override. Dokumentacja deweloperska PrestaShop opisuje dostępne hooki i strukturę klas – warto zajrzeć tam przed pisaniem kodu.
Jeśli w Twoim sklepie jest kilka override'ów i nie wiesz, który za co odpowiada, możemy przejrzeć kod i uporządkować to przed najbliższą aktualizacją. Zajrzyj na naszą stronę o PrestaShop albo napisz, co chcesz zmienić.