> For the complete documentation index, see [llms.txt](https://akyos.gitbook.io/book/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://akyos.gitbook.io/book/prestashop/modules/exemples/rgpd.md).

# RGPD

### :book: Description

Le module akrgpd est un module PrestaShop qui centralise la gestion du consentement cookies via tarteaucitron.js. Son rôle est double :

* Fournir une interface de configuration en back-office (IDs GA4 / GTM / Facebook Pixel) ;
* Exposer un widget front-office qui injecte le bandeau et active les services uniquement selon le consentement utilisateur.

{% hint style="info" %}
Ce module est construit en utilisant le système Legacy. Cela permet donc une compatibilité depuis Prestashop 1.7.
{% endhint %}

### :file\_folder: Module complet :&#x20;

{% file src="/files/Pvozyi1RYy1raOcXGP7h" %}

### Explications

Ce module est appelé dans le thème dans le fichier /templates/layouts/layout-both-columns.tpl, juste avant la fermeture du body avec {widget name="akrgpd"}.

#### Pourquoi un widget et pas un hook ?

J'ai choisi d'utiliser le système de widget et pas un hook, car cela permet d'appeler directement le module. C'est un choix de ma part, mais un hook personnalisé aurait aussi fonctionné.

#### Arborescence

<pre><code>modules/akrgpd/akrgpd.php
    - classe module AkRgpd
<strong>    - installation/désinstallation
</strong>    - configuration BO (getContent, displayForm)
    - rendu widget (renderWidget, getWidgetVariables)
modules/akrgpd/views/templates/front/widget.tpl
    - injection de tarteaucitron
    - configuration JS du bandeau
    - activation conditionnelle des services (GA4/GTM/Pixel)
modules/akrgpd/views/css/style.css
    - styles front spécifiques au module
modules/akrgpd/tarteaucitron/*
    - librairie tarte au citron
</code></pre>

#### Installation / désinstallation

```php
public function install() {
    return parent::install() 
    && Configuration::updateValue('AK_RGPD_UA4', '')
    && Configuration::updateValue('AK_RGPD_GTM', '')
    && Configuration::updateValue('AK_RGPD_PIXEL', '');
}
```

À l’installation, le module crée 3 clés de configuration globales PrestaShop&#x20;

* AK\_RGPD\_UA4&#x20;
* AK\_RGPD\_GTM&#x20;
* AK\_RGPD\_PIXEL

<pre class="language-php"><code class="lang-php">public function uninstall() {
<strong>    return parent::uninstall()
</strong>    &#x26;&#x26; Configuration::deleteByName('AK_RGPD_UA4')
    &#x26;&#x26; Configuration::deleteByName('AK_RGPD_GTM')
    &#x26;&#x26; Configuration::deleteByName('AK_RGPD_PIXEL');
}
</code></pre>

À la désinstallation, ces 3 clés sont supprimées via Configuration::deleteByName(...).

Pour comprendre le fonctionnement de configuration c'est par ici : <https://devdocs.prestashop-project.org/9/development/components/configuration/backward-compatibility/>

Mais en résumé, Configuration permet de stocker des valeurs rapidement et simplement dans le table ps\_configuration. Cette tableau est faite pour ça, pas besoin de se priver !

#### Fonction getContent()

`getContent()` est le point d’entrée BO affiché quand on clique sur “Configurer” le module. Sans le `getContent()`, le bouton "Configurer" n'apparait pas. Cette méthode fait 3 choses :

* Détecter une soumission du formulaire ;
* Sauvegarder les valeurs dans la table ps\_configuration ;
* Préparer les valeurs pour l’affichage et retourner le HTML du formulaire.

```php
   public function getContent()
    {
        $output = '';

        if (Tools::isSubmit('btnSubmit')) {
            Configuration::updateValue('AK_RGPD_UA4', Tools::getValue('ua4'));
            Configuration::updateValue('AK_RGPD_GTM', Tools::getValue('gtm'));
            Configuration::updateValue('AK_RGPD_PIXEL', Tools::getValue('pixel'));

            $output .= $this->displayConfirmation($this->trans('Configuration enregistrée.', [], 'Modules.Akrgpd.Admin'));
        }

        return $output . $this->displayForm();
    }
```

* On initialise d’abord une variable $output vide, qui servira à construire le retour HTML.&#x20;
* On vérifie ensuite si le formulaire a été soumis via Tools::isSubmit('btnSubmit') (donc clic sur le bouton de sauvegarde). Si le formulaire est soumis, elle enregistre 3 valeurs de configuration :
  * AK\_RGPD\_UA4 avec la valeur du champ ua4&#x20;
  * AK\_RGPD\_GTM avec la valeur du champ gtm&#x20;
  * AK\_RGPD\_PIXEL avec la valeur du champ pixel en utilisant Configuration::updateValue(...).&#x20;
* Après l’enregistrement, on ajoute un message de succès dans $output avec displayConfirmation(...), et le texte est traduit via trans(...) ("Configuration enregistrée.").&#x20;
* Enfin, on retourne la concaténation : du message éventuel ($output) puis du formulaire généré par displayForm().

#### Fonction displayForm()

Je ne vais pas m'attarder sur le displayForm. En gros, nous utilisons le composant HelperForm de PrestaShop pour construire notre formulaire.

Le name est important, c'est ce qui va ensuite nous permettre de faire des Tools::getValue(), Tools::isSubmit().

<pre class="language-php"><code class="lang-php">$form = [
    'form' => [
        'input' => [
<strong>            // ...
</strong>            [
                'type' => 'text', // Type du champ
                'name' => 'pixel', // Nom du champ qu'on récupère ensuite avec Tools::getValue('pixel')
                'label' => 'Pixel Facebook',
                'size' => 255,
                'placeholder' => '123450789012345',
            ],
        ],
        'submit' => [
            'title' => $this->trans('Save', [], 'Admin.Actions'),
            'name' => 'btnSubmit', // Nom du submit qu'on récupère ensuite avec Tools::isSubmit('btnSubmit')
        ],
    ],
];
</code></pre>

Et `$helper->fields_value['champ']` permet d'initialiser les valeurs.

```php
$helper->fields_value['ua4'] = Configuration::get('AK_RGPD_UA4');
$helper->fields_value['gtm'] = Configuration::get('AK_RGPD_GTM');
$helper->fields_value['pixel'] = Configuration::get('AK_RGPD_PIXEL');
```

La documentation complète est disponible ici : <https://devdocs.prestashop-project.org/9/development/components/helpers/helperform/>

#### Fonction getWidgetVariables()

```php
public function getWidgetVariables($hookName = null, array $configuration = [])
    {
        return [
            'ua4' => Configuration::get('AK_RGPD_UA4'),
            'gtm' => Configuration::get('AK_RGPD_GTM'),
            'pixel' => Configuration::get('AK_RGPD_PIXEL'),
        ];
    }
```

Cette méthode prépare les données envoyées au template.

Elle retourne un tableau associatif avec 3 clés :

* `ua4` : valeur de `Configuration::get('AK_RGPD_UA4')`
* `gtm` : valeur de `Configuration::get('AK_RGPD_GTM')`
* `pixel` : valeur de `Configuration::get('AK_RGPD_PIXEL')`

#### Fonction renderWidget()

```php
public function renderWidget($hookName = null, array $configuration = [])
    {
        $templateFile = 'module:' . $this->name . '/views/templates/front/widget.tpl';

        if (!$this->isCached($templateFile, $this->getCacheId())) {
            $this->smarty->assign($this->getWidgetVariables($hookName, $configuration));
        }

        return $this->fetch($templateFile, $this->getCacheId());
}
```

Cette méthode est responsable de rendre (afficher) le widget front-office du module.

* Elle construit d’abord le chemin du template Smarty :
  * `module:akrgpd/views/templates/front/widget.tpl`
* Elle vérifie ensuite si ce template est déjà en cache avec `isCached(...)`.
* Si le template n’est pas en cache :
  * elle injecte les variables nécessaires dans Smarty via `assign(...)`
  * ces variables proviennent de `getWidgetVariables(...)`
* Enfin, elle retourne le HTML rendu via `fetch(...)`, en utilisant le même cache ID.
