N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
Ça fait quelques temps que je n’avais pas publié de tutoriel générique sur Prestashop, mais celui-ci est parti du besoin suivant :
Sur ma boutique sur laquelle je propose des modules ( gratuit ) en téléchargement , j’ai pas mal d’emails fantaisistes pour les clients qui s’inscrivent.
Hors comme les modules sont ensuite envoyés par email, si celui du client ne correspond à rien aucune chance qu’il arrive au destinataire :/
Je souhaitais donc rajouter une règle de validation supplémentaire, pour ne pas autoriser les domaines emails : test.com, example.com …
Attention ce tutoriel s’applique si vous souhaitez ajouter des règles de validation sur les champs standards du formulaire de création de compte :
- Civilité
- Prénom
- Nom
- Mot de passe
- Date de naissance
Pour l’ajout de vos propres champs vous pouvez regarder le tutoriel ici : https://www.h-hennes.fr/blog/2017/10/10/prestashop-1-7-ajouter-des-champs-clients/
Analyse et identification de la procédure
Pour ajouter cette validation on va faire un module qui va utiliser le hook additionalCustomerFormFields
Qui contrairement à ce que son nom laisse penser, permets également de modifier les champs actuels du formulaire.
Puisque la liste des champs est passée par référence. ( cf. fichier classes/form/CustomerFormatter.php )
La validation des formulaires est faite par la vérification des « constraints » ajoutées à chaque champ dans la fonction \AbstractFormCore::validate
Comme c’est un tableau il est donc possible de rajouter nos propres contraintes.
Attention par contre car comme nous le voyons dans l’extrait ci-dessous la contraintes doit obligatoirement être une fonction de la classe Validate.
Il sera donc obligatoire de faire un override de la classe Validate dans notre module pour pouvoir y ajouter notre nouvelle fonction. ( Les overrides ne sont pas recommandés mais dans notre cas nous ajoutons juste une fonction donc ce n’est pas très grave )
Conception du module
A la suite de l’analyse précédente, nous avons tous les paramètres et nous pouvons maintenant créer un module pour répondre à ce besoin.
On va l’appeler hhcustomer
Voici le code du module global, qui va se contenter de rajouter une contraintes sur le champ email.
Mais la logique est la même pour n’importe quel champ.
<?php if (!defined('_PS_VERSION_')) { exit; } class Hhcustomer extends Module { public function __construct() { $this->name = 'hhcustomer'; $this->tab = 'others'; $this->version = '0.1.0'; $this->author = 'hhennes'; $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('HH customer'); $this->description = $this->l('Add email validation in customer form'); } /** * Installation du module * @return bool */ public function install():bool { if (!parent::install() || !$this->registerHook('additionalCustomerFormFields') ) { return false; } return true; } /** * Gestion des champs sur le formulaire client * * @param array $params * @return void */ public function hookAdditionalCustomerFormFields(array $params) :void { foreach ($params['fields'] as &$field) { /** @var FormField $field */ if ($field->getName() == 'email') { //Ajout de contraintes supplémentaires sur le champ //Le nom doit correspondre à une méthode de la classe \Validate de Prestashop //Il est donc nécessaire de faire un override de cette classe dans notre module pour le gérer $field->addConstraint('isCustomEmailValid'); } } } } |
En complément comme préciser plus haut nous allons devoir faire un override de la classe Validate pour ajouter notre fonction spécifique.
Voici donc le contenu à ajouter dans le fichier override/classes/Validate.php de notre module
Cette fonction ajoute donc des domaines emails invalides.
<?php class Validate extends ValidateCore { /** * Validation custom pour des emails * * @param string $email * @return bool */ public static function isCustomEmailValid($email) { $forbiddenEmailsDomains = [ 'test.com', 'yopmail.com', ]; return !preg_match('#@('.implode('|', $forbiddenEmailsDomains).')$#', $email); } } |
Après l’installation du module on peut voir que c’est bien fonctionnel, si je tente de m’inscrire avec une adresse email [email protected], j’ai bien un message d’erreur qui s’affiche.
Via cette approche il est donc relativement facile de rajouter des validations supplémentaires sur les champs du formulaire de création de compte 🙂
N’hésitez pas à partager vos customisations !