{"id":2610,"date":"2023-01-23T10:03:01","date_gmt":"2023-01-23T08:03:01","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=2610"},"modified":"2023-03-16T21:32:50","modified_gmt":"2023-03-16T19:32:50","slug":"prestashop-ajouter-une-regle-de-validation-sur-un-champ-du-formulaire-de-creation-de-compte","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2023\/01\/23\/prestashop-ajouter-une-regle-de-validation-sur-un-champ-du-formulaire-de-creation-de-compte\/","title":{"rendered":"Prestashop : Ajouter une r\u00e8gle de validation sur un champ du formulaire de cr\u00e9ation de compte"},"content":{"rendered":"\n<p>\u00c7a fait quelques temps que je n&rsquo;avais pas publi\u00e9 de tutoriel g\u00e9n\u00e9rique sur Prestashop, mais celui-ci est parti du besoin suivant :<br \/><br \/>Sur ma boutique sur laquelle je propose des modules ( gratuit ) en t\u00e9l\u00e9chargement , j&rsquo;ai pas mal d&#8217;emails fantaisistes pour les clients qui s&rsquo;inscrivent.<br \/>Hors comme les modules sont ensuite envoy\u00e9s par email, si celui du client ne correspond \u00e0 rien aucune chance qu&rsquo;il arrive au destinataire :\/ <br \/>Je souhaitais donc rajouter une r\u00e8gle de validation suppl\u00e9mentaire, pour ne pas autoriser les domaines emails\u00a0 : test.com, example.com &#8230;<br \/><br \/>Attention ce tutoriel s&rsquo;applique si vous souhaitez ajouter des r\u00e8gles de validation sur les <strong>champs standards du formulaire de cr\u00e9ation de compte<\/strong> :<\/p>\n<ul>\n<li>Civilit\u00e9<\/li>\n<li>Pr\u00e9nom<\/li>\n<li>Nom<\/li>\n<li>Email<\/li>\n<li>Mot de passe<\/li>\n<li>Date de naissance<\/li>\n<\/ul>\n<p>Pour l&rsquo;ajout de vos propres champs vous pouvez regarder le tutoriel ici : <a title=\"Prestashop Ajouter des champs clients\" href=\"https:\/\/www.h-hennes.fr\/blog\/2017\/10\/10\/prestashop-1-7-ajouter-des-champs-clients\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.h-hennes.fr\/blog\/2017\/10\/10\/prestashop-1-7-ajouter-des-champs-clients\/<\/a><br \/><br \/><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"939\" height=\"606\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image.png\" alt=\"\" class=\"wp-image-2612\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image.png 939w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-300x194.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-768x496.png 768w\" sizes=\"auto, (max-width: 939px) 100vw, 939px\" \/><\/a><figcaption class=\"wp-element-caption\">Champs standards du formulaire de cr\u00e9ation de compte<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Analyse et identification de la proc\u00e9dure<\/h3>\n\n\n\n<p>Pour ajouter cette validation on va faire un module qui va utiliser le hook <strong>additionalCustomerFormFields<\/strong><br \/>Qui contrairement \u00e0 ce que son nom laisse penser, permets \u00e9galement de modifier les champs actuels du formulaire.<br \/>Puisque la liste des champs est pass\u00e9e par r\u00e9f\u00e9rence. ( cf. fichier classes\/form\/CustomerFormatter.php )<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"102\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-1-1024x102.png\" alt=\"\" class=\"wp-image-2620\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-1-1024x102.png 1024w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-1-300x30.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-1-768x77.png 768w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-1.png 1160w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ex\u00e9cution du hook avec passage de la liste des champs par r\u00e9f\u00e9rence.<\/figcaption><\/figure>\n\n\n\n<p>La validation des formulaires est faite par la v\u00e9rification des \u00ab\u00a0constraints\u00a0\u00bb ajout\u00e9es \u00e0 chaque champ dans la fonction <strong>\\AbstractFormCore::validate<\/strong><br \/>Comme c&rsquo;est un tableau il est donc possible de rajouter nos propres contraintes.<br \/><br \/>Attention par contre car comme nous le voyons dans l&rsquo;extrait ci-dessous la contraintes doit obligatoirement \u00eatre une fonction de la classe Validate.<br \/>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\u00e9s mais dans notre cas nous ajoutons juste une fonction donc ce n&rsquo;est pas tr\u00e8s grave )<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"224\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-2.png\" alt=\"\" class=\"wp-image-2621\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-2.png 630w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-2-300x107.png 300w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><figcaption class=\"wp-element-caption\">Ex\u00e9cution des contraintes de validation sur les champs<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Conception du module<\/h3>\n\n\n\n<p>A la suite de l&rsquo;analyse pr\u00e9c\u00e9dente, nous avons tous les param\u00e8tres et nous pouvons maintenant cr\u00e9er un module pour r\u00e9pondre \u00e0 ce besoin.<br \/>On va l&rsquo;appeler <strong>hhcustomer<\/strong><br \/>Voici le code du module global, qui va se contenter de rajouter une contraintes sur le champ<em> email.<\/em><br \/>Mais la logique est la m\u00eame pour n&rsquo;importe quel champ.<\/p>\n\n\n\n<pre lang=\"php\">\n\n<?php\n\nif (!defined('_PS_VERSION_')) {\n    exit;\n}\n\n\nclass Hhcustomer extends Module\n{\n    public function __construct()\n    {\n        $this->name = 'hhcustomer';\n        $this->tab = 'others';\n        $this->version = '0.1.0';\n        $this->author = 'hhennes';\n        $this->bootstrap = true;\n        parent::__construct();\n\n        $this->displayName = $this->l('HH customer');\n        $this->description = $this->l('Add email validation in customer form');\n    }\n\n    \/**\n     * Installation du module\n     * @return bool\n     *\/\n    public function install():bool\n    {\n        if (!parent::install()\n            || !$this->registerHook('additionalCustomerFormFields')\n        ) {\n            return false;\n        }\n\n        return true;\n    }\n\n    \/**\n     * Gestion des champs sur le formulaire client\n     *\n     * @param array $params\n     * @return void\n     *\/\n    public function hookAdditionalCustomerFormFields(array $params) :void\n    {\n        foreach ($params['fields'] as &$field) {\n            \/** @var FormField $field *\/\n            if ($field->getName() == 'email') {\n                \/\/Ajout de contraintes suppl\u00e9mentaires sur le champ\n                \/\/Le nom doit correspondre \u00e0 une m\u00e9thode de la classe \\Validate de Prestashop\n                \/\/Il est donc n\u00e9cessaire de faire un override de cette classe dans notre module pour le g\u00e9rer\n                $field->addConstraint('isCustomEmailValid');\n            }\n        }\n    }\n}\n\n<\/pre>\n\n\n\n<p>En compl\u00e9ment comme pr\u00e9ciser plus haut nous allons devoir faire un override de la classe Validate pour ajouter notre fonction sp\u00e9cifique.<br \/>Voici donc le contenu \u00e0 ajouter dans le fichier <em>override\/classes\/Validate.php<\/em> de notre module<br \/>Cette fonction ajoute donc des domaines emails invalides.<\/p>\n\n\n\n<pre lang=\"php\">\n\n<?php\nclass Validate extends ValidateCore\n{\n    \/**\n     * Validation custom pour des emails\n     *\n     * @param string $email\n     * @return bool\n     *\/\n    public static function isCustomEmailValid($email)\n    {\n        $forbiddenEmailsDomains = [\n            'test.com',\n            'yopmail.com',\n        ];\n        return !preg_match('#@('.implode('|', $forbiddenEmailsDomains).')$#', $email);\n    }\n}\n\n<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"493\" height=\"141\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-3.png\" alt=\"\" class=\"wp-image-2622\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-3.png 493w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2023\/01\/image-3-300x86.png 300w\" sizes=\"auto, (max-width: 493px) 100vw, 493px\" \/><\/a><figcaption class=\"wp-element-caption\">Le champ email est bien consid\u00e9r\u00e9 comme non valide<\/figcaption><\/figure>\n\n\n\n<p>Apr\u00e8s l'installation du module on peut voir que c'est bien fonctionnel, si je tente de m'inscrire avec une adresse email test@test.com, j'ai bien un message d'erreur qui s'affiche.<br \/>Via cette approche il est donc relativement facile de rajouter des validations suppl\u00e9mentaires sur les champs du formulaire de cr\u00e9ation de compte :)<br \/>N'h\u00e9sitez pas \u00e0 partager vos customisations !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c7a fait quelques temps que je n&rsquo;avais pas publi\u00e9 de tutoriel g\u00e9n\u00e9rique sur Prestashop, mais celui-ci est parti du besoin suivant : Sur ma boutique sur laquelle je propose des modules ( gratuit ) en t\u00e9l\u00e9chargement , j&rsquo;ai pas mal d&#8217;emails fantaisistes pour les clients qui s&rsquo;inscrivent.Hors comme les modules sont ensuite envoy\u00e9s par email, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[245,6],"tags":[382,547,483],"class_list":["post-2610","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","category-trucs-et-astuces","tag-customer","tag-form","tag-prestashop-1-7","prestashop-1-7","prestashop-8-0","prestashop-8-1"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/2610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=2610"}],"version-history":[{"count":5,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/2610\/revisions"}],"predecessor-version":[{"id":2624,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/2610\/revisions\/2624"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=2610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=2610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=2610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}