PrestaShop
Ajouter un bouton de rétractation dans l’espace client PrestaShop
À partir du 19 juin 2026, un client qui a acheté en ligne doit pouvoir se rétracter par une fonction dédiée, visible pendant tout le délai de rétractation. Sur PrestaShop, l’endroit naturel est le détail de la commande dans l’espace client, qui dispose déjà du hook displayOrderDetail. Le bouton n’apparaît que si la commande est livrée et que le délai court encore.
public function hookDisplayOrderDetail(array $params)
{
/** @var Order $commande */
$commande = $params['order'];
$livraison = $this->dateLivraison($commande);
if (!$livraison) {
return '';
}
// Quatorze jours à compter de la livraison, jusqu'à la fin du dernier jour
$limite = (new DateTime($livraison))->modify('+14 days')->setTime(23, 59, 59);
if (new DateTime() > $limite) {
return '';
}
$this->context->smarty->assign([
'lien_retractation' => $this->context->link->getModuleLink(
$this->name, 'retractation', ['id_order' => (int) $commande->id]
),
'date_limite' => $limite->format('d/m/Y'),
]);
return $this->display(__FILE__, 'views/templates/hook/bouton.tpl');
}
private function dateLivraison(Order $commande)
{
// Premier passage de la commande à l'état « Livré »
return Db::getInstance()->getValue('
SELECT MIN(date_add) FROM `' . _DB_PREFIX_ . 'order_history`
WHERE id_order = ' . (int) $commande->id . '
AND id_order_state = ' . (int) Configuration::get('PS_OS_DELIVERED'));
}
Le contrôleur ajoute l’étape de confirmation exigée par le texte : le bouton de la commande mène à une page qui résume la demande et porte un second bouton explicite. Il vérifie surtout que la commande appartient bien au client connecté, sans quoi n’importe qui pourrait se rétracter à la place d’un autre en changeant un numéro dans l’adresse. La méthode enregistrerRetractation(), propre à chaque boutique, garde une trace horodatée et envoie l’accusé de réception avec Mail::Send(). Restent à traiter selon le catalogue : les produits exclus du droit de rétractation et les commandes livrées en plusieurs colis.
<?php
// controllers/front/retractation.php
class W4uRetractationRetractationModuleFrontController extends ModuleFrontController
{
public $auth = true; // client connecté obligatoire
public function postProcess()
{
$commande = new Order((int) Tools::getValue('id_order'));
// La commande doit exister et appartenir au client connecté
if (!Validate::isLoadedObject($commande)
|| (int) $commande->id_customer !== (int) $this->context->customer->id) {
Tools::redirect('index.php?controller=history');
}
if (Tools::isSubmit('confirmer_retractation') && Tools::getValue('token') === Tools::getToken(false)) {
// Trace horodatée, changement d'état, accusé de réception par e-mail
$this->module->enregistrerRetractation($commande);
$this->success[] = $this->module->l('Votre rétractation est enregistrée. Un accusé de réception vient de vous être envoyé.');
}
$this->context->smarty->assign('commande', $commande);
}
public function initContent()
{
parent::initContent();
$this->setTemplate('module:w4uretractation/views/templates/front/confirmation.tpl');
}
}
Sources
- Directive (UE) 2023/2673 du 22 novembre 2023 eur-lex.europa.eu
- Documentation développeur PrestaShop 8, contrôleurs front de module devdocs.prestashop-project.org