Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Hello à tous
Oui c'est un peu intensif ces temps mais vous allez me permettre de décoller.
J'ai utilisé des formulaires avec les validateurs ça marche très bien.
Maintenant avant d'effectuer l'enregistrement dans ma base j'effectue une vérification pour par exemple contrôler si l'email existe déjà.
Si c'est le cas je veux que le controller puisse afficher une erreur dans le formulaire.
Si je fait ça par exemple (je sais pas si c'est juste de faire comme ça car je dois déjà faire un echo devant). Et bien l'erreur s'affiche mais je peux pas choisir ou il vient, actuellement il s'affiche directement au fond du formulaire. Personnellement j'aurais voulu qu'il s'affiche vers l'élément $email de mon formulaire.
echo $form->email->addError('déjà enregistré');
Et si je tente comme ça aucun message n'est affiché.
echo $form->email->setErrorMessages(array('déjà enregistré'));
Merci pour votre aide
Dernière modification par m1b (08-01-2010 11:07:41)
Hors ligne
Re
redéfini isValid dans ton formulaire et utilise Zend_Validate_Db_NoRecordExists pour l'unicité de ton email.
public function isValid($data) { }
Pour les autres, toujours dans la même méthode
$this->getElement('identifiant_de_ton_champ')->addError('ton_message');
Hors ligne
Reeee,
Super j'ai ajouté ça à mon formulaire et ça fonctionne.
Par contre on dirait qu'on est obligé d'ajouter un validator si on ne met que le "addError" le message ne s'affichera pas.
Et c'est très pratique le "Zend_Validate_Db_NoRecordExists", avant j'avais fait le processus avec un getRow. D'ailleur je me demandais si sur le fond au niveau des ressources ça valait la peine de faire bien attention entre : getRow / Find / ou encore faire la requête avec / $db->select /.
public function isValid($formData){ // Vérifie si un candidat avec cet email existe déjà $translate = Zend_Registry::get('Zend_Translate'); $this->getElement('email')->addValidator(new Zend_Validate_Db_NoRecordExists('candidats', 'email', array('field' => 'id', 'value' => $formData['email']))); $this->getElement('email')->addError($translate->_('msg_adresse_email_deja_enregistre')); return parent::isValid($formData); }
Dernière modification par m1b (08-01-2010 11:07:21)
Hors ligne
Par contre on dirait qu'on est obligé d'ajouter un validator si on ne met que le "addError" le message ne s'affichera pas.
Je ne suis pas sur que ton code soit bon là. Ton message s'affiche en fait tout le temps, essaye de tester en faisant une erreur sur un autre champ.
Si je ne me trompe pas, tu dois juste avoir à traduire ton message dans ton système de traduction, essaye d'enlever le addError, tu devrais avoir le message en anglais.
D'ailleur je me demandais si sur le fond au niveau des ressources ça valait la peine de faire bien attention entre : getRow / Find / ou encore faire la requête avec / $db->select /
Si j'ai compris ta question, ce dont je ne suis pas sur, sur le fond, ça permet d'optimiser.
Hors ligne
En fait je vois que si on fait juste comme ça il est capable de traduire automatiquement le message.
$this->getElement('email')->addError('msg_adresse_email_deja_enregistre');
Par contre si j'ai deux messages d'erreurs attribués au champ, mon ->addError les remplace tous bilan, j'ai 2 fois le même message d'erreur sur le même champ. (on dirait que certains l'on déjà rencontré voir ci-dessous)
http://www.z-f.fr/forum/viewtopic.php?id=1924
Oui pour le requêtes c'est vrai que c'est plus rapide de faire un getRow (c'est vite écrit) mais c'est moins optimisé, il faut limiter l'accès aux donnés à uniquement ce qu'on a besoin c'est ce que je vais faire
Dernière modification par m1b (08-01-2010 18:06:20)
Hors ligne
Je ne comprends pas ton problème, enfin je comprends ce qui s'affiche et ne devrait pas, mais je comprends pas pourquoi tu as 2 fois le même message ... et pourquoi il remplace tout ....
Normalement, avec le validateur Zend_Validate_Db_NoRecordExists, tu as déjà un message d'erreur intégré, donc, je ne comprends pas pourquoi tu en rajoutes 1 ...
Hors ligne
Oui tu as tout à fait raison le message est déjà intégré avec le validateur il suffit donc de faire ceci :
$this->getElement('email')->addValidator($emailExist = new Zend_Validate_Db_NoRecordExists('candidats', 'email', array('field' => 'id', 'value' => $formData['email']))); $emailExist->setMessage('msg_adresse_email_deja_enregistre');
Bon par contre je verrai quand j'en aurais besoin mais si on fait
$this->getElement('prenom')->addError('encore un message');
et que dans notre formulaire on a déjà plusieurs validateurs sur ce champ, le addError vient s'afficher deux fois à la place de $valid1 et $valid2, mais je verrais encore ça par la suite.
$prenom->addValidator($valid1) $prenom->addValidator($valid2)
Hors ligne
Pages: 1