PS PrestaShop Mittel

Smart Offers — Vollständige Dokumentation

Alles, was Sie zur Konfiguration und Nutzung des Smart Offers Moduls auf PrestaShop 8 und 9 wissen müssen: die vier Arten gruppierter Angebote, die Auto-Add-Engine und das Migrationsverfahren.

Aktualisiert Modulversion 2.2.1

Smart Offers ist ein mit PrestaShop 8 und 9 kompatibles Modul, mit dem Sie 1+1-Angebote, Mengenpakete, Multi-Produkt-Pakete und Wahlangebote erstellen können, mit automatischem Hinzufügen der Geschenkprodukte zum Warenkorb und einer sorgfältigen Darstellung auf der Produktseite.

Überblick

Smart Offers deckt die vier am häufigsten verwendeten Formate gruppierter Angebote im E-Commerce in einem einzigen Modul ab, ohne komplexe Konfiguration. Die Engine bewertet den Warenkorb bei jeder Änderung, fügt die Geschenkprodukte automatisch hinzu, sobald die Bedingungen erfüllt sind, und erstellt eine Warenkorbregel, die diese Einheiten kostenlos macht. Das Kundenerlebnis ist sofort und lesbar.

Kurz gesagt: Der Händler erstellt ein Angebot in weniger als einer Minute über eine visuelle Oberfläche, der Kunde sieht das Geschenk automatisch in seinem Warenkorb erscheinen mit einem klaren Indikator, und das interne Tracking ermöglicht einen sauberen Widerruf, wenn der Kunde während der Sitzung einen Trigger entfernt.

Kompatibilität mit PrestaShop 8 und 9

Seit Version 2.0.0 deckt eine einzige ZIP-Datei PrestaShop 8.0 bis 9.x ab. Beim Download muss kein separater Zweig gewählt werden: Das Modul erkennt die Shop-Version zur Laufzeit und passt seine Aufrufe an die APIs an, die sich zwischen den beiden Generationen geändert haben.

Element PrestaShop 8 PrestaShop 9
Erforderliche PHP-Version 7.4 bis 8.3 8.1 bis 8.3
Datenbankschema Identisch, sechs Tabellen ps_dfoffers_*
Verwendete Hooks Identisch
Angebotskonfiguration Identisch, transparente Migration
Die API-Unterschiede sind in einer einzigen internen Klasse zusammengefasst, DfOfferCompat. Wenn Sie Modulcode in einem maßgeschneiderten Projekt überschreiben, ist das die einzige Datei, die Sie lesen müssen, um die Versionsverzweigungen zu verstehen.

Installation

  1. Laden Sie die Datei dfoffers-vX.Y.Z.zip aus Ihrem DataFirefly-Kundenbereich herunter
  2. Gehen Sie im PrestaShop-Backoffice zu Module → Modulverwaltung
  3. Klicken Sie auf die Schaltfläche Modul hochladen oben auf der Seite
  4. Ziehen Sie die ZIP-Datei per Drag-and-Drop oder klicken Sie, um sie auszuwählen
  5. Die Installation erfolgt automatisch: Tabellen werden erstellt, Hooks registriert, und ein neuer Reiter Katalog → Gruppierte Angebote erscheint im Menü
Es ist keine externe Abhängigkeit erforderlich. Das Modul verwendet die nativen PrestaShop-Klassen (Cart, CartRule, Product) und fügt Ihrer composer.json nichts hinzu.

Die vier Angebotstypen

1+1 auf dasselbe Produkt

Das virale Buy-One-Get-One-Format: Der Kunde kauft eine Einheit eines Produkts und erhält eine weitere Einheit desselben Produkts kostenlos. Sie konfigurieren:

  • Ein einziges Produkt (als Trigger UND als Belohnung verwendet)
  • Die zu kaufende Menge, um das Angebot auszulösen (in der Regel 1)
  • Die Geschenkmenge (in der Regel 1)

Typisches Beispiel: „Beim Kauf von 1 Paar Socken ist das zweite gratis.“ Wenn der Kunde das Paar in seinen Warenkorb legt, fügt die Engine automatisch ein zweites hinzu und wendet einen Rabatt in Höhe des Stückpreises an.

Kaufe X, erhalte Y kostenlos (verschiedene Produkte)

Bundle-Format: Mehrere unterschiedliche Trigger-Produkte müssen im Warenkorb vorhanden sein, damit das Angebot aktiviert wird, und dann werden ein oder mehrere verschiedene Produkte kostenlos angeboten. Sie konfigurieren:

  • Die Liste der Trigger-Produkte mit ihren jeweiligen Mengen
  • Die Liste der Belohnungsprodukte mit ihren jeweiligen Mengen

Typisches Beispiel: „Beim Kauf einer Tagescreme und eines Serums zusammen erhalten Sie eine Maskenprobe gratis.“ Die Engine prüft, ob alle Trigger vorhanden sind, bevor sie das Angebot aktiviert.

Variantenwahl

Freies Kompositionsformat: Sie definieren eine Liste möglicher Produkte oder Varianten, aus denen der Kunde sein Los zusammenstellt. Die Engine identifiziert automatisch die billigsten Warenkorbartikel als kostenlose Einheiten, was der üblichen kommerziellen Interpretation des Buy-N-Get-M entspricht.

  • Die Liste möglicher Produkte oder Varianten
  • Die Anzahl der zu kaufenden Einheiten aus dieser Menge
  • Die Anzahl der Geschenkeinheiten (die billigsten)

Typisches Beispiel: „3 T-Shirts aus unserer Auswahl gekauft, das billigste ist gratis.“ Der Kunde stellt sein Los zusammen, die Engine berührt seinen Warenkorb nicht, sondern wendet einen Rabatt auf die billigsten Einheiten an.

Mengenpaket

B2B- und Lagerräumungsformat: Für jedes Los von X gekauften Einheiten eines Produkts erhält der Kunde Y kostenlose Einheiten eines anderen Produkts. Sie konfigurieren:

  • Das Trigger-Produkt mit der Stufenmenge (z. B. 10)
  • Das Belohnungsprodukt mit der angebotenen Menge (z. B. 20)

Typisches Beispiel: „Für 10 gekaufte Weinflaschen erhalten Sie 2 Gläser gratis.“ Praktisch für Lieferanten, die ein ergänzendes Produkt fördern oder ruhenden Bestand abbauen wollen, indem sie ihn an ein gut verkauftes Produkt hängen.

Ihr erstes Angebot erstellen

Gehen Sie im Backoffice zu Katalog → Gruppierte Angebote und klicken Sie auf Neues Angebot.

Schritt 1: Typ wählen

Vier visuelle Karten präsentieren Ihnen die verfügbaren Typen mit einer kurzen Beschreibung. Klicken Sie auf die, die Ihrer kommerziellen Aktion entspricht. Das Formular passt sich automatisch an und zeigt nur die für diesen Typ relevanten Felder.

Schritt 2: Angebot benennen und mit Badge versehen

Geben Sie Folgendes ein:

  • Angebotsname (Pflichtfeld): Das, was der Kunde im Banner sehen wird. Ein Feld pro aktiver Shopsprache.
  • Badge-Text (optional, max. 64 Zeichen): kurze Nachricht, die im Pill oben am Banner angezeigt wird (z. B. 1+1 GRATIS, SONDERANGEBOT, BLACK FRIDAY).
  • Badge-Farbe: sechs DataFirefly-Presets verfügbar plus ein freier Farbwähler. Die Farbe wird sowohl für das Banner der Produktseite ALS AUCH für die Geschenkmarke auf der Warenkorbseite verwendet.

Schritt 3: Trigger-Produkte hinzufügen

Klicken Sie auf Trigger-Produkt hinzufügen. Ein Suchmodal öffnet sich mit einem Feld, das Ihren Katalog live abfragt (Debounce 250 ms nach dem letzten Tastendruck). Geben Sie einen Namen, eine Referenz oder eine EAN ein; die Ergebnisse erscheinen sofort.

Klicken Sie auf ein Produkt, um es hinzuzufügen. Wenn das Produkt Varianten hat, erscheinen die Varianten als Schaltflächen unter dem Ergebnis, klicken Sie auf die, die Sie interessiert, um sie direkt hinzuzufügen. Geben Sie die erforderliche Menge im Feld rechts neben der Zeile an.

Produkt mit Varianten: Die Schaltfläche Hauptprodukt (ohne Variante) fügt das Produkt mit einem Platzhalter hinzu. Das Angebot gilt dann für alle Varianten, und die gekaufte Menge wird über alle Varianten hinweg gezählt. Wählen Sie eine bestimmte Variante nur, wenn das Angebot auf diese beschränkt sein soll.

Schritt 4: Geschenkprodukte hinzufügen

Gleiches Verfahren für die Geschenkprodukte. Dieser Abschnitt ist für den Typ Variantenwahl ausgeblendet, da die Varianten sowohl als Kandidaten als auch als Belohnungen dienen.

Schritt 5: spezifische Regeln

  • Kumulierbar: Wenn aktiviert, gilt das Angebot mehrmals für jedes Trigger-Los. Ohne Kumulierung gilt das Angebot nur einmal unabhängig von der Anzahl der Einheiten. Standardmäßig deaktiviert, um Ihre Margen zu schützen.
  • Für den Typ Variantenwahl erscheinen zwei zusätzliche Felder: wie viele Einheiten der Kunde kaufen muss und wie viele kostenlos angeboten werden.

Schritt 6: Aktivierung

  • Gültigkeitsdaten: Lassen Sie leer für ein permanentes Angebot. Geben Sie das Start- oder Enddatum ein, um die Aktivierung zu automatisieren. Ein unlesbares Datum wird abgelehnt, und das Enddatum muss nach dem Startdatum liegen.
  • Priorität: Wenn mehrere Angebote gleichzeitig gelten können, wird dasjenige mit der niedrigsten Priorität zuerst ausgewertet.
  • Status: On/Off-Schalter, standardmäßig aktiviert. Praktisch, um ein Angebot vorübergehend zu deaktivieren, ohne es zu löschen.

Schritt 7: Shops (bei Multi-Shop)

Wählen Sie die Shops aus, in denen das Angebot verfügbar sein soll. Nichts ankreuzen bedeutet, dass das Angebot in allen Shops aktiv ist.

Ein Angebot bearbeiten oder löschen

Unter Katalog → Gruppierte Angebote hat jede Zeile der Liste eine Schaltfläche Bearbeiten und in ihrem Dropdown Löschen. Der Schalter in der Spalte Aktiv erlaubt es auch, ein Angebot auszusetzen, ohne es zu löschen. Um mehrere Angebote gleichzeitig zu bearbeiten, markieren Sie sie und verwenden Sie die Sammelaktionen am Ende der Liste.

Das Löschen ist endgültig und bereinigt alles, was vom Angebot abhängt: Trigger, Belohnungen, Shop-Zuordnungen und die Warenkorbregeln, die die Engine für laufende Warenkörbe erzeugt hatte. Ein Kunde, der das Geschenk im Warenkorb hatte, sieht es bei seiner nächsten Aktion verschwinden.

Wie die Auto-Add-Engine funktioniert

Die Engine hängt sich an den PrestaShop-Hook actionCartSave und läuft bei jeder Warenkorbänderung (Hinzufügen, Entfernen, Mengenänderung, Zusammenführung beim Login).

  1. Sie ruft alle aktiven Angebote für den aktuellen Shop ab
  2. Für jedes Angebot berechnet sie die bezahlte Menge jedes Trigger-Produkts (Gesamtmenge im Warenkorb minus dem, was die Engine bei einer vorherigen Auswertung bereits automatisch hinzugefügt hat)
  3. Sie bewertet, ob die Bedingungen des Angebots erfüllt sind
  4. Wenn ja, fügt sie die fehlenden Geschenkprodukte über Cart::updateQty zum Warenkorb hinzu
  5. Sie erstellt oder aktualisiert eine Warenkorbregel (CartRule) mit einem festen Bruttorabatt in Höhe des Wertes der angebotenen Einheiten
  6. Sie zeichnet in der Tabelle ps_dfoffers_cart_auto die hinzugefügten Einheiten auf, um sie von den Einheiten zu unterscheiden, die der Kunde selbst hinzugefügt hat
Die Engine schützt vor Endlosschleifen: Cart::updateQty löst den Hook actionCartSave erneut aus, aber ein statischer Schutz im Modul verhindert die Rekursion.

Sauberer Widerruf

Wenn der Kunde ein Trigger-Produkt entfernt oder seine Menge unter die Schwelle reduziert, bewertet die Engine das Angebot beim nächsten actionCartSave neu. Wenn die Bedingung nicht mehr erfüllt ist, entfernt sie die automatisch hinzugefügten Einheiten (ohne die vom Kunden selbst hinzugefügten Einheiten dank des Trackings zu berühren) und löscht die zugehörige Warenkorbregel.

Moduleinstellungen

Unter Module → Modulverwaltung → Smart Offers → Konfigurieren gibt es zwei globale Einstellungen:

  • Position des Banners auf der Produktseite. Fünf Positionen, jede einem Hook des Classic-Themes zugeordnet:
    • Unter dem Warenkorb-Block (Standard): displayProductAdditionalInfo
    • Unter dem Preis: displayProductPriceBlock, Typ after_price
    • Unter den Produktbildern: displayAfterProductThumbs
    • Im Vertrauensblock, unter den Zahlungssymbolen: displayReassurance
    • Volle Breite, unter der Produktseite: displayFooterProduct

    Das Modul ist an allen fünf Hooks registriert, nur der gewählte rendert das Banner. Ruft Ihr Theme den gewählten Hook nicht auf, erscheint das Banner nicht: wählen Sie einen anderen.

  • Kompaktes Banner. Erzwingt überall das dichte Layout (kleinere Abstände, 92-px-Miniaturen, Gruppen nebeneinander). Ohne diese Option wechselt das Banner bereits von selbst zu diesem Layout, wenn seine Spalte schmaler als 520 px ist, und stapelt die Gruppen unter 300 px. Die Erkennung basiert auf der Spaltenbreite, nicht auf dem Viewport: eine schmale Produktseite auf einer breiten Website wird wie ein Smartphone behandelt.
Browser vor 2023 unterstützen keine Container-Queries; sie fallen auf eine Viewport-basierte Erkennung zurück (768 px und 400 px).

Darstellung auf der Produktseite

Auf jeder Trigger-Produktseite wird ein Verlaufsbanner an der in den Einstellungen gewählten Position angezeigt (standardmäßig unter dem Warenkorb-Button). Es enthält:

  • Ein weißes Pill-Badge mit Geschenk-Icon, das den Badge-Text enthält
  • Den Angebotstitel
  • Eine dynamische Nachricht je nach Angebotstyp („Kaufen Sie 1, erhalten Sie 1 weitere gratis“, „Für jedes Los von 10 erhalten Sie 20 gratis dazu“ usw.)
  • Ein Raster mit klickbaren Miniaturansichten der beteiligten Produkte, getrennt in zwei Gruppen Kaufen Sie / Erhalten Sie gratis mit einem kreisförmigen SVG-Separator dazwischen

Die Bannerfarbe übernimmt die im Angebot konfigurierte Badge-Farbe. Die Darstellung ist responsiv: Auf Mobilgeräten stapeln sich die beiden Gruppen vertikal, und der Separator dreht sich, um nach unten zu zeigen.

Darstellung im Warenkorb

Zwei verschiedene Indikatoren helfen dem Kunden, die Geschenkprodukte in seinem Warenkorb zu identifizieren.

Geschenk-Badge auf jeder Zeile

Auf jeder Warenkorbzeile, die von einem Angebot automatisch hinzugefügte Einheiten enthält, erscheint ein kleines farbiges Badge 🎁 ×N gratis in der Produktinfo-Spalte, unter Preis und Varianten. Die Farbe übernimmt die des Angebots-Badges, und das Badge zeigt an, wie viele Einheiten dieser Zeile kostenlos sind (nützlich, wenn ein Teil der Menge bezahlt und der andere angeboten wird, z. B. bei einem 1+1 gleiches Produkt).

Seit 2.1.2 wird dieses Badge über den Hook displayProductPriceBlock (Typ unit_price) gerendert, den das Classic-Theme in der Infospalte jeder Warenkorbzeile aufruft. Bei Themes, die diesen Hook nicht aufrufen, greift das Modul auf displayCartExtraProductActions in der Aktionsspalte zurück. Ein Register pro Anfrage stellt sicher, dass eine Zeile nur einmal dekoriert wird, auch wenn ein Theme beide Hooks bereitstellt.

Unter dem Produktraster fasst ein grüner Block die im Warenkorb aktivierten Angebote zusammen. Für jedes Angebot zeigt der Block:

  • Den Angebotsnamen und seinen Badge-Text (in farbigem Pill)
  • Die Liste der von diesem Angebot angebotenen Produkte als visuelle Chips mit runder Miniaturansicht, Name (mit seiner Variante, z. B. „Braunbär-Kissen (Farbe: Weiß)“) und Menge
  • Jeder Chip ist klickbar und führt zur Produktseite des Geschenks

Der Kunde kann so auf einen Blick überprüfen, was er kostenlos erhalten hat und durch welche kommerzielle Aktion.

Sonderfälle und Verhalten

Warum 1+1 auf dasselbe Produkt speziell behandelt wird

Wenn das Trigger-Produkt auch das Geschenkprodukt ist, machen viele Bundle-Angebotsmodule auf dem Markt den Fehler, die bezahlte Einheit des Kunden als bereits die angebotene Einheit zu identifizieren, und wenden den Rabatt auf diese Einheit an. Am Ende zahlt der Kunde null für eine Einheit, anstatt für eine zu zahlen und eine zweite gratis zu erhalten.

Smart Offers behandelt diesen Fall mit präziser Logik: Die Zielmenge im Warenkorb entspricht vom Kunden bezahlte Menge + Belohnungsmenge. Wenn der Kunde eine Einheit hinzufügt, fügt die Engine eine zweite hinzu, damit der Warenkorb zwei Einheiten enthält, und der Rabatt gilt nur für die zweite Einheit. Der Kunde zahlt also den Preis einer Einheit, um zwei in seinem Warenkorb zu haben.

Angebote auf Produkte mit Varianten

Ein Angebot kann auf eine bestimmte Variante oder auf das Produkt als Ganzes zielen. Im Backoffice speichert das Hinzufügen des Produkts über Hauptprodukt (ohne Variante) einen Platzhalter: Die Engine liest ihn genau wie das Banner, nämlich als „jede Variante“.

  • Trigger mit Platzhalter: Die gekaufte Menge ist die Summe aller Varianten dieses Produkts im Warenkorb. Zwei weiße Kissen und ein schwarzes Kissen zählen als drei Einheiten.
  • Belohnung mit Platzhalter: Die Engine muss vor dem Hinzufügen eine konkrete Variante wählen. Sie nimmt zuerst die, die der Kunde für dieses Produkt bereits im Warenkorb hat (ein 1+1 auf ein weißes Kissen fügt ein weißes Kissen hinzu). Ist das Produkt noch nicht im Warenkorb, nimmt sie die im Katalog definierte Standardvariante. Ein Produkt ohne Varianten wird unverändert hinzugefügt.
  • Variantenwahl mit Platzhalter: Jede im Warenkorb vorhandene Variante wird zu einer eigenen Kandidatenzeile, sodass die Preissortierung die billigsten bestimmen kann.
Vor 2.0.1 wurde ein mit Platzhalter gespeichertes Angebot nie ausgelöst, wenn der Kunde eine Variante hinzufügte: Das Banner wurde angezeigt, aber im Warenkorb passierte nichts. Wenn Sie dieses Symptom feststellen, aktualisieren Sie das Modul.

Kumulierung von Losen (Stackable-Option)

Ohne Kumulierung gilt das Angebot nur einmal unabhängig von der Anzahl der Trigger-Lose im Warenkorb. Wenn der Kunde 5 Einheiten eines Produkts mit einem 1+1-Angebot und deaktiviertem Stackable kauft, erhält er 1 kostenlose Einheit (nicht 5).

Mit aktivierter Kumulierung multipliziert die Engine die Anzahl der Belohnungslose mit der ganzzahligen Anzahl der vorhandenen Trigger-Lose. Für dasselbe 1+1-Angebot mit aktivem Stackable und 5 Einheiten im Warenkorb erhält der Kunde 5 kostenlose Einheiten (Endwarenkorb: 10 Einheiten, 5 bezahlt).

Die Stackable-Option ist standardmäßig deaktiviert. Aktivieren Sie sie mit Vorsicht: Sie kann Ihre Margen bei Aktionen mit hohem Volumen erheblich beeinträchtigen.

Bestand und Nichtverfügbarkeit

Das Hinzufügen der Geschenkprodukte zum Warenkorb erfolgt über Cart::updateQty, das die nativen Bestandsregeln von PrestaShop respektiert. Wenn ein Geschenkprodukt nicht auf Lager ist und der Shop keine Bestellung ohne Lager erlaubt, schlägt das Hinzufügen stillschweigend fehl und der Rabatt wird nicht angewendet. Die Bedingung bleibt bereit, sich auszulösen, sobald das Produkt wieder verfügbar ist.

Mehrere gleichzeitige Angebote im selben Warenkorb

Jedes Angebot generiert seine eigene Warenkorbregel mit aktiviertem partial_use. Dies ermöglicht das Stapeln mehrerer gleichzeitiger Angebote im selben Warenkorb ohne Konflikt und ist mit den klassischen Gutscheincodes kompatibel, die Ihre Kunden eingeben können.

Sprachen des Moduls

Seit 2.1.2 ist die Quellsprache des Moduls Englisch, und sieben Übersetzungen werden im Ordner translations/ mitgeliefert: Französisch, Deutsch, Italienisch, Spanisch, Niederländisch, Portugiesisch und Polnisch. Sie decken das Banner auf der Produktseite, den Warenkorb, den vom Kunden gesehenen Namen der Warenkorbregel, das Formular zur Angebotserstellung und die Meldungen des Produkt-Pickers ab.

Jede Zeichenkette bleibt über International → Übersetzungen änderbar, indem Sie das Modul dfoffers auswählen. Ein Shop in einer nicht mitgelieferten Sprache zeigt Englisch an und kann an derselben Stelle übersetzt werden.

Nicht zu verwechseln mit Name, Badge und Beschreibung jedes Angebots, die Sie beim Erstellen des Angebots selbst in jeder aktiven Shopsprache eingeben.

Technische Architektur

Verwendete Hooks

  • displayProductAdditionalInfo, displayProductPriceBlock (Typ after_price), displayAfterProductThumbs, displayReassurance, displayFooterProduct: Banner auf der Produktseite, je nach Einstellung nur einer aktiv
  • displayShoppingCartFooter: detaillierter Footer auf der Warenkorbseite
  • displayProductPriceBlock: Geschenk-Badge in der Infospalte jeder Warenkorbzeile (Typ unit_price, nur Warenkorbseite)
  • displayCartExtraProductActions: Geschenk-Badge als Fallback, in der Aktionsspalte
  • actionCartSave: Bewertungs- und Auto-Add-Engine
  • actionFrontControllerSetMedia und actionAdminControllerSetMedia: CSS- und JS-Injektion
  • actionObjectProductDeleteAfter: automatische Bereinigung von Angeboten, die auf ein gelöschtes Produkt verweisen

Nur actionCartSave und actionFrontControllerSetMedia gelten als für die Installation unverzichtbar. Anzeige-Hooks, die ein Theme nicht implementiert, werden protokolliert, ohne die Installation scheitern zu lassen.

Hinzugefügte Tabellen

  • ps_dfoffers_offer: Konfiguration jedes Angebots (Typ, Daten, Priorität, Kumulierung)
  • ps_dfoffers_offer_lang: übersetzter Name, Badge und Beschreibung pro Sprache
  • ps_dfoffers_trigger: Trigger-Produkte jedes Angebots
  • ps_dfoffers_reward: Belohnungsprodukte jedes Angebots
  • ps_dfoffers_shop: Angebot-/Shop-Zuordnung im Multi-Shop
  • ps_dfoffers_cart_auto: Tracking der automatisch hinzugefügten Einheiten pro Warenkorb und pro Angebot, mit der ID der generierten Warenkorbregel

Alle Tabellen verwenden das in Ihrer PrestaShop-Installation konfigurierte Präfix (ps_ standardmäßig). Das Schema ist auf PrestaShop 8 und 9 identisch, was die Migration transparent macht.

Die Klasse DfOfferCompat

Alle API-Unterschiede zwischen PrestaShop 8 und 9 sind in classes/DfOfferCompat.php konzentriert. Der Rest des Moduls prüft die PrestaShop-Version nie direkt. Die von dieser Klasse aufgefangenen Punkte:

  • Auslesen der Varianten: PrestaShop 9 hat das Sprachargument aus Product::getAttributeCombinations() entfernt, wo der erste Parameter nun das boolesche Gruppierungs-Flag ist.
  • AJAX-URL des Backoffice: Auf PrestaShop 9 muss das Paar ajax und action über das vierte Argument von getAdminLink() laufen, da das Token vor dem Zusammenführen der Parameter berechnet wird.
  • JSON-Antwort: Die Sendemethode trägt bewusst einen anderen Namen als ajaxRender(), dessen übergeordnete Signatur nicht überschrieben werden darf.
  • Admin-Reiter: PrestaShop 9 hat zusätzliche Übersetzungsspalten eingeführt, die unter einer Prüfung gefüllt werden, damit auf PrestaShop 8 keine dynamische Eigenschaft entsteht.

Templates in Ihrem Theme überschreiben

Das CSS des Moduls ist unter dem Präfix .dfoffers- isoliert, um Konflikte mit Ihrem Stylesheet zu vermeiden. Wenn Sie das Rendering ändern möchten, kopieren Sie die Templates von /modules/dfoffers/views/templates/hook/ nach /themes/ihr-theme/modules/dfoffers/views/templates/hook/ und passen Sie sie an. Drei Templates sind verfügbar:

  • product-banner.tpl: Banner auf der Produktseite
  • cart-offer.tpl: Zusammenfassungsblock im Warenkorb-Footer
  • cart-line-gift.tpl: Inline-Geschenk-Badge auf Warenkorbzeilen

Modul aktualisieren

Um auf eine neue Version zu aktualisieren, laden Sie einfach das neue ZIP über die Modulverwaltung hoch. PrestaShop erkennt den Versionswechsel in config.xml und führt automatisch die Upgrade-Skripte aus, die in /upgrade/upgrade-X.Y.Z.php vorhanden sind und beispielsweise das Registrieren neuer Hooks zwischen Versionen übernehmen.

Zwischen Versionen ist keine Deinstallation/Neuinstallation erforderlich, und Ihre bestehenden Angebote bleiben unversehrt erhalten.

Einen Shop von PrestaShop 8 auf PrestaShop 9 migrieren

Da das Datenbankschema identisch ist, überstehen Ihre Angebote, Ihre Übersetzungen und Ihre Shop-Zuordnungen die Migration ohne Transformation. Das empfohlene Vorgehen:

  1. Bringen Sie das Modul auf 2.x, bevor Sie den Shop migrieren, während er noch unter PrestaShop 8 läuft. Die 2.x-Versionen funktionieren auf beiden Generationen, so reduzieren Sie die Anzahl der Variablen, falls etwas schiefgeht.
  2. Migrieren Sie den Shop nach dem offiziellen PrestaShop-Verfahren auf PrestaShop 9.
  3. Gehen Sie zu Design → Positionen und prüfen Sie, ob die Hooks des Moduls noch angehängt sind. Eine Migration kann einige verlieren.
  4. Wenn Hooks fehlen, laden Sie das ZIP erneut hoch: Das Upgrade-Skript registriert jeden fehlenden Hook erneut und bereinigt Tracking-Zeilen, deren Warenkorb nicht mehr existiert.
PrestaShop 9 setzt mindestens PHP 8.1 voraus. Prüfen Sie die PHP-Version Ihres Hostings, bevor Sie die Migration starten: Das ist die häufigste Fehlerursache, weit vor den Modulen.

Fehlerbehebung

Die Geschenkprodukte werden nicht zum Warenkorb hinzugefügt

  1. Leeren Sie den PrestaShop-Cache unter Erweiterte Parameter → Leistung
  2. Überprüfen Sie, dass der Hook actionCartSave das Modul unter Design → Positionen enthält
  3. Überprüfen Sie, dass das Geschenkprodukt verfügbar ist (nicht ausverkauft, wenn Bestellungen ohne Bestand verboten sind, nicht deaktiviert, dem aktuellen Shop zugewiesen)
  4. Wenn das Trigger-Produkt Varianten hat und das Banner auf der Produktseite angezeigt wird, prüfen Sie, ob das Modul auf 2.0.1 oder höher ist: Frühere Versionen lasen den Platzhalter „alle Varianten“ auf Engine-Seite nicht
  5. Konsultieren Sie Erweiterte Parameter → Logs und suchen Sie nach dfoffers: Die Engine protokolliert ihre Ausführung bei jeder Warenkorbänderung

Der Rabatt wird trotz Hinzufügen des Produkts nicht angewendet

Überprüfen Sie in den Logs die Zeile checkValidity, die auf die Erstellung der Warenkorbregel folgt. PrestaShop gibt genau an, warum eine Regel abgelehnt wird (Bestand erschöpft, Kundenbeschränkung, andere Währung usw.).

Das Geschenk-Badge erscheint nicht auf den Warenkorbzeilen

Das Modul sucht zuerst den Hook displayProductPriceBlock in cart-detailed-product-line.tpl, dann displayCartExtraProductActions. Die Classic-Themes von PrestaShop 8 und 9 sowie die meisten kommerziellen Themes enthalten mindestens einen davon. Wenn Ihr benutzerdefiniertes Theme keinen implementiert, fügen Sie eine dieser Zeilen in Ihre Datei cart-detailed-product-line.tpl ein, vorzugsweise die erste in der Produktinfo-Spalte:

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

Das Badge ist abgeschnitten oder zeigt nur das Icon

Symptom der Versionen 2.1.0 und 2.1.1 im Classic-Theme, wo das Badge in der Aktionsspalte gerendert wurde, die zu schmal für Text ist. In 2.1.2 durch die Verschiebung in die Produktinfo-Spalte behoben. Aktualisieren Sie das Modul.

HTTP 500 beim Speichern eines Angebots

Vor 2.2.0 wurde ein Name oder Badge-Text mit =, ;, #, { oder } von den PrestaShop-Validatoren abgelehnt, und das Speichern endete in einer leeren Seite. Seit 2.2.0 werden diese Zeichen akzeptiert, und jeder wirklich ungültige Wert wird im Formular gemeldet, statt einen Fehler auszulösen. Tritt dennoch ein 500 auf, prüfen Sie Erweiterte Parameter → Logs: Die Ursache ist unter dfoffers save failed protokolliert.

Die Produktsuche im Backoffice liefert nach einer Migration auf PrestaShop 9 nichts zurück

Leeren Sie den PrestaShop-Cache und laden Sie die Seite zur Angebotserstellung neu. Die URL des Such-Endpoints wird beim Rendern des Formulars serverseitig erzeugt; eine vor der Migration zwischengespeicherte Seite kann noch eine alte URL tragen. Wenn das Problem bestehen bleibt, öffnen Sie die Browserkonsole: Eine 404-Antwort auf die Suchanfrage bedeutet, dass der Modul-Reiter nicht korrekt neu erstellt wurde, und eine Neuinstallation des Moduls behebt das, ohne die Angebote zu verlieren.

Die Installation scheint zu gelingen, aber es lässt sich kein Angebot erstellen

Vor 2.0.0 war ein Fehlschlag bei der Tabellenerstellung während der Installation stumm, und das Modul erschien als installiert. Seit 2.0.0 lässt diese Situation die Installation mit einer expliziten Meldung scheitern. Wenn Sie darauf in einer älteren Version stoßen, prüfen Sie die Rechte des MySQL-Benutzers zur Tabellenerstellung, deinstallieren Sie dann das Modul und installieren Sie es neu.

Häufig gestellte Fragen

Ist das Modul mit PrestaShop 9 kompatibel?

Ja, seit Version 2.0.0. Dieselbe ZIP-Datei lässt sich auf PrestaShop 8.0 wie auf PrestaShop 9.x installieren. Die API-Unterschiede fängt die interne Klasse DfOfferCompat ab, es muss beim Download also kein separater Zweig gewählt werden. Die 1.x-Versionen blieben auf PrestaShop 8.0 bis 8.99 beschränkt.

Welche Auswirkung hat es auf die Performance?

Die Engine führt eine SQL-Abfrage pro aktivem Angebot im Shop aus und bewertet die Bedingungen dann im Speicher. Bei einem Katalog mit etwa zehn aktiven Angeboten dauert die vollständige Bewertung im Durchschnitt weniger als fünfzig Millisekunden. Dieser Wert ist auf PrestaShop 8 und 9 identisch.

Kann ich das Modul mit einem Headless-Theme verwenden?

Die Auto-Add-Engine ist Theme-unabhängig und funktioniert für jedes Frontend, das über Cart::updateQty oder die PrestaShop REST API läuft. Das Banner auf der Produktseite und das Geschenk-Badge im Warenkorb sind native Smarty-Hooks, die ein klassisches Theme zur Anzeige benötigen. Für ein Headless-Frontend können Sie die Daten über eine benutzerdefinierte API offenlegen, die direkt ps_dfoffers_offer und ps_dfoffers_cart_auto abfragt.

Verwaltet das Modul mehrere Währungen?

Ja. Die für jedes Angebot generierte Warenkorbregel verwendet die Währung des aktuellen Warenkorbs. Wenn der Kunde die Währung wechselt, wird die Regel beim nächsten actionCartSave mit dem korrekten Wert neu generiert.

Was passiert, wenn ich in der Modulverwaltung auf Zurücksetzen klicke?

Das Modul wird in derselben Anfrage deinstalliert und neu installiert, wodurch die Tabellen gelöscht und neu erstellt werden: Alle Ihre Angebote gehen verloren. Seit 2.0.0 erstellt dieser Vorgang die Tabellen korrekt neu, während frühere Versionen den Shop ganz ohne Tabellen zurückließen. Sichern Sie in beiden Fällen vor dem Zurücksetzen.

War diese Seite hilfreich?

Immer noch nicht weiter? Support kontaktieren