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_list przez referencję (&), aby modyfikacje wykonane przez moduły były widoczne po powrocie z hooka.


Procedura wdrożenia (w skrócie)

  1. Dodaj wywołanie Hook::exec('actionFilterDeliveryOptionList', ...) tak, aby wykonywało się po sortowaniu listy metod dostawy i przed zapisaniem do cache oraz return.

  2. 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 (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 Cart z 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

  1. Hook powinien być wywołany po sortowaniu, żeby moduły otrzymały finalną listę metod.

  2. Hook powinien być wywołany przed cache i return, aby:

    • cache przechowywał już zmodyfikowaną listę,
    • wynik zwracany przez metodę zawierał zmiany z hooka.
  3. delivery_option_list musi być przekazane przez referencję.