Une boîte à outils complète de conformité RGPD pour votre site LaraClassifier / JobClass. Affichez une bannière de consentement aux cookies personnalisable, enregistrez les décisions de consentement des visiteurs pour les audits de conformité, et gérez les catégories de cookies depuis le panneau d'administration.

Bannière de consentement aux cookies

Une bannière soignée et responsive avec les options Tout accepter, Tout refuser et Personnaliser. Sept variantes de position, dont un mode modal.

Catégories granulaires

Quatre catégories de cookies (Essentiels, Analytique, Marketing, Préférences) avec des interrupteurs par catégorie pour les visiteurs.

Journalisation des consentements

Piste d'audit complète de chaque décision de consentement : adresse IP, user agent, action effectuée et catégories sélectionnées. Conforme à l'article 7 du RGPD.

Injection automatique

La bannière est injectée automatiquement dans toutes les pages front-end via un middleware. Aucune modification de template n'est nécessaire. Le panneau d'administration et les requêtes AJAX sont ignorés.

Cas d'usage

Conformité d'un site web UE/EEE

Votre site s'adresse à des visiteurs de l'Union européenne et doit se conformer au RGPD et à la directive ePrivacy.

  • Activez la bannière de consentement aux cookies pour informer les visiteurs de l'utilisation des cookies.
  • Activez la journalisation des consentements pour conserver un registre auditable de toutes les décisions de consentement.
  • Liez votre page de politique de confidentialité afin que les visiteurs puissent consulter vos pratiques en matière de données.
  • Configurez les interrupteurs de catégories afin que les visiteurs puissent accepter ou refuser les cookies analytiques et marketing.

Site à forte composante analytique

Vous utilisez Google Analytics, Hotjar ou des outils similaires et avez besoin du consentement de l'utilisateur avant de charger les scripts de suivi.

  • Activez l'interrupteur de la catégorie Analytique.
  • Lisez le cookie de consentement (gdpr_consent, un objet JSON encodé pour l'URL, par exemple {"necessary":true,"analytics":true,...}) dans votre JavaScript avant de charger les scripts analytiques, ou écoutez l'événement navigateur gdpr:consent déclenché sur window lorsque le visiteur fait son choix.
  • Ne chargez l'analytique que lorsque analytics vaut true.

Marketing & reciblage publicitaire

Vous utilisez Facebook Pixel, Google Ads ou des outils d'e-mail marketing qui déposent des cookies.

  • Activez l'interrupteur de la catégorie Marketing.
  • Conditionnez tous les scripts marketing/publicitaires au drapeau de consentement marketing.
  • Les visiteurs peuvent retirer leur consentement à tout moment via le point de terminaison de retrait.

Prérequis

  • LaraClassifier / JobClass v19.0.0 ou ultérieur
  • PHP 8.3+
  • MySQL 8.0+
Remarque : cet add-on est entièrement autonome : il ne dépend d'aucun autre add-on. Il fonctionne immédiatement une fois activé.

Installation

Étape 1 : Téléverser l'add-on

Allez dans Panneau d'administration → Extensions → Add-ons, cliquez sur Téléverser un add-on et déposez le fichier .zip de l'add-on dans la zone de téléversement (50 Mo maximum). L'archive est extraite dans extensions/addons/gdpr/ et GDPR & Cookie Consent apparaît dans la liste, désactivé.

Impossible de téléverser depuis le navigateur ? Décompressez l'archive sur votre ordinateur et copiez le dossier de l'add-on dans extensions/addons/gdpr/ par FTP ou SSH : son fichier addon.json doit se trouver directement dans ce dossier. Ouvrez ensuite Panneau d'administration → Extensions → Add-ons. La page analyse extensions/addons/ à chaque chargement : l'add-on est donc listé immédiatement (le bouton Synchroniser lance la même analyse à la demande).

Étape 2 : Activer l'add-on

Cliquez sur Activer sur la carte GDPR & Cookie Consent. C'est un add-on payant : une fenêtre demande son code d'achat, qui est vérifié avant toute autre opération. Un code invalide est refusé dans la fenêtre et rien n'est modifié.

Une fois le code accepté, l'activation se fait en une seule passe : elle crée les tables de base de données de l'add-on (ses migrations), enregistre ses permissions, exécute ses seeders et publie ses assets publics. Rechargez la page pour voir sa nouvelle entrée dans la section Add-ons de la barre latérale d'administration.

Étape 3 : Configurer

Ouvrez Panneau d'administration → RGPD depuis la section Add-ons de la barre latérale et configurez l'add-on : voir Configuration.

Code d'achat (clé de licence)

GDPR & Cookie Consent est vendu comme un produit séparé ; il possède donc son propre code d'achat (clé de licence), distinct du code d'achat de l'application principale et de celui de tout autre add-on. Il vous est demandé lorsque vous activez GDPR & Cookie Consent dans Panneau d'administration → Extensions → Add-ons.

Nos produits sont vendus sur trois plateformes. La façon dont vous recevez un code d'achat dépend de l'endroit où vous avez acheté le produit.

Plateforme / Marketplace Comment vous obtenez le code d'achat Où le retrouver
Boutique bedigit.com
Achat sur le site (Boutique)
Généré automatiquement lorsque la commande est payée, puis envoyé par e-mail, soit dans un e-mail de licence dédié, soit dans l'e-mail de confirmation de commande. Mon compte → Mes licences sur bedigit.com
Gumroad Créé dès que Gumroad nous notifie la vente, puis envoyé dans un e-mail séparé, en plus du reçu Gumroad. L'e-mail de licence, votre Bibliothèque Gumroad, et Mon compte → Mes licences sur bedigit.com
Envato Market
CodeCanyon
Délivré par Envato, pas par nous, et jamais envoyé par e-mail : vous le téléchargez vous-même depuis votre compte Envato. Compte Envato → Downloads → License certificate & purchase code
Vérifiez votre dossier spam. Pour les achats sur la Boutique bedigit.com comme sur Gumroad, le code d'achat est livré par e-mail. Les e-mails de licence automatiques sont très souvent filtrés : si le message n'est pas dans votre boîte de réception, regardez dans votre dossier spam / courrier indésirable avant de contacter le support, et ajoutez notre adresse d'expédition à vos contacts ou à votre liste d'autorisation.

1. Boutique bedigit.com (achat sur le site)

  • Dès que le statut de paiement de la commande passe à Payée, une clé de licence est générée automatiquement pour chaque article sous licence de la commande (une clé par unité achetée : acheter 3 unités donne 3 clés distinctes).
  • Elle est envoyée par e-mail à l'adresse utilisée pour la commande, soit dans un e-mail de licence dédié, soit dans l'e-mail de confirmation de commande. Vérifiez votre boîte de réception et votre dossier spam / courrier indésirable.
  • La clé reste disponible dans votre compte sous Mon compte → Mes licences. Les clés sont masquées dans la liste ; ouvrez la page de détail de la licence pour afficher et copier la clé complète, voir les domaines sur lesquels elle est activée, et désactiver un domaine pour libérer un emplacement d'activation.
  • La facture correspondante se trouve sous Mon compte → Mes commandes.

2. Gumroad

  • Un achat sur Gumroad génère deux e-mails distincts : le reçu Gumroad (envoyé par Gumroad, donnant accès aux fichiers) et un e-mail de clé de licence (envoyé par bedigit.com) qui contient votre code d'achat.
  • L'e-mail de clé de licence est généré dès que Gumroad nous notifie la vente ; il arrive donc normalement quelques secondes après le paiement. Ici aussi, vérifiez votre boîte de réception et votre dossier spam / courrier indésirable.
  • Lorsque le produit Gumroad utilise la fonctionnalité de clé de licence propre à Gumroad, la même clé apparaît également dans votre reçu Gumroad et sous Bibliothèque → votre achat sur gumroad.com.
  • Utilisez la même adresse e-mail sur bedigit.com que sur Gumroad : vos clés sont alors liées automatiquement à votre compte et listées sous Mon compte → Mes licences, même si vous vous inscrivez après l'achat. Vous pouvez aussi ajouter une clé Gumroad manuellement depuis Mon compte → Mes licences Gumroad.

3. Envato Market (CodeCanyon)

  • Les codes d'achat Envato sont délivrés et fournis par Envato Market, jamais envoyés par e-mail par nos soins, il n'y a donc rien à chercher dans votre dossier spam : vous récupérez le code depuis votre compte Envato.
  • Connectez-vous à votre compte Envato / CodeCanyon, ouvrez la page Downloads, trouvez l'article, et choisissez License certificate & purchase code dans le menu déroulant Download. Le code est inscrit dans ce certificat.
  • Un code d'achat Envato ressemble à 12345678-90ab-cdef-1234-567890abcdef (8-4-4-4-12 caractères). Il ne change jamais, et le renouvellement du support de l'article n'en délivre pas de nouveau.
  • Article officiel Envato : Where Is My Purchase Code?
Vous avez perdu votre code d'achat ? Recherchez dans votre boîte mail (dossier spam inclus) “licence” ou “code d'achat”, puis vérifiez Mon compte → Mes licences sur bedigit.com pour les achats Boutique et Gumroad, ou Downloads → License certificate sur Envato. S'il est toujours introuvable, ouvrez un ticket sur notre Centre d'aide avec votre numéro de commande (Boutique), l'ID de vente Gumroad ou l'e-mail de l'acheteur (Gumroad), ou votre nom d'utilisateur Envato et le nom de l'article (Envato).

Configuration

Tous les paramètres sont gérés dans Panneau d'administration → Add-ons → RGPD → Paramètres (stockés dans la table settings du cœur de l'application, groupe gdpr). Les valeurs par défaut proviennent du fichier config/gdpr.php de l'add-on.

Paramètre Description Par défaut
gdpr_enabled Activer ou désactiver globalement la bannière de consentement aux cookies. true
gdpr_cookie_lifetime Nombre de jours pendant lesquels le cookie de préférence de consentement est mémorisé (1–3650). 365
gdpr_log_consents Enregistrer la décision de consentement de chaque visiteur dans la base de données à des fins d'audit de conformité. true
gdpr_capture_country Déterminer le code pays du visiteur à partir de son adresse IP (via le pilote GeoIP configuré dans LaraClassifier / JobClass) lors de la journalisation d'un consentement. La recherche s'exécute dans un job en file d'attente, et une colonne Pays est ajoutée au tableau des journaux de consentement. false
gdpr_banner_position Emplacement de la bannière sur la page (7 positions disponibles). bottom-center
gdpr_privacy_policy_url URL de votre page de politique de confidentialité, affichée sous forme de lien dans la bannière. Laissée vide, la bannière pointe vers la page active de type Politique de confidentialité de votre site (Panneau d'administration → Pages) ; aucun lien n'est affiché s'il n'y en a pas. (vide)
gdpr_category_analytics Afficher l'interrupteur de la catégorie de cookies Analytique dans le panneau des préférences. true
gdpr_category_marketing Afficher l'interrupteur de la catégorie de cookies Marketing dans le panneau des préférences. true
gdpr_category_preferences Afficher l'interrupteur de la catégorie de cookies Préférences dans le panneau des préférences. true
gdpr_log_retention_days Nombre de jours avant que les journaux de consentement et les fichiers d'archive soient définitivement supprimés (1–7300). 730 (2 ans)
gdpr_archive_enabled Lorsque cette option est activée, les journaux des mois précédents sont compressés en gzip et déplacés vers le stockage privé ; seul le mois en cours reste dans la base de données. false
gdpr_dedup_window_minutes Ne pas écrire de nouveau journal de consentement si un journal identique (même utilisateur/IP, action, catégories) a été enregistré dans cette fenêtre. Mettez 0 pour désactiver. 5
gdpr_stats_cache_ttl Durée (en secondes) pendant laquelle les statistiques du tableau de bord mises en cache restent valides. Mettez 0 pour désactiver complètement le cache. 900 (15 minutes)

Valeurs par défaut du fichier de configuration

Le fichier config/gdpr.php de l'add-on (dans extensions/addons/gdpr/config/) fournit les valeurs par défaut utilisées jusqu'au premier enregistrement de la page des paramètres. Il contient aussi quelques options sans champ dans la page des paramètres :

  • cookie_name (par défaut gdpr_consent) : nom du cookie de consentement.
  • archive_disk (par défaut local) et archive_path (par défaut gdpr) : emplacement de stockage des fichiers d'archive mensuels.
  • admin_per_page (par défaut 25) : nombre de lignes par page dans la page des journaux de consentement.

Admin : Paramètres

La page des paramètres (Panneau d'administration → Add-ons → RGPD → Paramètres) requiert la permission admin.setting.view pour s'ouvrir et admin.setting.edit pour enregistrer. Elle est organisée en quatre zones principales :

Paramètres généraux

La colonne de gauche (largeur 7/12) contient les options de configuration principales :

  • Activer la bannière de cookies : interrupteur pour activer/désactiver la bannière globalement. Lorsqu'elle est désactivée, aucune bannière n'est affichée et aucune injection par le middleware n'a lieu.
  • Durée de vie du cookie (jours) : champ numérique (1–3650 jours) contrôlant la durée de persistance du cookie de consentement dans le navigateur du visiteur.
  • Position de la bannière : sélecteur visuel de position avec 7 positions affichées sur une maquette de navigateur. Cliquez sur une position pour la sélectionner ; le libellé se met à jour en temps réel.
  • Journaliser les actions de consentement : interrupteur pour activer/désactiver la journalisation des consentements dans la base de données. Lorsqu'il est activé, chaque action Accepter/Refuser/Personnaliser/Retirer est enregistrée.
  • URL de la politique de confidentialité : champ texte pour l'URL de votre page de politique de confidentialité. Si elle est renseignée, un lien “Politique de confidentialité” vers cette adresse apparaît dans la bannière. Laissée vide, la bannière pointe vers la page active de type Politique de confidentialité de votre site (Panneau d'administration → Pages), dont l'adresse s'affiche en texte indicatif dans le champ ; si cette page n'existe pas, aucun lien n'est affiché.
  • Capturer le pays via l'IP : interrupteur pour enregistrer le code pays du visiteur avec chaque journal de consentement. Le pays est déterminé dans un job en file d'attente à l'aide du pilote GeoIP configuré dans LaraClassifier / JobClass : une configuration GeoIP fonctionnelle est donc nécessaire.

Sélecteur de position de la bannière

Le sélecteur de position est un élément visuel interactif représentant une fenêtre de navigateur miniature. Sept points cliquables représentent les positions disponibles :

Position Disposition Description
top-left Carte compacte Carte flottante dans le coin supérieur gauche (420px de large max.)
top-center Barre pleine largeur Barre horizontale en haut de la page
top-right Carte compacte Carte flottante dans le coin supérieur droit (420px de large max.)
middle-center Boîte de dialogue modale Modale centrée avec un voile d'arrière-plan semi-transparent
bottom-left Carte compacte Carte flottante dans le coin inférieur gauche (420px de large max.)
bottom-center Barre pleine largeur Barre horizontale en bas de la page (par défaut)
bottom-right Carte compacte Carte flottante dans le coin inférieur droit (420px de large max.)

Catégories de cookies

La colonne de droite (largeur 5/12) affiche les quatre catégories de cookies avec des interrupteurs :

  • Essentiels : toujours activés, ne peuvent pas être désactivés (affichés avec un badge “Toujours actif”). Il s'agit des cookies nécessaires au fonctionnement du site (sessions, jetons CSRF, etc.).
  • Analytique : activable. Lorsqu'elle est activée, les visiteurs peuvent accepter ou refuser les cookies analytiques (Google Analytics, Hotjar, etc.).
  • Marketing : activable. Lorsqu'elle est activée, les visiteurs peuvent accepter ou refuser les cookies marketing (Facebook Pixel, reciblage publicitaire, etc.).
  • Préférences : activable. Lorsqu'elle est activée, les visiteurs peuvent accepter ou refuser les cookies de préférences (langue, thème, personnalisation, etc.).

Les trois catégories facultatives sont activées par défaut : tant que vous n'en désactivez pas une et n'enregistrez pas les paramètres, elle est proposée aux visiteurs dans la bannière et apparaît activée dans cette carte.

Remarque : désactiver une catégorie dans l'admin la retire entièrement de la bannière : les visiteurs ne verront pas l'interrupteur de cette catégorie dans le panneau des préférences.

Journaux & rétention

Une troisième carte pleine largeur, sous les deux colonnes existantes, contrôle la rétention des données et les performances :

  • Archive mensuelle des journaux : interrupteur. Lorsqu'il est activé, seuls les journaux du mois en cours restent dans la base de données ; les mois précédents sont compressés en gzip et déplacés vers le stockage privé (voir Admin : Archives). Un raccourci vers la page Archives apparaît à côté de l'interrupteur.
  • Rétention des journaux (jours) : entier (1–7300). Les lignes de la base de données et les fichiers d'archive plus anciens que cette valeur sont définitivement supprimés par la tâche quotidienne gdpr:purge-logs. Le RGPD recommande généralement 2 à 6 ans pour les preuves de consentement.
  • Fenêtre de déduplication : entier en minutes (0–1440). Si une entrée de consentement identique existe pour le même utilisateur/IP dans cette fenêtre, la nouvelle écriture est ignorée et l'enregistrement existant est réutilisé. Mettez 0 pour désactiver.
  • TTL du cache des statistiques : entier en secondes (0–86400). Durée pendant laquelle les statistiques du tableau de bord mises en cache restent valides. Le cache est automatiquement invalidé dès qu'un journal de consentement est créé ou supprimé. Mettez 0 pour désactiver la mise en cache.
  • Vider le cache des statistiques maintenant : bouton qui purge les statistiques mises en cache à la demande (utile après des suppressions en masse ou des imports).

Statistiques d'aperçu des consentements

En haut de la page des paramètres, cinq cartes de statistiques affichent les métriques de consentement des 30 derniers jours :

  • Total des consentements : nombre total d'actions de consentement enregistrées
  • Tout accepté : visiteurs ayant cliqué sur “Tout accepter”
  • Tout refusé : visiteurs ayant cliqué sur “Tout refuser”
  • Personnalisé : visiteurs ayant enregistré des préférences personnalisées
  • Taux d'acceptation : pourcentage de “Tout accepté” par rapport au total des consentements

Ces statistiques sont mises en cache pendant gdpr_stats_cache_ttl secondes (15 minutes par défaut) pour garder la page rapide sur des bases de données contenant des millions de lignes.

Admin : Journaux de consentement

La page Journaux de consentement (Panneau d'administration → Add-ons → RGPD → Journaux de consentement, permission admin.gdpr.view) fournit une piste d'audit complète de chaque décision de consentement des visiteurs, comme l'exige l'article 7 du RGPD. La page est entièrement pilotée en AJAX : le filtrage, la pagination, la suppression en ligne et les actions groupées rafraîchissent tous le tableau sur place sans rechargement complet.

Carte de statistiques

Une carte dédiée en haut de la page affiche quatre mini-cartes de statistiques pour les 30 derniers jours (indépendantes des filtres du tableau ci-dessous) :

  • Total des consentements (couleur neutre)
  • Tout accepté (couleur succès/vert)
  • Tout refusé (couleur danger/rouge)
  • Taux d'acceptation (couleur d'accent, affiché en pourcentage)

Ces chiffres sont mis en cache pendant gdpr_stats_cache_ttl secondes et se rafraîchissent automatiquement lorsqu'un journal est créé ou supprimé.

Actions de la page

L'en-tête de la page expose trois boutons d'action soumis à permission :

  • Archives (affiché uniquement lorsque le mode archive est activé) : ouvre le navigateur d'archives mensuelles (voir ci-dessous). Nécessite admin.gdpr-archive.view.
  • Exporter en CSV : télécharge un fichier CSV des lignes actuellement filtrées, avec un BOM UTF-8 pour la compatibilité avec Excel. Colonnes : id, created_at, user_id, user_name, user_email, ip_address, user_agent, action, categories (JSON). Nécessite admin.gdpr.export.
  • Purger maintenant : met en file d'attente le job PurgeConsentLogsJob pour supprimer immédiatement les lignes de la base de données et les fichiers d'archive au-delà de la période de rétention (demande une confirmation). Le job s'exécute sur votre connexion de file d'attente. Nécessite admin.gdpr.delete.

Filtres

Tous les filtres sont alignés sur une seule ligne dans l'en-tête de la carte et déclenchent un rafraîchissement AJAX :

  • Recherche (avec un délai de 300 ms) : filtre par adresse IP, nom d'utilisateur ou e-mail de l'utilisateur.
  • Action : liste déroulante avec accepted_all, rejected_all, customized, withdrew.
  • Date de début et Date de fin : sélecteurs natifs <input type="date"> qui appliquent une plage whereDate(created_at, …).

Le bouton Exporter en CSV respecte les filtres actuellement appliqués.

Tableau des journaux

Un tableau paginé (25 enregistrements par page par défaut) avec les colonnes suivantes :

Colonne Description
Sélection Case à cocher de ligne + “tout sélectionner” dans l'en-tête. Affichée uniquement lorsque l'utilisateur possède admin.gdpr.delete.
Visiteur Avatar de l'utilisateur + nom/e-mail (si authentifié) ou libellé “Invité” (si anonyme).
Adresse IP Adresse IP du visiteur, affichée en police monospace/code.
Pays Drapeau et code pays (nom complet dans une infobulle). Affichée uniquement lorsque Capturer le pays via l'IP est activé.
Action Badge coloré : Tout accepté (vert), Tout refusé (rouge), Personnalisé (jaune), Retiré (gris).
Catégories Badges en ligne pour chaque catégorie indiquant l'état activé (plein) ou désactivé (contour).
Date Temps relatif lisible (ex. “il y a 2 heures”) avec la date complète dans une infobulle.
Actions Icône de corbeille par ligne qui supprime l'entrée via AJAX après une demande de confirmation.

Suppression groupée

Cocher une ou plusieurs cases de ligne fait apparaître une barre d'actions groupées flottante en haut de la liste. Cliquez sur Supprimer la sélection et confirmez l'invite SweetAlert pour supprimer toutes les lignes sélectionnées en une seule requête AJAX. La sélection est réinitialisée et le tableau se rafraîchit en cas de succès.

Déduplication

Avant d'insérer une nouvelle ligne, GdprService::logConsent() recherche un journal récent identique (même user_id ou IP, même action, mêmes catégories) créé dans la fenêtre gdpr_dedup_window_minutes. Si un tel journal est trouvé, l'enregistrement existant est renvoyé et aucune nouvelle ligne n'est écrite. Cela évite que le tableau ne se remplisse lorsqu'un visiteur recharge une page ou bascule rapidement son consentement.

État vide

Lorsqu'aucun journal ne correspond aux filtres actuels, un état vide convivial est affiché avec une grande icône et un message expliquant que les enregistrements apparaîtront dès que des visiteurs interagiront avec la bannière.

Admin : Archives

La page Archives (Panneau d'administration → Add-ons → RGPD → Archives) est toujours listée dans la barre latérale. Les nouvelles archives ne sont créées que lorsque Archivage mensuel des journaux (gdpr_archive_enabled) est activé : tant qu'il est désactivé, la page l'indique par un message, avec un raccourci vers la page des paramètres, et les archives créées auparavant restent listées et téléchargeables. Elle liste tous les fichiers d'archive mensuels gzippés trouvés sous storage/app/gdpr/{year}/{month}/consent-logs-{year}-{month}.csv.gz (disque local par défaut).

Comment les archives sont créées

Chaque 1er du mois à 00:05, la commande planifiée gdpr:archive-monthly s'exécute (si le paramètre d'archive est activé). Elle effectue les opérations suivantes pour chaque mois antérieur au mois en cours qui ne possède pas encore de fichier d'archive :

  1. Diffuse chaque journal de ce mois dans un tampon CSV (1000 lignes à la fois).
  2. Compresse le CSV en gzip et l'écrit sur le disque privé au chemin indiqué ci-dessus.
  3. Supprime les lignes archivées de gdpr_consent_logs par lots de 1000, dans une seule transaction de base de données.
  4. Enfin, élague tous les fichiers d'archive plus anciens que gdpr_log_retention_days.

Parcourir les archives

La page d'administration regroupe les fichiers par année dans une liste repliable. Chaque ligne affiche le mois, le nom du fichier, la taille du fichier et l'horodatage de l'archive, ainsi qu'un bouton Télécharger qui renvoie le fichier gzip au navigateur. L'accès à la navigation comme au téléchargement est soumis à permission (admin.gdpr-archive.view et admin.gdpr-archive.download).

Sécurité des chemins : le point de terminaison de téléchargement valide les paramètres d'URL year / month / filename à l'aide de motifs regex stricts et renvoie une erreur 404 pour tout ce qui se trouve en dehors du répertoire de stockage gdpr/.

CLI & planification

L'add-on enregistre deux commandes Artisan et leurs entrées planifiées correspondantes. Les deux sont câblées automatiquement dans GdprServiceProvider::boot(), aucune modification de routes/console.php n'est nécessaire.

Commande Planification Rôle
gdpr:purge-logs Chaque jour à 00:00 Distribue PurgeConsentLogsJob : supprime les lignes de la base de données plus anciennes que gdpr_log_retention_days, élague les fichiers d'archive expirés et vide le cache des statistiques.
gdpr:archive-monthly [--force] Le 1er de chaque mois à 00:05 Distribue ArchiveMonthlyConsentLogsJob : archive chaque mois passé terminé, puis élague les archives expirées. Ne fait rien du tout lorsque gdpr_archive_enabled est désactivé, sauf si --force est passé.

Les deux commandes exécutent leur job de façon synchrone, dans la commande elle-même : aucun worker de file d'attente n'est nécessaire pour les exécutions planifiées (seul le bouton Purger maintenant de la page des journaux de consentement place le job de purge dans votre file d'attente). La planification ne se déclenche que si la tâche cron de LaraClassifier / JobClass (* * * * * cd /path-to-your-site && php artisan schedule:run >> /dev/null 2>&1) est en place sur votre serveur. Vérifiez que les tâches sont enregistrées avec php artisan schedule:list.

Front-end : Bannière de cookies

La bannière de consentement aux cookies est un composant HTML/CSS/JS autonome qui est injecté automatiquement dans chaque page front-end via le middleware InjectCookieBanner.

Vue principale de la bannière

La vue principale affiche :

  • Icône de cookie : une illustration de cookie en SVG inline
  • Titre : “Préférences de cookies”
  • Message : une brève explication de l'utilisation des cookies
  • Lien vers la politique de confidentialité : pointe vers l'URL configurée dans les paramètres ou, si ce champ est vide, vers la page active Politique de confidentialité de votre site ; masqué si aucune des deux n'existe
  • Trois boutons d'action :
    • Tout accepter (bouton principal sombre) : accepte toutes les catégories de cookies
    • Tout refuser (bouton secondaire gris) : refuse tous les cookies non essentiels
    • Personnaliser (bouton fantôme/texte) : ouvre le panneau des préférences

Positions de la bannière

La bannière adapte sa disposition en fonction de la position configurée :

  • Positions pleine largeur (top-center, bottom-center) utilisent une disposition flex horizontale avec le contenu et les boutons côte à côte. Largeur max. 860px, centrée.
  • Positions en coin (top-left, top-right, bottom-left, bottom-right) utilisent une disposition en carte compacte (420px max.) avec le contenu empilé.
  • Position modale (middle-center) centre la bannière avec un voile d'arrière-plan semi-transparent, fonctionnant comme une boîte de dialogue modale (520px max.).

Panneau des préférences

Cliquer sur “Personnaliser” fait passer de la vue principale au panneau des préférences (sans rechargement de page). Le panneau affiche :

  • Bouton Retour avec une icône chevron : revient à la vue principale de la bannière
  • Liste des catégories (défilante, hauteur max. 280px) avec une ligne par catégorie activée :
    • Nom et description de la catégorie
    • Catégories obligatoires : affichent un badge “Toujours actif” (pas d'interrupteur)
    • Catégories facultatives : affichent un interrupteur CSS personnalisé
  • Bouton Enregistrer les préférences : enregistre les catégories sélectionnées et ferme la bannière

Animations

La bannière utilise des animations CSS fluides :

  • Glissement depuis le bas pour les positions en bas
  • Glissement depuis le haut pour les positions en haut
  • Fondu + mise à l'échelle pour la position modale centrée
  • Animations inversées lorsque la bannière est fermée

Design responsive

Sur les écrans de moins de 768px :

  • Les barres pleine largeur passent en disposition verticale (empilée)
  • Les cartes en coin s'étendent sur toute la largeur
  • Les boutons d'action s'empilent verticalement et occupent toute la largeur

Traductions

Des fichiers de traduction sont fournis pour 18 langues (ar, bn, de, en, es, fr, he, hi, it, ja, ka, pt, ro, ru, th, tr, uk, zh). Toutes les chaînes utilisent le préfixe d'espace de noms gdpr::.

Clés de traduction

Section Motif de clé Description
Catégories gdpr::messages.categories.* Noms et descriptions des catégories (necessary, analytics, marketing, preferences)
Actions gdpr::messages.actions.* Libellés des actions de consentement (accepted_all, rejected_all, customized, withdrew)
Positions gdpr::messages.positions.* Libellés des positions de la bannière pour le sélecteur admin
Front-end gdpr::messages.front.* Chaînes de l'interface de la bannière (titre, message, libellés des boutons, lien de confidentialité)
Paramètres admin gdpr::messages.admin.settings.* Libellés, indications et titres de sections de la page des paramètres
Journaux de consentement admin gdpr::messages.admin.consent_logs.* Libellés, en-têtes de colonnes et état vide de la page des journaux de consentement
Statistiques admin gdpr::messages.admin.stats.* Libellés des cartes de statistiques (total_consents, accepted_all, etc.)
Archives admin gdpr::messages.admin.archives.* Libellés du navigateur d'archives (title, subtitle, month, filename, size, archived_at, download, état vide)
Messages gdpr::messages.admin.messages.* Messages flash (settings_updated, stats_cache_cleared)

Mise à jour

Une mise à jour ne remplace que les fichiers de l'add-on. Ses tables et ses données, ses paramètres, son état d'activation et son code d'achat enregistré sont tous conservés : ne désactivez et ne supprimez pas l'add-on avant de le mettre à jour. Sauvegardez tout de même votre base de données au préalable.

Méthode 1 : Téléverser la nouvelle version (recommandé)

  1. Téléchargez le dernier fichier .zip de l'add-on.
  2. Allez dans Panneau d'administration → Extensions → Add-ons et cliquez sur Téléverser un add-on.
  3. Déposez le fichier .zip dans la zone de téléversement.
  4. Comme GDPR & Cookie Consent est déjà installé, une demande de confirmation affiche la version installée et la nouvelle. Cliquez sur Remplacer : le dossier extensions/addons/gdpr/ est remplacé par les nouveaux fichiers. Annuler la demande abandonne le téléversement.

Méthode 2 : Remplacer les fichiers à la main

  1. Par FTP ou SSH, supprimez le dossier extensions/addons/gdpr/ et envoyez le nouveau à sa place. Remplacez le dossier entier plutôt que de copier par-dessus, afin que les fichiers retirés par la nouvelle version ne subsistent pas.
  2. Ouvrez Panneau d'administration → Extensions → Add-ons : la page relit addon.json et la carte affiche le nouveau numéro de version.

Une fois les fichiers remplacés

Nouvelles tables ou colonnes. Lorsqu'une nouvelle version en ajoute, créez-les en exécutant php artisan migrate --force en SSH, ou sans SSH en cliquant sur Désactiver puis Activer sur la carte de l'add-on : l'activation exécute toutes les migrations en attente (et redemande le code d'achat). Vos données ne sont pas touchées dans les deux cas.

Si votre installation met en cache sa configuration ou ses routes (php artisan config:cache, route:cache), exécutez php artisan optimize:clear après la mise à jour.

Désinstallation

Éteindre un add-on sans rien perdre, c'est le désactiver : allez dans Panneau d'administration → Extensions → Add-ons, cliquez sur Désactiver sur la carte GDPR & Cookie Consent et confirmez.

  • L'add-on n'est plus chargé : ses routes, ses vues, son entrée dans la barre latérale d'administration et ses pages publiques ne répondent plus.
  • Ses tables de base de données et toutes les données qu'elles contiennent sont conservées, et ses fichiers restent dans extensions/addons/gdpr/. Rien n'est supprimé.
  • Ses permissions et son code d'achat enregistré restent en base de données. Seule la suppression les efface.
  • La désactivation est refusée tant qu'un autre add-on actif dépend de celui-ci : désactivez d'abord cet add-on.

Cliquez sur Activer sur la même carte pour le rallumer. Comme lors de la première activation, le code d'achat est redemandé et vérifié ; ensuite les migrations en attente sont exécutées, les assets republiés, et l'add-on reprend exactement là où il s'était arrêté.

Suppression

La suppression est définitive et détruit les données de l'add-on. Le bouton Supprimer n'apparaît que sur un add-on désactivé : la suppression se fait donc toujours en deux temps :

  1. Désactivez GDPR & Cookie Consent (voir Désinstallation).
  2. Cliquez sur Supprimer sur sa carte et confirmez la demande.

Le panneau d'administration, en une seule passe :

  • exécute le hook de désinstallation de l'add-on, s'il en fournit un, tant que son code est encore sur le disque ;
  • révoque les permissions déclarées dans son addon.json ;
  • annule ses migrations, ce qui supprime ses tables de base de données et toutes les lignes qu'elles contiennent, et purge ses entrées de la table migrations, afin qu'une réinstallation ultérieure reparte de zéro ;
  • supprime ses assets publiés : public/addons/gdpr/, public/vendor/gdpr/ et storage/app/public/addons/gdpr/ ;
  • supprime le dossier de l'add-on extensions/addons/gdpr/ ;
  • supprime sa ligne dans la table addons (le code d'achat enregistré disparaît avec elle) et vide le cache de l'application.
Cette action est irréversible. Sauvegardez votre base de données avant de supprimer un add-on dont les données peuvent encore vous servir : le réinstaller plus tard crée des tables vides, pas votre ancien contenu, et redemande le code d'achat.

La suppression est refusée, avec un message explicatif et avant toute destruction, lorsque l'add-on est encore actif, lorsqu'un autre add-on actif en dépend, ou lorsque l'utilisateur du serveur web (PHP) ne peut pas supprimer extensions/addons/gdpr/. Dans ce dernier cas, donnez à cet utilisateur le droit d'écriture sur le dossier et sur son parent, puis réessayez.

Supprimer le dossier en FTP ou en SSH n'est pas équivalent : l'add-on est seulement éteint, et ses tables, ses entrées dans la table migrations et sa ligne addons restent en place. Utilisez plutôt Supprimer dans le panneau d'administration.

Dépannage

La bannière n'apparaît pas sur le front-end

Vérifiez les points suivants :

  • L'add-on est activé dans Panneau d'administration → Extensions → Add-ons.
  • Activer la bannière de cookies est activé dans RGPD → Paramètres.
  • Vous n'avez pas déjà un cookie gdpr_consent défini. Effacez les cookies ou utilisez une fenêtre de navigation privée pour tester.
  • La page est une réponse HTML standard avec une balise </body> (le middleware recherche cette balise pour injecter la bannière).
  • Vous consultez une page front-end, pas une page d'administration (les routes admin sont exclues).

La bannière apparaît sur les pages d'administration

Cela ne devrait pas se produire : le middleware ignore explicitement les routes admin via isAdminPanelRoute(). Si cela se produit malgré tout, vérifiez que :

  • La fonction helper isAdminPanelRoute() est définie et fonctionne dans votre installation principale de LaraClassifier / JobClass.
  • Le préfixe de vos URL d'administration correspond au chemin de base configuré pour l'administration (la valeur ADMIN_BASE_PATH du fichier .env, admin par défaut).

Le cookie de consentement est chiffré / illisible par JavaScript

L'add-on exclut explicitement le cookie gdpr_consent du middleware EncryptCookies de Laravel. Si le cookie est toujours chiffré :

  • Assurez-vous que le GdprServiceProvider est correctement enregistré (l'add-on est actif).
  • Vérifiez qu'aucun middleware personnalisé ou package ne rechiffre le cookie.
  • Effacez les cookies de votre navigateur et donnez à nouveau votre consentement : d'anciens cookies chiffrés issus d'une configuration précédente peuvent persister.

Les journaux de consentement ne sont pas enregistrés

  • Vérifiez que Journaliser les actions de consentement est activé dans les paramètres admin.
  • Vérifiez que la table gdpr_consent_logs existe (elle est créée à l'activation de l'add-on).
  • Un choix identique refait par le même utilisateur/la même IP dans la Fenêtre de déduplication n'est pas journalisé deux fois.
  • Consultez les journaux de votre serveur pour détecter des erreurs de base de données (ex. problèmes de permissions).

La position de la bannière ne change pas

  • Après avoir changé la position dans les paramètres admin, veillez à effacer le cookie gdpr_consent (ou utilisez une fenêtre de navigation privée) : la bannière n'apparaît que pour les visiteurs sans cookie de consentement.
  • La bannière générée est mise en cache, mais ce cache est vidé automatiquement à chaque enregistrement des paramètres RGPD.

Les catégories n'apparaissent pas dans le panneau des préférences

Seules les catégories activées dans les paramètres admin apparaissent dans le panneau des préférences. La catégorie “Essentiels” apparaît toujours. Pour les catégories facultatives :

  • Vérifiez que Cookies analytiques, Cookies marketing et/ou Cookies de préférences sont activés dans la carte Catégories de cookies de la page des paramètres.
  • Les catégories désactivées sont filtrées par le middleware InjectCookieBanner avant le rendu de la vue.

Rétention / purge des journaux

La rétention est entièrement automatisée. La commande planifiée gdpr:purge-logs s'exécute chaque jour à 00:00 et supprime à la fois les lignes de la base de données et les fichiers d'archive plus anciens que gdpr_log_retention_days (par défaut : 730 jours / 2 ans, configurable depuis la page Paramètres). Vous pouvez également :

  • La déclencher à la demande depuis la page Journaux de consentement via le bouton Purger maintenant (nécessite admin.gdpr.delete).
  • L'exécuter manuellement : php artisan gdpr:purge-logs.
  • Vérifier la planification avec php artisan schedule:list, gdpr:purge-logs (quotidien) et gdpr:archive-monthly (mensuel, le 1er à 00:05) doivent tous deux apparaître.

Le job d'archive mensuelle ne s'exécute pas

  • Assurez-vous que Archivage mensuel des journaux est activé dans les Paramètres ; sinon la commande s'arrête prématurément. Passez --force à php artisan gdpr:archive-monthly pour contourner cette vérification.
  • Confirmez que le planificateur de Laravel est câblé (* * * * * cd /path && php artisan schedule:run dans votre crontab). Sans lui, aucune tâche planifiée ne se déclenche jamais.
  • Vérifiez que le disque local est accessible en écriture et que storage/app/gdpr/ est accessible en écriture (le dossier est créé à la volée par le job).

La page Archives affiche “L'archivage mensuel est désactivé” ou n'apparaît pas dans la barre latérale

  • Ce message signifie que Archivage mensuel des journaux est désactivé et qu'aucune nouvelle archive n'est créée : activez-le dans la page des paramètres.
  • L'élément de menu Archives n'est listé que pour les administrateurs possédant la permission admin.gdpr-archive.view.

Les statistiques du tableau de bord semblent obsolètes

  • Les statistiques sont mises en cache pendant gdpr_stats_cache_ttl secondes (15 minutes par défaut). Le cache est automatiquement vidé à chaque création/suppression de journal.
  • Après un import en masse ou un nettoyage manuel de la base de données, cliquez sur Vider le cache des statistiques maintenant sur la page Paramètres pour forcer un recalcul.
  • Mettez gdpr_stats_cache_ttl à 0 pour désactiver complètement la mise en cache (déconseillé sur de grands jeux de données).

Erreur de jeton CSRF sur les points de terminaison de consentement

Tous les points de terminaison de consentement (/gdpr/accept-all, etc.) requièrent un jeton CSRF valide. Le JavaScript de la bannière lit le jeton dans la balise <meta name="csrf-token"> de la page. Si vous voyez des erreurs 419 :

  • Assurez-vous que votre session Laravel est correctement configurée.
  • Vérifiez que le groupe de middleware web (qui inclut VerifyCsrfToken) est appliqué aux routes de consentement.
  • Si vous utilisez une vue de bannière personnalisée, assurez-vous qu'elle transmet le jeton CSRF dans l'en-tête X-CSRF-TOKEN des requêtes fetch.

GDPR & Cookie Consent v1.0.4 : un add-on LaraClassifier / JobClass.

© BeDigit. Tous droits réservés.

Cet article vous a-t-il été utile ?

Merci pour votre retour !

Besoin d'aide ? Créez un ticket de support

Créer un Ticket

Guides des add-ons

sept. 14, 2026