Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
j'utilise déjà des validateurs personnels pour comparer des dates de façon compliquée par exemple.
Mais dans le cas présent, j'aurais "tout simplement" besoin d'interdire un certain type d'e-mail (appartenant à un domaine précis) dans un champ de mon formulaire d'inscription.
Exemple, tous les e-mails de la forme quelquechose@domaineinterdit.fr, quel que soit ce "quelquechose" devrait renvoyer une erreur.
Dois-je faire mon propre validateur ou bien y a-t-il un moyen de la faire avec les validateurs de Zend ?
regex fonctionne bien (avec par exemple ->addValidator('regex', true, array('/^[a-z_0-9]*@domaineinterdit.fr/i')) ), mais pour accepter les e-mails de cette forme, pas pour les empêcher !
Il me faudrait un non-regex en gros.
Merci.
Dernière modification par gmifsud (09-02-2012 14:27:26)
Hors ligne
Je suis pas doué du tout en regex mais tu dois pouvoir spécifié que tu ne veux pas que la chaîne 'domaineinterdit.fr' soit contenu dans l’intégralité de la chaîne.
Sinon un validateur serait plus simple, tu fais un truc générique qui reçoit en params un tableau de nom de domaine interdit.
Hors ligne
J'ai eu besoin de faire cela dans un de mes projets. J'avais donc récupéré (ou fait, je ne sais plus) un validateur.
[lang=php] <?php class My_Validate_BanEmail extends Zend_Validate_Abstract { const BAD_EMAIL = 'badEmail'; protected $_messageTemplates = array( self::BAD_EMAIL => "Using '%value%' is forbidden" ); protected $_patterns = array( '/.@gmail.*$/', '/.@yahoo.*$/', '/.@hotmail.*$/' ); /** * @param array $patterns * @return My_Validate_BanEmail */ public function setPatterns($patterns) { if (is_array($patterns)) { $this->_patterns = $patterns; return $this; } $this->_patterns = array($patterns); return $this; } /** * @return array */ public function getPatterns() { return $this->_patterns; } public function isValid($value) { $this->_setValue($value); foreach ($this->getPatterns() AS $pattern) { if (preg_match($pattern, $value)) { $this->_setValue(preg_replace('/.*@/', '', $value)); $this->_error(self::BAD_EMAIL); return false; } } return true; } }
Ensuite, lors de la création de ton formulaire, voici un exemple :
[lang=php] $bansMails = new My_Validate_BanEmail(); $bansMails->setPatterns(array( "/.*@domaineinterdit\.fr/", "/.*p0rn.*@.*/", "/truc@bidule\..*/" )); $this->addElement("text", "email", array( "label" => "E-Mail", "required" => true, "filters" => array("StringTrim"), "validators" => array($bansMails) ));
Tu peux supprimer les masques non utilisés et ne garder que le tien. L'utilisation est très simple.
Dernière modification par Blount (09-02-2012 10:17:43)
Hors ligne
Merci beaucoup Blount. J'ai utilisé et ton code et ça fonctionne à merveille.
Tu m'as évité la tâche de l'écrire moi-même et fait gagner un temps précieux, surtout en ce moment !
Merci pour le conseil shadypierre, mais je vais utiliser la solution de Blount plutôt que de me plonger dans les méandres des expressions régulières (que j'apprécie par ailleurs, mais là je n'ai pas le temps).
Hors ligne
Mon conseil c'était plutot exactement ce que dit Blount
Sinon un validateur serait plus simple, tu fais un truc générique qui reçoit en params un tableau de nom de domaine interdit.
c'est exactement ce que fait le validateur fournit
Hors ligne
Exact.
Je m'étais concentré sur ta première phrase, MEA CULPA.
Merci du conseil, donc.
Hors ligne
Pages: 1