Jump to content

Remplacer le layout d'un email du coeur


Recommended Posts

Bonjour,

Je tente, à travers un module, d'intégrer de nouvelles informations dans le mail envoyé par PrestaShop aux gestionnaires de la boutique lorsqu'un client utilise le formulaire de contact. Nous utilisons par ailleurs PrestaShop 1.7.8.7 et PHP 7.4.

Le module ressemble grosso modo à ça (en conservant juste l'essentiel, sans le constructeur et d'autres méthodes...) :

<?php

use PrestaShop\PrestaShop\Core\MailTemplate\ThemeCatalogInterface;

class MonModuleDeMails extends Module
{
    /**
     * A noter que deux greffons sont installés pour altérer les templates de mails.
     */
    public function install(): bool
    {
        if (Shop::isFeatureActive()) {
            Shop::setContext(Shop::CONTEXT_ALL);
        }

        return parent::install()
            && $this->registerHook('sendMailAlterTemplateVars')
            && $this->registerHook(ThemeCatalogInterface::LIST_MAIL_THEMES_HOOK);
    }

    public function uninstall(): bool
    {
        if (Shop::isFeatureActive()) {
            Shop::setContext(Shop::CONTEXT_ALL);
        }
        
        return $this->unregisterHook(ThemeCatalogInterface::LIST_MAIL_THEMES_HOOK)
            && $this->unregisterHook('sendMailAlterTemplateVars')
            && parent::uninstall();
    }

    /**
     * On veut juste remplacer le template 'contact' du thème d'email 'modern'.
     */
    public function hookActionListMailThemes(array &$hookParams): void
    {
        if (! isset($hookParams['mailThemes'])) {
            return;
        }

        /** @var \PrestaShop\PrestaShop\Core\MailTemplate\ThemeCollectionInterface $themes */
        $themes = $hookParams['mailThemes'];
        $theme = $themes->getByName('modern');
        if (! $theme) {
            return;
        }

        $contactLayout = $theme->getLayouts()->getLayout('contact', '');
        if ($contactLayout === null) {
            return;
        }

        $contactIndex = $theme->getLayouts()->indexOf($contactLayout);
        $theme->getLayouts()->offsetSet($contactIndex, new Layout(
            $contactLayout->getName(),
            _PS_MODULE_DIR_ . 'monmoduledemails/mails/layouts/modern/core/contact.html.twig',
            ''
        ));
    }

    /**
     * On ajoute des variables dans les templates de mails pour les mails 'contact'.
     */
    public function hookSendMailAlterTemplateVars(array &$hookParams): void
    {
        if ($hookParams['template'] !== 'contact') {
            return;
        }

        $hookParams['template_vars']['{shop_context_name}'] = $this->context->shop->name;
        $hookParams['template_vars']['{country_name}'] = 'Nom du pays';
    }
}

Le template dans modules/monmodulesdemails/mails/layouts/modern/core/contact.html.twig (mentionné dans la méthode hookActionListMailThemes) est copié à partir du contenu de mails/themes/modern/core/contact.html.twig par défaut.

J'ai ensuite regénéré les templates de mails :

image.png.6d16c89d10c2c6918e62a26695691a19.png

Lorsque j'accède à la prévisualiation des templates d'emails, les modifications apparaissent bien.

image.png.22217b611cc39244e4b1ec5b2204e236.png

Contenu du mail prévisualisé :

image.png.3d2c8070ae2aa45fec1545ba990e4796.png

Donc jusque-là, tout va bien, les modifications apportées par le module semblent être prises en compte..

Lorsque j'envoie un mail de test cela dit :

  • cela fonctionne bien sur notre environnement de développement, avec le contenu du template remplacé qui s'affiche correctement.
  • sur l'environnement de production, les modifications du template d'email n'apparaissent pas.

Pourtant :

  • Le module a été installé de la même manière ;
  • Vérifié que les greffons étaient bien enregistrés ;
  • Le module était activé dans les deux environnements ;
  • Le contenu du fichier mails/fr/contact.html et mails/fr/contact.txt contiennent bien les modifications voulues ;
  • Le contenu du dossier /var/cache a été purgé.

Du coup après avoir passé un peu trop de temps, rien ne me vient... A priori, on réplique l'environnement de développement à partir des sources et la DB de la prod, en veillant à purger les caches... Y aurait-il un mécanisme de cache particulier aux mails dont je ne soupçonnerais pas l'existence ?

Merci d'avance pour vos réponses !

 

Edited by Roxayl
Suppr image en trop + fix code (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...