PS PrestaShop Średnio zaawansowany

Smart Offers: kompletna dokumentacja

Wszystko, co trzeba wiedzieć o konfiguracji i obsłudze modułu Smart Offers w PrestaShop 8 i 9: cztery typy ofert łączonych, silnik automatycznego dodawania do koszyka i procedura migracji.

Zaktualizowano Wersja modułu 2.2.1

Smart Offers to moduł zgodny z PrestaShop 8 i 9, który pozwala tworzyć oferty 1+1, pakiety hurtowe, pakiety wieloproduktowe i oferty z wyborem, z automatycznym dodawaniem produktów prezentowych do koszyka i dopracowaną prezentacją na stronie produktu.

Przegląd

Smart Offers obejmuje cztery najczęściej stosowane w e-commerce formaty ofert łączonych w jednym module, bez skomplikowanej konfiguracji. Silnik ocenia koszyk przy każdej zmianie, automatycznie dodaje produkty prezentowe, gdy tylko warunki są spełnione, i tworzy regułę koszyka, która czyni te sztuki darmowymi. Doświadczenie klienta jest natychmiastowe i czytelne.

W skrócie: Sprzedawca tworzy ofertę w mniej niż minutę przez interfejs wizualny, klient widzi prezent pojawiający się automatycznie w koszyku z czytelnym wskaźnikiem, a wewnętrzne śledzenie pozwala czysto wycofać ofertę, jeśli klient usunie wyzwalacz w trakcie sesji.

Zgodność z PrestaShop 8 i 9

Od wersji 2.0.0 jeden plik ZIP obejmuje PrestaShop 8.0 do 9.x. Nie ma osobnej gałęzi do wyboru przy pobieraniu: moduł wykrywa wersję sklepu w czasie działania i dostosowuje wywołania do interfejsów API, które zmieniły się między generacjami.

Element PrestaShop 8 PrestaShop 9
Wymagana wersja PHP 7.4 do 8.3 8.1 do 8.3
Schemat bazy danych Identyczny, sześć tabel ps_dfoffers_*
Używane hooki Identyczne
Konfiguracja ofert Identyczna, przezroczysta migracja
Różnice API są zgrupowane w jednej wewnętrznej klasie, DfOfferCompat. Jeśli nadpisujesz kod modułu w projekcie na zamówienie, to jedyny plik, który trzeba przeczytać, aby zrozumieć rozgałęzienia wersji.

Instalacja

  1. Pobierz plik dfoffers-vX.Y.Z.zip ze swojej strefy klienta DataFirefly
  2. W panelu administracyjnym PrestaShop przejdź do Moduły → Menedżer modułów
  3. Kliknij przycisk Prześlij moduł na górze strony
  4. Przeciągnij plik ZIP lub kliknij, aby go wybrać
  5. Instalacja jest automatyczna: tabele są tworzone, hooki rejestrowane, a w menu pojawia się nowa zakładka Katalog → Oferty łączone
Nie jest wymagana żadna zewnętrzna zależność. Moduł używa natywnych klas PrestaShop (Cart, CartRule, Product) i nie dodaje niczego do composer.json.

Cztery typy ofert

1+1 na tym samym produkcie

Wiralowy format buy-one-get-one: klient kupuje jedną sztukę produktu i otrzymuje drugą sztukę tego samego produktu gratis. Konfigurujesz:

  • Jeden produkt (używany jako wyzwalacz i nagroda)
  • Ilość do kupienia, aby uruchomić ofertę (zwykle 1)
  • Ilość gratis (zwykle 1)

Typowy przykład: „Kup 1 parę skarpet, druga gratis.” Gdy klient dodaje parę do koszyka, silnik automatycznie dodaje drugą i stosuje rabat równy cenie jednostkowej.

Kup X, otrzymaj Y gratis (różne produkty)

Format pakietowy: kilka różnych produktów wyzwalających musi być w koszyku, aby oferta się uruchomiła, a wtedy jeden lub więcej innych produktów jest oferowanych gratis. Konfigurujesz:

  • Listę produktów wyzwalających z ich ilościami
  • Listę produktów nagród z ich ilościami

Typowy przykład: „Kup krem na dzień i serum razem, otrzymaj próbkę maski gratis.” Silnik sprawdza, czy wszystkie wyzwalacze są obecne, zanim aktywuje ofertę.

Wybór wariantów

Format swobodnej kompozycji: definiujesz zestaw produktów lub wariantów kandydujących, z których klient składa swoją partię. Silnik automatycznie identyfikuje najtańsze pozycje koszyka jako sztuki gratis, co odpowiada standardowej interpretacji handlowej buy-N-get-M.

  • Listę produktów lub wariantów kandydujących
  • Liczbę sztuk do kupienia z tego zestawu
  • Liczbę sztuk gratis (najtańszych)

Typowy przykład: „Kup 3 koszulki z naszego wyboru, najtańsza gratis.” Klient składa partię, silnik nie dotyka koszyka, ale stosuje rabat na najtańsze sztuki.

Pakiet hurtowy

Format B2B i upłynniania zapasów: za każde X kupionych sztuk produktu klient otrzymuje Y sztuk gratis innego produktu. Konfigurujesz:

  • Produkt wyzwalający z ilością progową (np. 10)
  • Produkt nagrodę z oferowaną ilością (np. 20)

Typowy przykład: „Kup 10 butelek wina, otrzymaj 2 kieliszki gratis.” Praktyczne dla dostawców chcących promować produkt komplementarny lub upłynnić zalegający zapas, wiążąc go z bestsellerem.

Tworzenie pierwszej oferty

W panelu administracyjnym przejdź do Katalog → Oferty łączone, a następnie kliknij Nowa oferta.

Krok 1: wybierz typ

Cztery wizualne karty prezentują dostępne typy z krótkim opisem. Kliknij tę, która odpowiada Twojej operacji handlowej. Formularz dostosowuje się automatycznie i pokazuje tylko pola istotne dla tego typu.

Krok 2: nazwij ofertę i nadaj jej odznakę

Wypełnij:

  • Nazwa oferty (wymagana): to, co klient widzi na banerze. Jedno pole na każdy aktywny język sklepu.
  • Tekst odznaki (opcjonalny, maks. 64 znaki): krótki komunikat pokazywany w pigułce na górze baneru (np. 1+1 GRATIS, OFERTA SPECJALNA, BLACK FRIDAY).
  • Kolor odznaki: sześć presetów DataFirefly plus dowolny selektor koloru. Kolor jest używany zarówno na banerze strony produktu, JAK I na odznace prezentu w koszyku.

Krok 3: dodaj produkty wyzwalające

Kliknij Dodaj produkt wyzwalający. Otwiera się okno wyszukiwania z polem, które przeszukuje katalog na żywo (z opóźnieniem 250 ms po ostatnim naciśnięciu klawisza). Wpisz nazwę, referencję lub EAN; wyniki pojawiają się natychmiast.

Kliknij produkt, aby go dodać. Jeśli produkt ma warianty, pojawiają się one jako przyciski pod wynikiem, kliknij ten, który chcesz dodać bezpośrednio. Ustaw wymaganą ilość w polu po prawej stronie wiersza.

Produkt z wariantami: przycisk Produkt główny (bez wariantu) dodaje produkt z symbolem wieloznacznym. Oferta obejmuje wtedy wszystkie jego warianty, a kupiona ilość jest liczona łącznie dla wszystkich. Wybierz konkretny wariant tylko wtedy, gdy oferta ma być ograniczona do niego.

Krok 4: dodaj produkty nagrody

Ta sama procedura dla produktów nagród. Ta sekcja jest ukryta dla typu Wybór wariantów, ponieważ warianty służą zarówno jako kandydaci, jak i nagrody.

Krok 5: zasady szczegółowe

  • Kumulowalna: jeśli włączona, oferta stosuje się wielokrotnie dla każdej partii wyzwalającej. Bez kumulacji oferta stosuje się tylko raz, niezależnie od liczby sztuk. Domyślnie wyłączona dla ochrony marż.
  • Dla typu Wybór wariantów pojawiają się dwa dodatkowe pola: ile sztuk klient musi kupić i ile jest gratis.

Krok 6: aktywacja

  • Daty ważności: zostaw puste dla oferty stałej. Wpisz datę rozpoczęcia lub zakończenia, aby zautomatyzować aktywację. Nieczytelna data jest odrzucana, a data zakończenia musi być późniejsza niż data rozpoczęcia.
  • Priorytet: jeśli kilka ofert może się stosować jednocześnie, ta z najniższym priorytetem jest oceniana pierwsza.
  • Status: przełącznik wł./wył., domyślnie włączony. Przydatny do tymczasowego wyłączenia oferty bez jej usuwania.

Krok 7: sklepy (jeśli multi-sklep)

Zaznacz sklepy, w których oferta ma być dostępna. Pozostawienie wszystkich niezaznaczonych oznacza, że oferta obowiązuje we wszystkich sklepach.

Edycja lub usuwanie oferty

W Katalog → Oferty łączone każdy wiersz listy ma przycisk Edytuj oraz, w jego rozwijanym menu, Usuń. Przełącznik w kolumnie Aktywna pozwala też zawiesić ofertę bez jej usuwania. Aby działać na kilku ofertach naraz, zaznacz je i użyj akcji zbiorczych na dole listy.

Usunięcie jest nieodwracalne i czyści wszystko, co zależy od oferty: wyzwalacze, nagrody, powiązania ze sklepami oraz reguły koszyka wygenerowane przez silnik dla trwających koszyków. Klient, który miał prezent w koszyku, zobaczy jego zniknięcie przy następnej akcji.

Jak działa silnik automatycznego dodawania

Silnik podpina się pod hook PrestaShop actionCartSave i działa przy każdej zmianie koszyka (dodanie, usunięcie, zmiana ilości, scalenie przy logowaniu).

  1. Pobiera wszystkie aktywne oferty dla bieżącego sklepu
  2. Dla każdej oferty oblicza ilość opłaconą każdego produktu wyzwalającego (całkowita ilość w koszyku minus to, co silnik już automatycznie dodał w poprzedniej ocenie)
  3. Ocenia, czy warunki oferty są spełnione
  4. Jeśli tak, dodaje brakujące produkty nagrody do koszyka przez Cart::updateQty
  5. Tworzy lub aktualizuje regułę koszyka (CartRule) ze stałym rabatem brutto równym wartości oferowanych sztuk
  6. Zapisuje w tabeli ps_dfoffers_cart_auto dodane sztuki, aby odróżnić je od sztuk dodanych przez klienta
Silnik chroni przed nieskończonymi pętlami: Cart::updateQty ponownie odpala hook actionCartSave, ale statyczna ochrona w module zapobiega rekurencji.

Czyste wycofanie

Jeśli klient usunie produkt wyzwalający lub zmniejszy jego ilość poniżej progu, silnik ponownie ocenia ofertę przy następnym actionCartSave. Jeśli warunek nie jest już spełniony, usuwa automatycznie dodane sztuki (nie dotykając sztuk dodanych przez klienta, dzięki śledzeniu) i kasuje powiązaną regułę koszyka.

Ustawienia modułu

W Moduły → Menedżer modułów → Smart Offers → Konfiguruj dostępne są dwa ustawienia globalne:

  • Pozycja baneru na stronie produktu. Pięć pozycji, każda odpowiadająca hookowi motywu Classic:
    • Pod blokiem Dodaj do koszyka (domyślnie): displayProductAdditionalInfo
    • Pod ceną: displayProductPriceBlock, typ after_price
    • Pod zdjęciami produktu: displayAfterProductThumbs
    • W bloku zaufania, pod ikonami płatności: displayReassurance
    • Pełna szerokość, pod kartą produktu: displayFooterProduct

    Moduł jest zarejestrowany na wszystkich pięciu hookach i tylko wybrany renderuje baner. Jeśli motyw nie wywołuje wybranego hooka, baner się nie pokaże: wybierz inny.

  • Kompaktowy baner. Wymusza wszędzie gęsty układ (mniejsze odstępy, miniatury 92 px, grupy obok siebie). Bez tej opcji baner sam przełącza się na ten układ, gdy jego kolumna jest węższa niż 520 px, a poniżej 300 px układa grupy jedna pod drugą. Wykrywanie opiera się na szerokości kolumny, nie okna: wąska karta produktu na szerokiej stronie jest traktowana jak telefon.
Przeglądarki sprzed 2023 roku nie obsługują zapytań kontenerowych; wracają do wykrywania na podstawie szerokości okna (768 px i 400 px).

Wyświetlanie na stronie produktu

Na każdej stronie produktu wyzwalającego wyświetlany jest baner z gradientem w pozycji wybranej w ustawieniach (domyślnie pod przyciskiem Dodaj do koszyka). Zawiera:

  • Białą odznakę pigułkę z ikoną prezentu, zawierającą tekst odznaki
  • Tytuł oferty
  • Dynamiczny komunikat zależny od typu oferty („Kup 1, otrzymaj 1 więcej gratis”, „Za każdą partię 10 otrzymaj 20 więcej gratis” itd.)
  • Siatkę z klikalnymi miniaturami produktów objętych ofertą, rozdzielonych na dwie grupy Kup / Otrzymaj gratis z okrągłym separatorem SVG między nimi

Kolor baneru odpowiada kolorowi odznaki skonfigurowanemu dla oferty. Renderowanie jest responsywne: na urządzeniach mobilnych obie grupy układają się pionowo, a separator obraca się, wskazując w dół.

Wyświetlanie w koszyku

Dwa odrębne wskaźniki pomagają klientowi zidentyfikować produkty prezentowe w koszyku.

Odznaka prezentu na każdej linii

Na każdej linii koszyka zawierającej sztuki dodane automatycznie przez ofertę pojawia się mała kolorowa odznaka 🎁 ×N gratis w kolumnie informacji o produkcie, pod ceną i wariantami. Kolor odpowiada kolorowi odznaki oferty, a odznaka pokazuje, ile sztuk tej linii jest gratis (przydatne, gdy część ilości jest opłacona, a część oferowana, np. przy 1+1 na tym samym produkcie).

Od 2.1.2 ta odznaka jest renderowana przez hook displayProductPriceBlock (typ unit_price), który motyw Classic wywołuje w kolumnie informacji każdej linii koszyka. Dla motywów, które nie wywołują tego hooka, moduł przechodzi na displayCartExtraProductActions w kolumnie akcji. Rejestr per żądanie gwarantuje, że linia jest dekorowana tylko raz, nawet gdy motyw udostępnia oba hooki.

Szczegółowa stopka koszyka

Na dole siatki produktów zielony blok podsumowuje oferty aktywne w koszyku. Dla każdej oferty blok pokazuje:

  • Nazwę oferty i tekst odznaki (w kolorowej pigułce)
  • Listę produktów oferowanych przez tę ofertę, jako wizualne chipy z okrągłą miniaturą, nazwą (z wariantem, np. „Poduszka niedźwiedź brunatny (Kolor: Biały)”) i ilością
  • Każdy chip jest klikalny i prowadzi do strony produktu prezentowego

Klient może szybko sprawdzić, co otrzymał gratis i dzięki której operacji handlowej.

Przypadki szczególne i zachowania

Dlaczego 1+1 na tym samym produkcie jest obsługiwane specjalnie

Gdy produkt wyzwalający jest jednocześnie produktem nagrodą, wiele modułów ofert łączonych na rynku popełnia błąd, identyfikując opłaconą sztukę klienta jako już oferowaną, i stosuje rabat na tę sztukę. W efekcie klient płaci zero za jedną sztukę zamiast zapłacić za jedną i otrzymać drugą gratis.

Smart Offers obsługuje ten przypadek precyzyjną logiką: docelowa ilość w koszyku równa się ilość opłacona przez klienta + ilość nagrody. Gdy klient dodaje jedną sztukę, silnik dodaje drugą, aby koszyk zawierał dwie sztuki, a rabat stosuje się tylko do drugiej sztuki. Klient płaci więc cenę jednej sztuki, mając dwie w koszyku.

Oferty na produkty z wariantami

Oferta może dotyczyć konkretnego wariantu lub produktu jako całości. W panelu administracyjnym dodanie produktu przez Produkt główny (bez wariantu) zapisuje symbol wieloznaczny: silnik czyta go dokładnie tak jak baner, jako „dowolny wariant”.

  • Wyzwalacz z symbolem wieloznacznym: kupiona ilość to suma wszystkich wariantów tego produktu w koszyku. Dwie białe poduszki i jedna czarna liczą się jako trzy sztuki.
  • Nagroda z symbolem wieloznacznym: silnik musi wybrać konkretny wariant przed dodaniem do koszyka. Najpierw bierze ten, który klient ma już w koszyku dla tego produktu (1+1 na białej poduszce dodaje białą poduszkę). Jeśli produktu nie ma jeszcze w koszyku, bierze domyślny wariant zdefiniowany w katalogu. Produkt bez wariantów jest dodawany bez zmian.
  • Wybór wariantów z symbolem wieloznacznym: każdy wariant obecny w koszyku staje się osobną linią kandydującą, więc sortowanie po cenie może wskazać najtańsze.
Przed 2.0.1 oferta zapisana z symbolem wieloznacznym nigdy się nie uruchamiała, gdy klient dodawał wariant: baner się wyświetlał, ale w koszyku nic się nie działo. Jeśli widzisz ten objaw, zaktualizuj moduł.

Kumulacja partii (opcja kumulowalna)

Bez kumulacji oferta stosuje się tylko raz, niezależnie od liczby partii wyzwalających w koszyku. Jeśli klient kupi 5 sztuk produktu z ofertą 1+1 i wyłączoną kumulacją, otrzyma 1 sztukę gratis (nie 5).

Z włączoną kumulacją silnik mnoży liczbę partii nagród przez całkowitą liczbę obecnych partii wyzwalających. Dla tej samej oferty 1+1 z włączoną kumulacją i 5 sztukami w koszyku klient otrzyma 5 sztuk gratis (koszyk końcowy: 10 sztuk, 5 opłaconych).

Opcja kumulacji jest domyślnie wyłączona. Włączaj ją ostrożnie: może znacząco obniżyć marże przy operacjach o dużym wolumenie.

Stan magazynowy i niedostępność

Dodawanie produktów nagród do koszyka przechodzi przez Cart::updateQty, które respektuje natywne zasady magazynowe PrestaShop. Jeśli produkt nagroda jest niedostępny, a sklep nie pozwala na zamawianie produktów bez stanu, dodanie cicho się nie powiedzie i rabat nie zostanie zastosowany. Warunek pozostaje gotowy do uruchomienia, gdy tylko produkt wróci do magazynu.

Wiele jednoczesnych ofert w tym samym koszyku

Każda oferta generuje własną regułę koszyka z włączonym partial_use. Pozwala to łączyć wiele równoległych ofert w tym samym koszyku bez konfliktów i zachowuje zgodność z klasycznymi kodami rabatowymi, które mogą wpisywać klienci.

Języki modułu

Od 2.1.2 językiem źródłowym modułu jest angielski, a siedem tłumaczeń dostarczanych jest w folderze translations/: francuski, niemiecki, włoski, hiszpański, niderlandzki, portugalski i polski. Obejmują baner na stronie produktu, koszyk, nazwę reguły koszyka widzianą przez klienta, formularz tworzenia oferty i komunikaty wyszukiwarki produktów.

Każdy ciąg pozostaje edytowalny z Międzynarodowe → Tłumaczenia po wybraniu modułu dfoffers. Sklep w języku niedostarczonym wyświetla angielski i może być przetłumaczony w tym samym miejscu.

Nie należy mylić z nazwą, odznaką i opisem każdej oferty, które sam wpisujesz w każdym aktywnym języku sklepu podczas tworzenia oferty.

Architektura techniczna

Używane hooki

  • displayProductAdditionalInfo, displayProductPriceBlock (typ after_price), displayAfterProductThumbs, displayReassurance, displayFooterProduct: baner na stronie produktu, tylko jeden aktywny zależnie od ustawień
  • displayShoppingCartFooter: szczegółowa stopka na stronie koszyka
  • displayProductPriceBlock: odznaka prezentu w kolumnie informacji każdej linii koszyka (typ unit_price, tylko strona koszyka)
  • displayCartExtraProductActions: odznaka prezentu jako rezerwa, w kolumnie akcji
  • actionCartSave: silnik oceny i automatycznego dodawania
  • actionFrontControllerSetMedia i actionAdminControllerSetMedia: wstrzykiwanie CSS i JS
  • actionObjectProductDeleteAfter: automatyczne czyszczenie ofert odwołujących się do usuniętego produktu

Tylko actionCartSave i actionFrontControllerSetMedia są traktowane jako wymagane do instalacji. Hooki wyświetlania, których motyw nie implementuje, są logowane bez przerywania instalacji.

Dodane tabele

  • ps_dfoffers_offer: konfiguracja każdej oferty (typ, daty, priorytet, kumulacja)
  • ps_dfoffers_offer_lang: przetłumaczona nazwa, odznaka i opis dla każdego języka
  • ps_dfoffers_trigger: produkty wyzwalające każdej oferty
  • ps_dfoffers_reward: produkty nagrody każdej oferty
  • ps_dfoffers_shop: powiązanie oferta / sklep w multi-sklepie
  • ps_dfoffers_cart_auto: śledzenie automatycznie dodanych sztuk dla każdego koszyka i oferty, z ID wygenerowanej reguły koszyka

Wszystkie tabele używają prefiksu skonfigurowanego w Twojej instalacji PrestaShop (domyślnie ps_). Schemat jest identyczny w PrestaShop 8 i 9, co czyni migrację przezroczystą.

Klasa DfOfferCompat

Wszystkie różnice API między PrestaShop 8 i 9 są skupione w classes/DfOfferCompat.php. Reszta modułu nigdy nie sprawdza bezpośrednio wersji PrestaShop. Punkty absorbowane przez tę klasę:

  • Odczyt wariantów: PrestaShop 9 usunął argument języka z Product::getAttributeCombinations(), gdzie pierwszym parametrem jest teraz flaga logiczna grupowania.
  • URL AJAX panelu: w PrestaShop 9 para ajax i action musi przechodzić przez czwarty argument getAdminLink(), ponieważ token jest obliczany przed scaleniem parametrów.
  • Odpowiedź JSON: metoda wysyłająca celowo nosi nazwę inną niż ajaxRender(), której sygnatura nadrzędna nie może być nadpisana.
  • Zakładka admina: PrestaShop 9 wprowadził dodatkowe kolumny tłumaczeń, wypełniane pod warunkiem, aby nie tworzyć dynamicznej właściwości w PrestaShop 8.

Nadpisywanie szablonów w motywie

CSS modułu jest izolowany pod prefiksem .dfoffers-, aby uniknąć konfliktów z Twoim arkuszem stylów. Jeśli chcesz zmienić renderowanie, skopiuj szablony z /modules/dfoffers/views/templates/hook/ do /themes/twoj-motyw/modules/dfoffers/views/templates/hook/ i dostosuj je. Dostępne są trzy szablony:

  • product-banner.tpl: baner na stronie produktu
  • cart-offer.tpl: blok podsumowania w stopce koszyka
  • cart-line-gift.tpl: odznaka prezentu w linii koszyka

Aktualizacja modułu

Aby zaktualizować do nowej wersji, po prostu prześlij nowy ZIP z Menedżera modułów. PrestaShop wykrywa zmianę wersji w config.xml i automatycznie uruchamia skrypty aktualizacji obecne w /upgrade/upgrade-X.Y.Z.php, które obsługują np. rejestrację nowych hooków dodanych między wersjami.

Między wersjami nie jest potrzebne odinstalowanie/ponowna instalacja, a istniejące oferty pozostają nienaruszone.

Migracja sklepu z PrestaShop 8 na PrestaShop 9

Ponieważ schemat bazy danych jest identyczny, oferty, tłumaczenia i powiązania sklepów przechodzą migrację bez przekształceń. Zalecana procedura:

  1. Przenieś moduł na 2.x przed migracją sklepu, gdy działa jeszcze na PrestaShop 8. Wersje 2.x działają na obu generacjach, więc zmniejszasz liczbę zmiennych, jeśli coś pójdzie nie tak.
  2. Zmigruj sklep na PrestaShop 9 zgodnie z oficjalną procedurą PrestaShop.
  3. Przejdź do Wygląd → Pozycje i sprawdź, czy hooki modułu są nadal podpięte. Migracja może niektóre zgubić.
  4. Jeśli brakuje hooków, prześlij ponownie ZIP: skrypt aktualizacji ponownie rejestruje każdy brakujący hook i czyści wiersze śledzenia, których koszyk już nie istnieje.
PrestaShop 9 wymaga co najmniej PHP 8.1. Sprawdź wersję PHP hostingu przed rozpoczęciem migracji: to najczęstsza przyczyna niepowodzeń, na długo przed modułami.

Rozwiązywanie problemów

Produkty nagrody nie są dodawane do koszyka

  1. Wyczyść cache PrestaShop w Parametry zaawansowane → Wydajność
  2. Sprawdź, czy hook actionCartSave zawiera moduł w Wygląd → Pozycje
  3. Sprawdź, czy produkt nagroda jest dostępny (nie jest niedostępny, jeśli zamówienia bez stanu są zabronione, nie jest wyłączony, jest przypisany do bieżącego sklepu)
  4. Jeśli produkt wyzwalający ma warianty, a baner wyświetla się na stronie produktu, sprawdź, czy moduł jest w wersji 2.0.1 lub nowszej: wcześniejsze wersje nie czytały symbolu wieloznacznego „wszystkie warianty” po stronie silnika
  5. Sprawdź Parametry zaawansowane → Logi, szukając dfoffers: silnik śledzi swoje działanie przy każdej zmianie koszyka

Rabat nie jest stosowany mimo dodania produktu

Sprawdź w logach linię checkValidity, która następuje po utworzeniu reguły koszyka. PrestaShop wskazuje dokładnie, dlaczego reguła jest odrzucona (brak stanu, ograniczenie klienta, inna waluta itd.).

Odznaka prezentu nie pojawia się na liniach koszyka

Moduł szuka najpierw hooka displayProductPriceBlock w cart-detailed-product-line.tpl, potem displayCartExtraProductActions. Motywy Classic PrestaShop 8 i 9 oraz większość motywów komercyjnych zawiera co najmniej jeden z nich. Jeśli Twój niestandardowy motyw nie implementuje żadnego, dodaj jedną z tych linii do pliku cart-detailed-product-line.tpl, najlepiej pierwszą w kolumnie informacji o produkcie:

{hook h='displayProductPriceBlock' product=$product type="unit_price"}
{hook h='displayCartExtraProductActions' product=$product}

Odznaka jest ucięta lub pokazuje tylko ikonę

Objaw wersji 2.1.0 i 2.1.1 w motywie Classic, gdzie odznaka była renderowana w kolumnie akcji, zbyt wąskiej na tekst. Naprawione w 2.1.2 przez przeniesienie do kolumny informacji o produkcie. Zaktualizuj moduł.

Błąd 500 przy zapisie oferty

Przed 2.2.0 nazwa lub tekst odznaki zawierający =, ;, #, { lub } był odrzucany przez walidatory PrestaShop i zapis kończył się pustą stroną. Od 2.2.0 te znaki są akceptowane, a każda naprawdę nieprawidłowa wartość jest zgłaszana w formularzu zamiast powodować błąd. Jeśli nadal występuje 500, sprawdź Parametry zaawansowane → Logi: przyczyna jest zapisana pod dfoffers save failed.

Wyszukiwarka produktów w panelu nic nie zwraca po migracji na PrestaShop 9

Wyczyść cache PrestaShop, a następnie przeładuj stronę tworzenia oferty. URL punktu końcowego wyszukiwania jest budowany po stronie serwera podczas renderowania formularza; strona zbuforowana przed migracją może nadal zawierać stary URL. Jeśli problem nie ustępuje, otwórz konsolę przeglądarki: odpowiedź 404 na żądanie wyszukiwania oznacza, że zakładka modułu nie została poprawnie odtworzona, a ponowna instalacja modułu naprawia to bez utraty ofert.

Instalacja wydaje się udana, ale nie można utworzyć żadnej oferty

Przed 2.0.0 niepowodzenie tworzenia tabel podczas instalacji było ciche, a moduł pokazywał się jako zainstalowany. Od 2.0.0 ta sytuacja powoduje niepowodzenie instalacji z wyraźnym komunikatem. Jeśli napotkasz to w starszej wersji, sprawdź uprawnienia użytkownika MySQL do tworzenia tabel, a następnie odinstaluj i zainstaluj ponownie moduł.

Często zadawane pytania

Czy moduł jest zgodny z PrestaShop 9?

Tak, od wersji 2.0.0. Ten sam plik ZIP instaluje się na PrestaShop 8.0 i PrestaShop 9.x. Różnice API absorbuje wewnętrzna klasa DfOfferCompat, więc nie ma osobnej gałęzi do wyboru przy pobieraniu. Wersje 1.x pozostawały ograniczone do PrestaShop 8.0 do 8.99.

Jaki jest wpływ na wydajność?

Silnik wykonuje jedno zapytanie SQL na aktywną ofertę w sklepie, a następnie ocenia warunki w pamięci. W katalogu z około dziesięcioma aktywnymi ofertami pełna ocena trwa średnio poniżej pięćdziesięciu milisekund. Ta wartość jest identyczna w PrestaShop 8 i 9.

Czy mogę używać modułu z motywem headless?

Silnik automatycznego dodawania jest niezależny od motywu i działa dla każdego front-endu, który przechodzi przez Cart::updateQty lub REST API PrestaShop. Baner strony produktu i odznaka prezentu w koszyku to natywne hooki Smarty, które wymagają klasycznego motywu do wyświetlenia. Dla frontu headless możesz udostępnić dane przez własne API, które odpytuje bezpośrednio ps_dfoffers_offer i ps_dfoffers_cart_auto.

Czy moduł obsługuje wiele walut?

Tak. Reguła koszyka generowana dla każdej oferty używa waluty bieżącego koszyka. Jeśli klient zmieni walutę, reguła jest regenerowana z poprawną wartością przy następnym actionCartSave.

Co się stanie, jeśli kliknę Resetuj w menedżerze modułów?

Moduł jest odinstalowywany, a następnie ponownie instalowany w tym samym żądaniu, co usuwa i odtwarza tabele: wszystkie oferty zostają utracone. Od 2.0.0 ta operacja poprawnie odtwarza tabele, podczas gdy wcześniejsze wersje pozostawiały sklep w ogóle bez tabel. W obu przypadkach wykonaj kopię zapasową przed resetem.

Czy ta strona była pomocna?

Nadal utknąłeś? Napisz do wsparcia