Prestashop : Filtrer les emails de produits hors stocks

Ce tutoriel est compatible avec les versions de Prestashop suivantes :
1.7 +

Dans Prestashop il est possible d’être notifié lorsque des commandes sont passées sur des produits qui ne sont bientôt plus en stock.
Ce paramétrage est accessible depuis l’administration sur chaque fiche produit en cochant la case « M’envoyer un email quand la quantité est en dessous ou égale à ce niveau. »

Cette fonctionnalité est très pratique pour le marchant, mais en revanche ces emails n’ont aucun intérêt pour le développeur ou l’agence qui gère le site.
C’est la ou le fonctionnement natif de Prestashop n’est pas très pratique, car pour chaque commande d’un produit avec cette option cochée, l’ensemble des utilisateurs de l’administration  avec un accès en lecture à la page des stocks vont être notifiés.

Ces derniers temps je suis spammé par ce genre d’email et j’ai donc décidé de m’attaquer au problème 🙂

Une solution simple pourrait être de retirer cet accès pour les profils administrateurs, mais ceci nécessite de créer un nouveau rôle spécial et de ne pas avoir de visualisation sur cette page en back office.

Nous allons voir qu’il est facile de contourner ce comportement et que le meilleur email est celui qui ne part pas !
Nous allons donc le bloquer dès l’envoi 🙂

Pour cela comme d’habitude ça se passe via un module qui va s’appeler hhoutofstockmailsfilter et dans lequel nous allons utiliser le hook actionEmailSendBefore pour bloquer l’envoi de l’email ( cf. mon article détaillé sur le fonctionnement des emails : Prestashop : gérer les emails dans vos modules )

Dans ce module nous pourrons configurer les éléments suivants :

  • Mode de fonctionnement ( AllowList / BlockList )
  • Liste des emails concernés
  • Logs ou non de l’action de filtre dans les logs Prestashop ( très pratique si quelqu’un d’extérieur doit debug 😉 )

Voici une visualisation du panneau de configuration :

Et voici l’ensemble du code du module 😉

if (!defined('_PS_VERSION_')) {
    exit;
}
 
 
class Hhoutofstockmailsfilter extends Module
{
    /**
     * @var string
     */
    protected $configPrefix;
 
    public function __construct()
    {
        $this->name = 'hhoutofstockmailsfilter';
        $this->tab = 'others';
        $this->version = '0.1.0';
        $this->author = 'hhennes';
        $this->bootstrap = true;
        parent::__construct();
 
        $this->displayName = $this->l('Hh out of stock Filter');
        $this->description = $this->l('Control which user will receive outofstocks emails');
        $this->configPrefix = strtoupper($this->name) . '_';
    }
 
    /**
     * Installation du module
     * @return bool
     */
    public function install()
    {
        if (
            !parent::install()
            || !$this->registerHook('actionEmailSendBefore')
        ) {
            return false;
        }
 
        return true;
    }
 
    /**
     * Hook exécuté avant d'envoyer un email
     * @param array $params
     * @return false|void
     */
    public function hookActionEmailSendBefore(array $params)
    {
        if ($params['template'] == 'productoutofstock') {
 
            //Récupération de la liste des emails
            $emails = array_map('trim',
                explode(',', Configuration::get($this->configPrefix . 'EMAILS'))
            );
 
            //Récupération du type de filtre
            $filterMode = Configuration::get($this->configPrefix . 'MODE');
            $filterMode == 'ALLOWED' ?
                $sendEMail = in_array($params['to'], $emails) :
                $sendEMail = !in_array($params['to'], $emails);
 
            //Blocage de l'email
            if (!$sendEMail) {
                if (Configuration::get($this->configPrefix . 'ENABLE_LOGS') == 1) {
                    PrestaShopLogger::addLog(
                        'productoutofstock email was prevent to be send by module ' . $this->name
                    );
                }
                return false; //Si on renvoie false l'email n'est pas envoyé
            }
        }
    }
 
    /**
     * Configuration du module
     * @return string
     * @throws PrestaShopDatabaseException
     * @throws PrestaShopException
     */
    public function getContent()
    {
        $html = '';
        $html .= $this->postProcess();
        $html .= $this->renderForm();
 
        return $html;
    }
 
    /**
     * Gestion de l'affichage du formulaire
     * @return string
     * @throws PrestaShopDatabaseException
     * @throws PrestaShopException
     */
    public function renderForm(): string
    {
        $fields_form = [
            'form' => [
                'legend' => [
                    'title' => $this->l('Module Configuration'),
                    'icon' => 'icon-cogs',
                ],
                'input' => [
                    [
                        'type' => 'switch',
                        'label' => $this->l('Behavior for the filter '),
                        'name' => $this->configPrefix . 'MODE',
                        'required' => true,
                        'hint' => $this->l('With mode allowed only the email in the list will receive the emails, otherwise they will not.'),
                        'class' => 't',
                        'values' => [
                            [
                                'id' => 'active_on',
                                'value' => 'ALLOWED',
                                'label' => $this->l('Allowed'),
                            ],
                            [
                                'id' => 'active_off',
                                'value' => 'EXCLUDED',
                                'label' => $this->l('Excluded'),
                            ],
                        ],
                    ],
                    [
                        'type' => 'text',
                        'label' => $this->l('Allowed/excluded emails comas separated'),
                        'name' => $this->configPrefix . 'EMAILS',
                        'required' => true,
                        'hint' => $this->l('Depending configuration Only the emails listed here will receive/no receive the out of stocks emails'),
                    ],
                    [
                        'type' => 'switch',
                        'label' => $this->l('Log blocked emails'),
                        'name' => $this->configPrefix . 'ENABLE_LOGS',
                        'required' => true,
                        'hint' => $this->l('The blocked emails will be listed in prestashop log table'),
                        'class' => 't',
                        'is_bool' => true,
                        'values' => [
                            [
                                'id' => 'active_on',
                                'value' => 1,
                                'label' => $this->l('Enabled'),
                            ],
                            [
                                'id' => 'active_off',
                                'value' => 0,
                                'label' => $this->l('Disabled'),
                            ],
                        ],
                    ],
                ],
                'submit' => [
                    'title' => $this->l('Save'),
                    'class' => 'button btn btn-default pull-right',
                ],
            ],
        ];
 
        $helper = new HelperForm();
        $helper->show_toolbar = false;
        $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
        $helper->default_form_language = $lang->id;
        $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ?
            Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
        $helper->id = $this->name;
        $helper->submit_action = 'SubmitModuleConfiguration';
        $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
            . '&configure=' . $this->name . '&tab_module=' . $this->tab . '&module_name=' . $this->name;
        $helper->token = Tools::getAdminTokenLite('AdminModules');
        $helper->tpl_vars = [
            'fields_value' => $this->getConfigFieldsValues(),
            'languages' => $this->context->controller->getLanguages(),
            'id_language' => $this->context->language->id,
        ];
 
        return $helper->generateForm([$fields_form]);
 
    }
 
    /**
     * Traitement du formulaire
     * @return string|void
     */
    public function postProcess()
    {
        if (Tools::isSubmit('SubmitModuleConfiguration')) {
            Configuration::updateValue($this->configPrefix . 'MODE', Tools::getValue($this->configPrefix . 'MODE'));
            Configuration::updateValue($this->configPrefix . 'EMAILS', Tools::getValue($this->configPrefix . 'EMAILS'));
            Configuration::updateValue($this->configPrefix . 'ENABLE_LOGS', Tools::getValue($this->configPrefix . 'ENABLE_LOGS'));
            return $this->displayConfirmation($this->l('Settings updated'));
        }
 
    }
 
    /**
     * Récupération des valeurs de configuration du formulaire
     * @return array
     */
    public function getConfigFieldsValues(): array
    {
        return [
            $this->configPrefix . 'MODE' => Tools::getValue($this->configPrefix . 'MODE', Configuration::get($this->configPrefix . 'MODE')),
            $this->configPrefix . 'EMAILS' => Tools::getValue($this->configPrefix . 'EMAILS', Configuration::get($this->configPrefix . 'EMAILS')),
            $this->configPrefix . 'ENABLE_LOGS' => Tools::getValue($this->configPrefix . 'ENABLE_LOGS', Configuration::get($this->configPrefix . 'ENABLE_LOGS')),
        ];
    }
 
 
}

Et voila une fois le module installé de spams avec les emails de produits hors stocks 🙂

Télécharger le module complet ( et gratuit ) sur la boutique

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.