Installation
Voraussetzungen
Magento 2.4.x — getestet mit 2.4.9, kompatibel mit vorherigen 2.4.*-Versionen. PHP 8.1–8.5. Kompatibel sowohl mit dem Standard-Luma-Theme als auch mit dem Hyvä-Theme. Für den optionalen reCAPTCHA-Schutz müssen die nativen Magento_ReCaptcha*-Module vorhanden sein (bereits im Magento-Core enthalten).
Einrichtungsschritte
- Fügen Sie die per E-Mail erhaltenen Zugangsdaten zu
auth.jsonim Stammverzeichnis Ihres Magento-Projekts hinzu:{ "http-basic": { "repo.codingrow.com": { "username": "...", "password": "..." } } } composer config repositories.codingrow composer https://repo.codingrow.comcomposer require codingrow/module-withdrawal-buttonbin/magento module:enable Codingrow_WithdrawalButtonbin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush- Fügen Sie Ihren Lizenzschlüssel in Admin → Stores → Configuration → Codingrow Extensions → Withdrawal Button → License → License Key ein, speichern Sie, dann
bin/magento cache:flush. - Platzieren Sie den Anfragelink dort, wo Kunden ihn finden — siehe Widget platzieren weiter unten.
Das gesamte Frontend-Formular, die E-Mails und die Admin-Oberfläche sind in 7 Sprachen verfügbar, automatisch ausgewählt je nach Store-/Admin-Gebietsschema:
Admin-Konfiguration
Die vollständige Konfiguration liegt unter Stores → Configuration → Codingrow Extensions → Withdrawal Button: Lizenz, Allgemein (Aktivierung, Benachrichtigungs-E-Mail, zulässige Bestellstatus, Widerrufsfrist, Button-Text/-Farben, benutzerdefinierte Felder), E-Mail-Vorlagen und das optionale Rücksendeetikett.
Deinstallation
composer remove codingrow/module-withdrawal-button dann
bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush.
Bereits in codingrow_withdrawalbutton_request erfasste Anfragen werden nie
automatisch gelöscht — exportieren Sie zuerst die Übersicht, wenn Sie einen Nachweis behalten möchten.
Benutzerhandbuch
Die Widerrufsseite
Eine Seite, zwei Schritte, genau wie von der zugrundeliegenden Richtlinie gefordert: Der Kunde füllt zunächst die festen Felder aus (Name, E-Mail, Bestellnummer, Empfangsdatum) sowie alle aktivierten benutzerdefinierten Felder, sieht eine schreibgeschützte Zusammenfassung aller Eingaben und bestätigt erst dann über einen separaten, abschließenden Button. Die versteckten Felder, die die Daten zwischen den beiden Schritten weitergeben, werden bei der Bestätigung serverseitig erneut validiert — ein Kunde kann die Prüfungen niemals umgehen, indem er den "bestätigten" Schritt direkt erzwingt.
Bestellprüfung
Bevor eine Anfrage angenommen wird, prüft das Modul, ob die Bestellnummer tatsächlich existiert und ob die E-Mail-Adresse mit der auf dieser Bestellung übereinstimmt (ohne Berücksichtigung von Groß-/Kleinschreibung, funktioniert sowohl für Gast- als auch für registrierte Kundenbestellungen). Schlägt eine der beiden Prüfungen fehl, wird in beiden Fällen dieselbe allgemeine "nicht gefunden"-Meldung angezeigt — das ist beabsichtigt: Würde "falsche E-Mail" statt "Bestellung existiert nicht" angezeigt, könnte jemand durch Ausprobieren gültige Bestellnummern ermitteln.
Bestellstatus und Widerrufsfrist
Zwei Einstellungen unter Stores → Configuration → Codingrow Extensions → Withdrawal Button → General steuern, welche Anfragen akzeptiert werden, zusätzlich zur oben beschriebenen verpflichtenden Bestell-/E-Mail-Prüfung.
- Order statuses eligible for withdrawal — ein natives Magento-Mehrfachauswahlfeld (Pending / Processing / Complete / Closed / Canceled / On Hold). Eine Anfrage wird nur akzeptiert, wenn der aktuelle Bestellstatus einer der ausgewählten ist; bei der Installation vorausgewählt auf Pending, Processing, Complete, Closed und On Hold. Eine leere Liste blockiert jede Anfrage unabhängig vom Bestellstatus — eine bewusste Entscheidung des Händlers, kein Fehler.
- Withdrawal period (days) — wie viele Tage zwischen dem angegebenen Empfangsdatum und dem Zeitpunkt der Antragstellung erlaubt sind (standardmäßig 14, das nach EU-Verbraucherrecht vorgeschriebene Minimum). Nach Ablauf dieser Frist wird die Anfrage mit einer erklärenden Nachricht abgelehnt, die den Kunden bittet, sich direkt an den Shop zu wenden; die Spalte der verstrichenen Tage im Admin-Raster markiert Anfragen, die dieses Limit überschreiten.
Vermeidung doppelter Anfragen
Eine Bestellung kann nur eine aktive Widerrufsanfrage haben, unabhängig von deren Status — selbst eine "Abgelehnte". Ein Kunde, der mit einer Ablehnung nicht einverstanden ist, kann nicht einfach dieselbe Anfrage erneut einreichen, um sie zu umgehen; falls tatsächlich eine Ausnahme nötig ist, löscht der Admin zunächst die vorherige Anfrage aus der Übersicht.
Empfangsdatum & verstrichene Tage
Die Widerrufsfrist (konfigurierbar, standardmäßig 14 Tage) beginnt ab dem Zeitpunkt, zu dem die Ware empfangen wurde, nicht ab dem Kauf- oder Rechnungsdatum — eine Information, die Magento von sich aus nicht kennen kann, da sie vom Transportunternehmen abhängt. Das Formular fragt danach über einen nativen HTML5-Datumswähler (ohne jQuery-UI-Abhängigkeit, die mit einem Theme in Konflikt geraten könnte), begrenzt, sodass kein zukünftiges Datum eingegeben werden kann. Das Bestelldatum selbst wird automatisch aus der verknüpften Bestellung gelesen — der Kunde muss es nie eingeben. Beide Daten sowie die seit dem Empfang verstrichenen Tage werden in der Admin-Übersicht angezeigt (markiert nach Ablauf dieser Frist) und stehen als E-Mail-Variablen zur Verfügung.
Konfigurator für benutzerdefinierte Felder
Über die vier gesetzlich vorgeschriebenen Felder hinaus (Name, E-Mail, Bestellnummer, Empfangsdatum — immer verpflichtend, nie entfernbar) können Sie eine unbegrenzte Anzahl eigener Felder hinzufügen unter Stores → Configuration → Codingrow Extensions → Withdrawal Button → Custom Fields: Beschriftung, Typ, ob es verpflichtend ist, und ob es aktuell im Formular angezeigt wird — die Reihenfolge der Zeilen in dieser Liste ist die Anzeigereihenfolge im Formular.
| Typ | Dargestellt als |
|---|---|
| Text | Einzeiliges Eingabefeld |
| Textbereich | Mehrzeiliges Feld |
| Dropdown | Ein <select> mit den eingegebenen Optionen, eine pro Zeile |
| Checkbox | Eine einzelne Checkbox (z. B. "Ich habe die Originalverpackung noch") |
Werte, die für ein später deaktiviertes Feld übermittelt wurden, bleiben im Verlauf der Anfrage erhalten und werden weiterhin dort angezeigt, wo sie erfasst wurden — nur die Beschriftung des Feldes wird anhand der ID neu aufgelöst, sodass eine spätere Umbenennung des Feldes die Beschriftung überall aktualisiert, auch bei dessen alten Antworten.
Button-Farben & Text
Zwei Hex-Farbfelder (Text und Hintergrund) lassen Sie den Button an Ihre Marke anpassen — nur die Farben ändern sich; Form, Padding und Schriftart bleiben immer die Ihres Themes (Luma oder Hyvä), sodass der Button niemals optisch beschädigt aussehen kann. Ein ungültiger Hex-Wert wird einfach ignoriert und auf die Theme-Standardfarbe zurückgesetzt. Der Button-Text ist ebenfalls konfigurierbar und wird genau wie eingegeben angezeigt (Groß-/Kleinschreibung beibehalten, keine automatische Großschreibung) — lassen Sie ihn leer, um die standardmäßig übersetzte Beschriftung beizubehalten.
reCAPTCHA-Schutz
Withdrawal Button registriert sich selbst als schützbares Formular im nativen reCAPTCHA-System von Magento — Stores → Configuration → Customers → Google reCAPTCHA → Storefront → "Enable for Withdrawal Button". Die für den Rest des Stores bereits konfigurierte Version (v2-Checkbox, v2 unsichtbar oder v3) wird automatisch übernommen; es gibt keine separate Captcha-Konfiguration zu pflegen.
Admin-Übersicht & Massenaktionen
Jede Anfrage landet unter Codingrow Extensions → Withdrawal Button, paginiert und filterbar, mit Spalten für Bestellnummer, Kunde, Empfangsdatum, verstrichene Tage (markiert nach 14), Werte der benutzerdefinierten Felder und Status. Massenaktionen ermöglichen es, den Status mehrerer ausgewählter Anfragen gleichzeitig zu aktualisieren oder Zeilen zu löschen, um Testdaten zu bereinigen.
| Status | Bedeutung |
|---|---|
| Ausstehend | Gerade übermittelt, noch nicht geprüft. |
| In Bearbeitung | Wird vom Store bearbeitet. |
| Abgeschlossen | Rückgabe/Rückerstattung abgeschlossen. |
| Abgelehnt | Der Store hat die Anfrage abgelehnt. |
| Storniert | Der Kunde hat seine eigene Anfrage zurückgezogen. |
E-Mail-Vorlagen & Variablen
Zwei native Magento-E-Mail-Vorlagen — eine Kundenbestätigung (die gesetzlich vorgeschriebene
Bestätigung auf einem dauerhaften Datenträger) und eine interne Admin-Benachrichtigung —
automatisch versendet über TransportBuilder, genau wie Magentos eigene
Bestell-E-Mails. Klonen Sie eine der beiden aus Marketing → Email Templates,
bearbeiten Sie den Text mit dem nativen WYSIWYG-Editor und wählen Sie dann Ihre Kopie unter
Configuration → Email Templates aus — kein benutzerdefinierter
Templating-Code erforderlich.
| Variable | Inhalt |
|---|---|
order_increment_id | Die Bestellnummer |
order_date | Das Bestelldatum selbst, automatisch gelesen |
receipt_date | Das vom Kunden angegebene Empfangsdatum der Ware |
days_since_receipt | Seit diesem Datum verstrichene Tage |
request_id | Interne Referenznummer dieser Anfrage |
submitted_at | Genaues Datum und Uhrzeit der Bestätigung der Anfrage |
custom_fields_text | Alle ausgefüllten benutzerdefinierten Felder, formatiert als "Beschriftung: Wert"-Zeilen |
PDF-Retourenetikett
Ein optionaler einfacher Beleg (Logo, Absendername, Rücksendeadresse, Verpackungshinweise),
intern mit Zend_Pdf erstellt — dieselbe PDF-Bibliothek, die der Magento-Core selbst
für Rechnungen und Lieferungen verwendet, keine zusätzliche Drittanbieter-Abhängigkeit — und
automatisch der Bestätigungs-E-Mail des Kunden beigefügt, sobald es unter
Configuration → Return Label aktiviert ist. Laden Sie ein Logo hoch, geben Sie
die Rücksendeadresse und etwaige Verpackungshinweise ein, und jede zukünftige
Bestätigungs-E-Mail einer Anfrage enthält ein druckfertiges Etikett mit der Referenznummer,
Bestellnummer, dem Kundennamen und dem Empfangsdatum dieser Anfrage, sowie etwaigen vom Kunden ausgefüllten benutzerdefinierten Feldern.
Widget platzieren
Der Anfragelink ist niemals fest im Theme codiert — er wird ausschließlich über das native Widget-System von Magento platziert, sodass ein Händler vollständig steuert, ob und wo er erscheint. Zwei Möglichkeiten, abhängig davon, wie umfassend Sie ihn anzeigen möchten:
| Methode | Am besten geeignet für |
|---|---|
| Content → Elements → Widgets | Anzeige des Links auf vielen/allen Seiten gleichzeitig oder an einer festen Layout-Position (Footer, Sidebar) auf der gesamten Website. |
| Insert Widget im Inhalt einer CMS-Seite | Platzierung auf nur einer bestimmten Seite — z. B. der Startseite — genau dort, wo Sie ihn im Inhalt dieser Seite möchten, ohne andere Seiten zu beeinflussen. |
Website-weit, über Content → Elements → Widgets:
- Content → Elements → Widgets → Add Widget, wählen Sie das Withdrawal-Button-Link-Widget.
- Weisen Sie es "All Pages" oder "Specified Page(s)" zu und legen Sie den Anzeigecontainer fest (z. B.
contentodersidebar.additional) — bei Hyvä-Themes ist der Container "Footer" möglicherweise nicht in der Widget-Auswahl verfügbar; verwenden Sie in diesem Fall stattdessen den Hauptinhaltsbereich, direkt vor dem Footer. - Speichern und die Zielseite(n) neu laden — für eine neu gespeicherte Widget-Instanz ist kein Cache-Leeren erforderlich.
Nur auf einer bestimmten Seite, z. B. der Startseite:
- Content → Pages, öffnen Sie die Seite (z. B. "Home page").
- Platzieren Sie im WYSIWYG-Editor des Content-Tabs den Cursor dort, wo der Button erscheinen soll, und klicken Sie auf Insert Widget.
- Wählen Sie das Withdrawal-Button-Link-Widget, legen Sie Beschriftungstext und CSS-Klasse fest und klicken Sie dann auf Insert — dadurch wird eine Direktive
{{widget type="Codingrow\WithdrawalButton\Block\Widget\Link" ...}}direkt in den Inhalt dieser Seite eingefügt, ohne andere Seiten zu beeinflussen. - Speichern Sie die Seite.
Lizenz
Ohne gültigen Lizenzschlüssel bleibt die Widerrufsseite sichtbar (ein Händler sollte niemals ohne den gesetzlich vorgeschriebenen Button dastehen, nur weil eine Lizenz abgelaufen ist), aber neue Übermittlungen werden blockiert, bis ein Schlüssel unter Configuration → License → License Key eingegeben wird.