W nowszych wersjach PrestaShop (8 i wyżej) dostępny jest hook actionFilterDeliveryOptionList, który pozwala modułom wpłynąć na listę dostępnych metod dostawy w koszyku — np. ukryć wybrane opcje, zmienić ich kolejność lub zastosować własne reguły zależne od zawartości koszyka.
Starsze wersje PrestaShop (1.7 i wcześniejsze) nie posiadają tego hooka domyślnie, dlatego jeśli moduł lub integracja go wymaga, trzeba go dodać ręcznie.
Poniżej znajduje się krótka procedura oraz dwie opcje wdrożenia:
-
Opcja A (zalecana): override klasy
Cart— bez modyfikowania core, -
Opcja B: dopisanie do
CartCore— bez konfliktów z override’ami, ale nadpisywane przy aktualizacji.
Hook: actionFilterDeliveryOptionList
Parametry przekazywane do hooka
Hook jest wykonywany z parametrami:
-
delivery_option_list(przez referencję) — lista opcji dostawy do modyfikacji -
cart— obiekt koszyka ($this)
Wywołanie hooka:
Hook::exec(
'actionFilterDeliveryOptionList',
[
'delivery_option_list' => &$delivery_option_list,
'cart' => $this,
]
);
Kluczowe jest przekazanie
delivery_option_listprzez referencję (&), aby modyfikacje wykonane przez moduły były widoczne po powrocie z hooka.
Procedura wdrożenia (w skrócie)
-
Dodaj wywołanie
Hook::exec('actionFilterDeliveryOptionList', ...)tak, aby wykonywało się po sortowaniu listy metod dostawy i przed zapisaniem do cache orazreturn. -
Wybierz jedną z opcji poniżej:
-
Opcja A (override
Cart) – rekomendowana jako poprawny sposób nadpisania bez edycji core. -
Opcja B (modyfikacja
CartCore) – alternatywa, gdy nie możesz użyć override albo chcesz uniknąć konfliktów z innymi override’ami.
-
Opcja A (override
Opcja A (zalecana): Override klasy Cart
Ta opcja nie wymaga edycji plików core. Nadpisujesz metodę getDeliveryOptionList(), pobierasz wynik z parent::getDeliveryOptionList(...) i dopiero wtedy wywołujesz hook na zwróconej liście.
override/classes/Cart.php
<?php
class Cart extends CartCore
{
public function getDeliveryOptionList(Country $default_country = null, $flush = false)
{
static $cache = array();
if (isset($cache[$this->id]) && !$flush) {
return $cache[$this->id];
}
$delivery_option_list = parent::getDeliveryOptionList($default_country, $flush);
Hook::exec(
'actionFilterDeliveryOptionList',
[
'delivery_option_list' => &$delivery_option_list,
'cart' => $this,
]
);
$cache[$this->id] = $delivery_option_list;
return $cache[$this->id];
}
}
Plusy / minusy (Opcja A)
- ✅ brak modyfikacji core (czystsze wdrożenie)
- ✅ standardowy sposób rozszerzania logiki w PrestaShop 1.7
- ⚠️ możliwy konflikt, jeśli inny moduł również nadpisuje
Cart(typowy problem override’ów)
Opcja B: Dopisanie w CartCore (modyfikacja core)
W tej opcji dopisujesz wywołanie hooka bezpośrednio w metodzie getDeliveryOptionList() w CartCore, po sortowaniu i przed cache/return.
Lokalizacja
-
plik:
classes/Cart.php -
klasa:
CartCore -
metoda:
getDeliveryOptionList(...) -
miejsce: tuż przed:
-
$cache[$this->id] = $delivery_option_list; -
return $cache[$this->id];
-
Fragment do wklejenia (po sortowaniu)
// Sort delivery option list
foreach ($delivery_option_list as &$array) {
uasort($array, array('Cart', 'sortDeliveryOptionList'));
}
Hook::exec(
'actionFilterDeliveryOptionList',
[
'delivery_option_list' => &$delivery_option_list,
'cart' => $this,
]
);
$cache[$this->id] = $delivery_option_list;
return $cache[$this->id];
Plusy / minusy (Opcja B)
-
✅ brak konfliktów z override’ami
Cartz innych modułów -
✅ proste do wdrożenia jako patch
-
❌ modyfikacja core — może zostać nadpisana przy aktualizacji PrestaShop
- szczególnie istotne, jeśli aktualizujesz w obrębie wersji < 8
- przy aktualizacji do 8+ hook będzie już natywnie dostępny, więc temat przestaje istnieć
Ważne uwagi
-
Hook powinien być wywołany po sortowaniu, żeby moduły otrzymały finalną listę metod.
-
Hook powinien być wywołany przed cache i return, aby:
- cache przechowywał już zmodyfikowaną listę,
- wynik zwracany przez metodę zawierał zmiany z hooka.
-
delivery_option_listmusi być przekazane przez referencję.