# dfsavecart — Sauvegarde de panier par lien magique

> Présentation dfsavecart ajoute une fonctionnalité « Garder pour plus tard » sur la page panier de votre boutique PrestaShop 8 ou 9. Le visiteur, connecté ou invité, saisit son adresse…

- Page: <https://www.datafirefly.com/documentation/dfsavecart/>
- Langue: fr
- Mis à jour le: 2026-07-01
- Autres langues: [en](https://www.datafirefly.com/en/documentation/dfsavecart/index.md), [es](https://www.datafirefly.com/es/documentation/dfsavecart/index.md), [de](https://www.datafirefly.com/de/documentation/dfsavecart/index.md), [it](https://www.datafirefly.com/it/documentation/dfsavecart/index.md), [pl](https://www.datafirefly.com/pl/documentation/dfsavecart/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfsavecart/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfsavecart/index.md)
- Index: <https://www.datafirefly.com/documentation/llms.txt>

## Présentation

dfsavecart ajoute une fonctionnalité « Garder pour plus tard » sur la page panier de votre boutique PrestaShop 8 ou 9. Le visiteur, connecté ou invité, saisit son adresse email et reçoit un lien sécurisé (« lien magique ») qui restaure son panier exact — mêmes produits, mêmes quantités — sur n'importe quel appareil, à tout moment pendant la durée de validité configurée.

Le module est non intrusif : il n'affecte ni le tunnel de commande, ni le checkout, ni les autres modules. Il fonctionne avec le système d'email natif de PrestaShop (et donc avec votre SMTP existant).

## Prérequis

- PrestaShop 8.0.x à 9.x
- PHP 8.1 ou supérieur
- MySQL 5.7+ ou MariaDB 10.3+
- Un envoi d'email fonctionnel (Paramètres avancés > E-mail — testez l'envoi avant d'installer le module)

## Installation

1. Téléchargez le fichier `dfsavecart.zip` depuis votre compte DataFirefly.
2. Dans le back office PrestaShop, allez dans **Modules > Gestionnaire de modules**.
3. Cliquez sur **Téléverser un module** et sélectionnez le ZIP.
4. PrestaShop installe le module automatiquement : la table `ps_df_savecart` est créée et les hooks sont enregistrés.
5. Cliquez sur **Configurer** pour accéder aux réglages.

Aucun override de classe ni de contrôleur n'est installé : la désinstallation est propre et sans résidu (la table et les configurations sont supprimées).

## Configuration

Tous les réglages se trouvent sur une seule page : **Modules > Gestionnaire de modules > dfsavecart > Configurer**.

### Réglages principaux

- **Activer le module** — interrupteur général. Désactivé, le bloc disparaît du front sans désinstaller.
- **Position du bouton** — _Pied du panier_ (recommandé, hook `displayShoppingCartFooter`), _Dans le panier_ (hook `displayShoppingCart`) ou _Les deux_. Le choix dépend de votre thème : testez le rendu sur la page panier après modification.
- **Durée de validité du lien** — de 1 à 365 jours, 30 par défaut. Au-delà, le lien expire et l'entrée est purgée.

### Sécurité et anti-spam

- **Limite par email / jour** — nombre maximal d'envois pour une même adresse sur 24 h glissantes (10 par défaut). Mettre 0 pour désactiver. Le compteur repose sur un hash salé de l'email : l'adresse n'est pas stockée en clair pour cette fonction.
- **Lien à usage unique** — si activé, le lien devient invalide après la première restauration. Utile pour des paniers à caractère confidentiel (B2B, devis).

### Comportement de restauration

- **Vider le panier actuel avant restauration** — activé par défaut. Si désactivé, les produits du lien s'ajoutent au panier en cours (cumul).

### RGPD et email

- **Demander un consentement RGPD** — affiche une case à cocher obligatoire avant l'envoi (activé par défaut, recommandé).
- **Envoyer en copie cachée au marchand** — ajoute l'email de contact de la boutique en BCC sur chaque envoi, pour suivi interne.
- **Sujet email (par langue)** — personnalisable pour chaque langue active de la boutique. Variables disponibles : `{shop_name}` et `{firstname}`.

## Fonctionnement côté client

1. Le client ajoute des produits à son panier et ouvre la page panier.
2. Il voit le bloc « Garder ce panier pour plus tard » avec un champ email (pré-rempli s'il est connecté).
3. Il saisit son email, coche le consentement si demandé, et clique sur **Envoyer le lien**.
4. Il reçoit un email contenant un résumé du panier (produits, quantités, total estimé), la date d'expiration et un bouton **Restaurer mon panier**.
5. Un clic sur le bouton restaure le panier exact et redirige vers la page panier, avec un message de confirmation.

### Cas particuliers à la restauration

- **Produit désactivé ou supprimé** — la ligne est ignorée et le client est informé par un message listant les produits indisponibles.
- **Stock insuffisant** — la quantité est ajustée au maximum disponible, avec un message signalant l'ajustement.
- **Lien expiré ou déjà utilisé** (mode usage unique) — une page d'erreur sobre s'affiche, avec des liens vers le panier actuel et l'accueil.
- **Langue et devise** — celles du panier d'origine sont restaurées.

## Emails

Les templates HTML et texte sont fournis en **français, anglais, espagnol et allemand** dans `modules/dfsavecart/mails/{iso}/savecart.html` et `savecart.txt`. La langue utilisée est celle du panier au moment de la sauvegarde.

Variables disponibles dans les templates : `{firstname}`, `{shop_name}`, `{restore_link}`, `{cart_items_html}`, `{cart_items_txt}`, `{cart_total}`, `{expiry_date}`.

Pour personnaliser durablement les templates, dupliquez-les dans le dossier mails de votre thème plutôt que de modifier ceux du module : ils seraient écrasés à la mise à jour.

## Sécurité

- **Token 256 bits** — généré par `random_bytes(32)`, le générateur cryptographiquement sûr de PHP. 64 caractères hexadécimaux dans l'URL.
- **Stockage en hash** — seule l'empreinte SHA-256 du token est stockée en base. En cas de compromission de la base de données, aucun lien ne peut être reconstruit.
- **CSRF** — l'endpoint AJAX de sauvegarde vérifie le jeton de session PrestaShop.
- **Validation stricte** — le format du token est vérifié côté serveur (`[a-f0-9]{64}`) avant toute requête en base.

## RGPD

- Consentement explicite configurable avant l'envoi de l'email.
- Pour la limitation anti-spam, l'email n'est pas conservé en clair : seul un hash salé (avec la clé secrète de la boutique) est utilisé.
- Les enregistrements expirés sont supprimés automatiquement (purge) — voir section suivante.
- Aucune donnée n'est transmise à un service tiers : tout reste dans votre base PrestaShop.
- En cas de demande d'effacement d'un client, supprimez ses lignes dans la table `ps_df_savecart` (colonne `email`).

## Purge des liens expirés

Trois options, de la plus simple à la plus automatisée :

1. **Bouton manuel** — sur la page de configuration du module, « Purger les entrées expirées ».
2. **Module CronJobs** — installez le module gratuit CronJobs de PrestaShop : le hook `actionCronJob` du module est appelé automatiquement et déclenche la purge.
3. **Crontab système** — planifiez un appel régulier au cron de votre boutique selon votre configuration serveur.

## Statistiques

La page de configuration affiche quatre compteurs en temps réel : **total enregistrés**, **actifs** (non expirés), **expirés** (en attente de purge) et **restaurés** (liens utilisés au moins une fois). Le ratio restaurés / total vous donne le taux de conversion de la fonctionnalité.

## Multiboutique

Le module est compatible multiboutique : chaque sauvegarde mémorise l'identifiant de la boutique d'origine, utilisé lors de la restauration. La configuration se fait par contexte de boutique standard PrestaShop.

## Dépannage

### L'email n'arrive pas

- Vérifiez l'envoi d'email global de la boutique : **Paramètres avancés > E-mail > Tester l'envoi**.
- Vérifiez le dossier spam du destinataire.
- Consultez les logs : **Paramètres avancés > Logs** (les erreurs du module sont préfixées `[dfsavecart]`).

### Le bloc n'apparaît pas sur la page panier

- Vérifiez que le module est activé dans sa configuration.
- Vérifiez que le panier contient au moins un produit (le bloc est masqué sur panier vide).
- Vérifiez la position choisie : certains thèmes n'implémentent pas le hook `displayShoppingCartFooter` — passez alors sur « Dans le panier » ou « Les deux ».
- Videz le cache : **Paramètres avancés > Performances > Vider le cache**.

### Message « Jeton de sécurité invalide »

- La page panier est restée ouverte trop longtemps et la session a expiré : rafraîchissez la page et réessayez.

### Message « Trop de demandes pour cette adresse »

- La limite anti-spam quotidienne est atteinte pour cet email. Augmentez la limite dans la configuration ou attendez 24 h.

## Désinstallation

La désinstallation supprime la table `ps_df_savecart` (tous les paniers sauvegardés sont perdus) et l'ensemble des clés de configuration. Aucun résidu n'est laissé en base ni dans les fichiers.
