Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'ai besoin d'aide sur un cas pratique dans un formulaire.
Mon formulaire comporte deux champs "email de contact" et "email du commercial", j'aimerais faire en sorte qu'au moins un des deux champs soit rempli.
Comment déclarer ça proprement directement avec des validateurs dans mon formulaire.
Merci.
Dernière modification par Roulio (23-06-2008 12:01:23)
Hors ligne
en faisant deux champs séparés, je ne pense pas que cela soit possible
Par contre, tu peut peut etre essayer de le faire sur un champ(enfin 2 )
En gros 1er champ :
<input type='text' name='mail[1]'>
et le deuxieme :
<input type='text' name='mail[2]'>
Comme ca tu aura qu'une seule chose à vérifier, le 'mail'
Si il n'est pas vide, alors ca veux dire qu'au moins un des mails a été validé
Mais apres pr vérif la conformité des adresses ....
Hors ligne
Tu peux créer ton propre validateurs qui verifie ca a ta place ( etends Zend_Validate_Abstract ). Va voir la maniere dont sont fait les validateurs (Zend/Validate/...).
Tu dois avoir toutes les cartes en mains pour le faire
Hors ligne
ok c'est noté.
J'attends de voir si y a d'autres possibilités. Comme tout le formulaire est gérer par zend_form, j'aimerais quelque chose avec zend_validate... mais j'ai aucune idée si ça existe.
Est-ce que c'est possible en créant comme un validateur de formulaire ou quelquechose qui y ressemble ?
*** @ ndesaleux : t'es plus rapide ; )
ok je vais y jeter un oeil merci
Dernière modification par Roulio (20-06-2008 11:14:40)
Hors ligne
Je tourne en rond...
après quelque recherche je suis tombé sur ces différents articles :
- http://devzone.zend.com/article/3450-De … -Zend_Form
- http://cogo.wordpress.com/2008/04/16/cu … m_element/
- http://www.nabble.com/Zend_Form-equal-inputs-(strings)-validation-td15215166.html
Je part du principe qu'un des deux champs est aux obligatoire (ici poste_email)
J'ai donc déclaré dans ma classe (qui créé mon formulaire)
... /* Email du commercial */ $poste_commercial_mail = new Zend_Form_Element_Text('poste_commercial_mail'); $poste_commercial_mail->setLabel('Email du commercial'); $poste_commercial_mail->addValidator('EmailAddress', true, array( 'message' => array ( 'test'=>Zend_Validate_EmailAddress::INVALID) )); $this->addElement($poste_commercial_mail); ... $poste_email = new Zend_Form_Element_Text('poste_email'); $poste_email->setLabel('Email de contact'); $poste_email->addValidator('EmailAddress', true, array( 'message' => array ( 'test'=>Zend_Validate_EmailAddress::INVALID) )); $valid = new Mylib_Validate_AtLeastThisField('poste_commercial_mail'); $poste_email->addValidator($valid); $this->addElement($poste_email);
et mon validateur : dans Mylib/Validate/AtLeastThisField.php
<?php require_once 'Zend/Validate/Abstract.php'; class Mylib_Validate_AtLeastThisField extends Zend_Validate_Abstract { protected $_contextKey; const BOTH_EMPTY = 'bothFieldEmpty'; const FIELD_NOT_FOUND = 'confirmationNotFound'; protected $_messageTemplates = array( self::BOTH_EMPTY => 'Both field are empty', self::FIELD_NOT_FOUND => 'No field check was submitted' ); /** * Constructor of this validator * * The argument to this constructor is the third argument to the elements' addValidator * method. * * @param array|string $fieldsToMatch */ public function __construct($contextKey) { $this->_contextKey = $contextKey; } /** * Check if the element using this validator is valid * * This method will compare the $value of the element to the other elements * it needs to match. If they all match, the method returns true. * * @param $value string * @param $context array All other elements from the form * @return boolean Returns true if the element is valid */ public function isValid($value, $context = null) { if ((null === $context) || !is_array($context) || !array_key_exists($this->_contextKey, $context)) { $this->_error(self::FIELD_NOT_FOUND); return false; } $fieldValue = $context[$this->_contextKey]; if (empty($value) && empty($fieldValue)) { $this->_error(self::BOTH_EMPTY); return false; } return true; } }
rien n'y fait je n'ai jamais de message d'erreur. Même si je copie/colle le validateur NotEmpty dans ce fichier (histoire de tester avec un validateur exitant) je n'ai pas de message d'erreur de ce validateur. Pourtant je reçoit les messages des autres validateurs
Hors ligne
Essaie de regarder du coté de http://framework.zend.com/manual/en/zen … nds.fields
Il parle de comment faire pour valider qu'un mot de passe ou autre chose a été saisi deux fois pareils en reposant sur le StringEquals. Tu pourrais te baser sur le meme principe.
Dernière modification par cortex (20-06-2008 14:52:02)
Hors ligne
Bonjour,
je vous apporte la solution (très simple finalement) que j'ai trouvé.
En utilisant la création perso de validateur, je n'arrive pas à afficher les messages d'erreurs quand le champ n'est pas rempli. Par contre quand le champ est rempli il m'affiche bien les messages.
J'ai donc regardé du côté de setRequired qui lui détecte si un champ est envoyé dans le formulaire.
Et la solution se trouve dans le controlleur. j'ai donc :
// Envoie du formulaire if ($this->getRequest()->isPost()) { $formData = $this->_request->getPost(); // Récupère les données envoyées if($form->getValue('poste_commercial_mail')== ''){ $form->poste_email->setRequired(true); } // ajout du validateur si le champ 'poste_commercial_mail' est vide.
Magique ! J'ai bien ce que je voulais au début c'est à dire au moins le champ 'poste_email' de rempli si 'poste_commercial_mail' est vide.
a++
Dernière modification par Roulio (23-06-2008 12:01:53)
Hors ligne
Pages: 1