Installatie
Vereisten
Magento 2.4.x — getest op 2.4.9, compatibel met eerdere 2.4.*-versies. PHP 8.1–8.5. Compatibel met zowel het standaard Luma-thema als het Hyvä-thema. Vereist dat de native Magento_ReCaptcha*-modules aanwezig zijn voor de optionele reCAPTCHA-bescherming (al standaard opgenomen in de Magento-core).
Installatiestappen
- Voeg de inloggegevens die je per e-mail ontvangt toe aan
auth.jsonin de root van je Magento-project:{ "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- Plak je licentiesleutel in Admin → Stores → Configuration → Codingrow Extensions → Withdrawal Button → License → License Key, sla op en voer dan
bin/magento cache:flushuit. - Plaats de aanvraaglink ergens waar klanten hem vinden — zie De widget plaatsen hieronder.
Het volledige frontend-formulier, de e-mails en de admin-interface zijn beschikbaar in 7 talen, automatisch geselecteerd op basis van de winkel-/admintaal:
Admin-configuratie
De volledige configuratie staat in Stores → Configuration → Codingrow Extensions → Withdrawal Button: Licentie, Algemeen (inschakelen, notificatie-e-mail, toegestane orderstatussen, herroepingstermijn, knoptekst/-kleuren, aangepaste velden), E-mailsjablonen en het optionele retourlabel.
Deïnstallatie
composer remove codingrow/module-withdrawal-button daarna
bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush.
Aanvragen die al zijn geregistreerd in codingrow_withdrawalbutton_request
worden nooit automatisch verwijderd — exporteer eerst het overzicht als je een registratie wilt bewaren.
Gebruikershandleiding
De herroepingsaanvraagpagina
Eén pagina, twee stappen, precies zoals vereist door de onderliggende richtlijn: de klant vult eerst de vaste velden in (naam, e-mail, bestelnummer, ontvangstdatum) plus eventuele ingeschakelde aangepaste velden, ziet een alleen-lezen samenvatting van alles wat is ingevuld, en bevestigt pas daarna via een aparte, laatste knop. De verborgen velden die de gegevens tussen de twee stappen doorgeven, worden bij bevestiging server-side opnieuw gevalideerd — een klant kan de controles nooit omzeilen door de "bevestigde" stap direct te forceren.
Bestelverificatie
Voordat een aanvraag wordt geaccepteerd, controleert de module of het bestelnummer echt bestaat en of het e-mailadres overeenkomt met dat van die bestelling (niet hoofdlettergevoelig, werkt zowel voor gast- als geregistreerde-klantbestellingen). Als een van beide controles mislukt, wordt in beide gevallen hetzelfde algemene bericht "niet gevonden" getoond — dit is bewust: het tonen van "verkeerd e-mailadres" versus "bestelling bestaat niet" zou iemand in staat stellen geldige bestelnummers te achterhalen door te proberen.
Bestelstatus en herroepingstermijn
Twee instellingen in Stores → Configuration → Codingrow Extensions → Withdrawal Button → General bepalen welke aanvragen worden geaccepteerd, naast de verplichte bestel-/e-mailverificatie hierboven beschreven.
- Order statuses eligible for withdrawal — een native Magento-multiselect (Pending / Processing / Complete / Closed / Canceled / On Hold). Een aanvraag wordt alleen geaccepteerd als de huidige bestelstatus een van de geselecteerde is; bij installatie vooraf geselecteerd op Pending, Processing, Complete, Closed en On Hold. Een lege lijst blokkeert elke aanvraag ongeacht de bestelstatus — een bewuste keuze van de winkelier, geen bug.
- Withdrawal period (days) — hoeveel dagen zijn toegestaan tussen de opgegeven ontvangstdatum en het moment waarop de aanvraag wordt ingediend (standaard 14, het minimum volgens de EU-regelgeving voor herroeping). Na afloop van die termijn wordt de aanvraag geweigerd met een verklarend bericht dat de klant uitnodigt rechtstreeks contact op te nemen met de winkel; de kolom met verstreken dagen in het adminoverzicht markeert aanvragen die deze limiet overschrijden.
Preventie van dubbele aanvragen
Eén bestelling kan slechts één actieve herroepingsaanvraag hebben, ongeacht de status — zelfs een "Afgewezen" aanvraag. Een klant die het niet eens is met een afwijzing kan niet zomaar dezelfde aanvraag opnieuw indienen om dit te omzeilen; als een echte uitzondering nodig is, verwijdert de admin eerst de vorige aanvraag uit het overzicht.
Ontvangstdatum & verstreken dagen
De herroepingstermijn (instelbaar, standaard 14 dagen) begint vanaf het moment dat de goederen zijn ontvangen, niet vanaf de aankoop- of factuurdatum — informatie die Magento niet uit zichzelf kan weten, omdat dit afhangt van de vervoerder. Het formulier vraagt hierom via een native HTML5-datumkiezer (zonder jQuery UI-afhankelijkheid die met een thema in conflict zou kunnen komen), begrensd zodat er geen toekomstige datum kan worden ingevoerd. De besteldatum zelf wordt automatisch uitgelezen uit de gekoppelde bestelling — de klant hoeft deze nooit zelf in te typen. Beide data, plus de dagen verstreken sinds ontvangst, worden getoond in het adminoverzicht (gemarkeerd na afloop van die termijn) en zijn beschikbaar als e-mailvariabelen.
Bouwer voor aangepaste velden
Naast de vier wettelijk verplichte velden (naam, e-mail, bestelnummer, ontvangstdatum — altijd verplicht, nooit te verwijderen), kun je een onbeperkt aantal eigen velden toevoegen via Stores → Configuration → Codingrow Extensions → Withdrawal Button → Custom Fields: label, type, of het verplicht is, en of het momenteel op het formulier wordt getoond — de volgorde van de rijen in die lijst is de weergavevolgorde op het formulier.
| Type | Weergegeven als |
|---|---|
| Tekst | Invoerveld van één regel |
| Tekstvak | Meerregelig vak |
| Keuzelijst | Een <select> met de door jou ingevoerde opties, één per regel |
| Selectievakje | Eén selectievakje (bijv. "Ik heb de originele verpakking nog") |
Waarden die zijn ingevuld voor een veld dat later wordt uitgeschakeld, blijven bewaard in de geschiedenis van de aanvraag en worden nog steeds getoond waar ze zijn geregistreerd — alleen het label van het veld wordt opnieuw opgehaald op basis van het ID, dus het hernoemen van een veld werkt het label overal bij, ook bij eerdere antwoorden.
Knopkleuren & tekst
Twee hexadecimale kleurvelden (tekst en achtergrond) laten je de knop aan je merk aanpassen — alleen de kleuren veranderen; vorm, padding en lettertype blijven altijd die van je thema (Luma of Hyvä), zodat de knop nooit visueel kapot kan gaan. Een ongeldige hexwaarde wordt gewoon genegeerd, waarbij wordt teruggevallen op de standaardkleur van het thema. De tekst van de knop is ook configureerbaar, weergegeven precies zoals ingetypt (hoofdlettergebruik behouden, geen automatische hoofdletters) — laat leeg om het standaard vertaalde label te behouden.
reCAPTCHA-bescherming
Withdrawal Button registreert zichzelf als beschermbaar formulier in het native reCAPTCHA-systeem van Magento — Stores → Configuration → Customers → Google reCAPTCHA → Storefront → "Enable for Withdrawal Button". De versie die je al hebt geconfigureerd voor de rest van de winkel (v2 selectievakje, v2 onzichtbaar, of v3) wordt automatisch toegepast; er is geen aparte captchaconfiguratie om te onderhouden.
Adminoverzicht & bulkacties
Elke aanvraag komt terecht in Codingrow Extensions → Withdrawal Button, gepagineerd en filterbaar, met kolommen voor bestelnummer, klant, ontvangstdatum, verstreken dagen (gemarkeerd na 14), waarden van aangepaste velden en status. Met bulkacties kun je de status van meerdere geselecteerde aanvragen tegelijk bijwerken, of rijen verwijderen om testgegevens op te ruimen.
| Status | Betekenis |
|---|---|
| In behandeling | Net ingediend, nog niet beoordeeld. |
| Wordt verwerkt | Wordt afgehandeld door de winkel. |
| Voltooid | Retour/terugbetaling afgerond. |
| Afgewezen | De winkel heeft de aanvraag geweigerd. |
| Geannuleerd | De klant heeft zijn eigen aanvraag ingetrokken. |
E-mailsjablonen & variabelen
Twee native Magento-e-mailsjablonen — een klantbevestiging (de wettelijk verplichte
bevestiging op een duurzame gegevensdrager) en een interne adminmelding — automatisch
verzonden via TransportBuilder, precies zoals Magento's eigen bestel-e-mails.
Kloon een van beide vanuit Marketing → Email Templates, bewerk de tekst met
de native WYSIWYG-editor, en selecteer dan je kopie in Configuration → Email
Templates — geen aangepaste sjabloonlogica nodig.
| Variabele | Inhoud |
|---|---|
order_increment_id | Het bestelnummer |
order_date | De datum van de bestelling zelf, automatisch uitgelezen |
receipt_date | De datum waarop de klant aangaf de goederen te hebben ontvangen |
days_since_receipt | Dagen verstreken sinds die datum |
request_id | Intern referentienummer van deze aanvraag |
submitted_at | Exacte datum en tijd waarop de aanvraag werd bevestigd |
custom_fields_text | Alle ingevulde aangepaste velden, opgemaakt als "Label: waarde"-regels |
PDF-retouretiket
Een optionele eenvoudige bon (logo, naam afzender, retouradres, verpakkingsinstructies)
intern gegenereerd met Zend_Pdf — dezelfde PDF-bibliotheek die de Magento-core
zelf gebruikt voor facturen en verzendingen, geen extra afhankelijkheid van derden — en
automatisch toegevoegd aan de ontvangstbevestigings-e-mail van de klant zodra dit is
ingeschakeld in Configuration → Return Label. Upload een logo, vul het
retouradres en eventuele verpakkingsinstructies in, en elke toekomstige
bevestigingsmail van een aanvraag bevat een afdrukklaar etiket met het referentienummer,
bestelnummer, klantnaam en ontvangstdatum van die aanvraag, plus eventuele door de klant ingevulde aangepaste velden.
De widget plaatsen
De aanvraaglink is nooit hardgecodeerd in het thema — hij wordt uitsluitend geplaatst via het native Widget-systeem van Magento, zodat een verkoper volledige controle heeft of, en waar, hij verschijnt. Twee manieren om dit te doen, afhankelijk van hoe breed je hem wilt tonen:
| Methode | Het beste voor |
|---|---|
| Content → Elements → Widgets | De link tonen op veel/alle pagina's tegelijk, of op een vaste layoutpositie (footer, zijbalk) op de hele site. |
| Insert Widget in de inhoud van een CMS-pagina | Hem plaatsen op slechts één specifieke pagina — bijv. de homepage — precies waar je hem wilt in de inhoud van die pagina, zonder andere pagina's te beïnvloeden. |
Sitebreed, via Content → Elements → Widgets:
- Content → Elements → Widgets → Add Widget, kies de Withdrawal Button-linkwidget.
- Wijs hem toe aan "All Pages" of "Specified Page(s)" en stel de weergavecontainer in (bijv.
contentofsidebar.additional) — bij Hyvä-thema's is de container "Footer" mogelijk niet beschikbaar in de widgetkiezer; gebruik in dat geval in plaats daarvan het hoofdinhoudsgebied, vlak voor de footer. - Sla op en herlaad de doelpagina('s) — geen cache-flush nodig voor een net opgeslagen widget-instantie.
Op slechts één specifieke pagina, bijv. de homepage:
- Content → Pages, open de pagina (bijv. "Home page").
- Plaats in de WYSIWYG-editor van het tabblad Content de cursor waar je de knop wilt en klik op Insert Widget.
- Kies de Withdrawal Button-linkwidget, stel de labeltekst en CSS-klasse in, en klik dan op Insert — dit plaatst een directive
{{widget type="Codingrow\WithdrawalButton\Block\Widget\Link" ...}}direct in de inhoud van die pagina, zonder andere pagina's te beïnvloeden. - Sla de pagina op.
Licentie
Zonder geldige licentiesleutel blijft de herroepingspagina zichtbaar (een verkoper mag nooit zonder de wettelijk verplichte knop komen te zitten alleen omdat een licentie is verlopen), maar nieuwe indieningen worden geblokkeerd totdat een sleutel wordt ingevoerd in Configuration → License → License Key.