2010-08-03 5 views
0

Y at-il une bonne solution pour les conditions suivantes:Valider un ensemble de champs/groupe de champs dans le formulaire Zend

  • Un formulaire avec un champ pour le code postal et par défaut validateurs comme nombre, longueur, etc.
  • Après la soumission, le formulaire est vérifié par rapport à une base de données.
  • Si le code postal n'est pas unique, nous devons demander une ville.

Exemples:

Cas 1: code postal est unique dans Inscrit base de données. Tout va bien. Formulaire de processus

Cas 2: le code postal envoyé n'est pas unique. Ajouter un deuxième champ pour la ville au formulaire. Retournez à la forme.

Nous voulons gérer cela de manière générique (pas à l'intérieur d'un contrôleur). Nous avons besoin de cette logique pour beaucoup de formes. Nous avons d'abord pensé à l'ajouter à isValid() dans chaque formulaire ou écrire un validateur avec logique pour ajouter des champs au formulaire. Les sous-formulaires ne sont pas possibles pour nous, car nous en avons besoin pour différents champs (par exemple, nom et rue).

Répondre

2

Actuellement, j'utilise la méthode isValid dans mes formulaires pour un formulaire utilisateur afin de vérifier le mot de passe et de confirmer le mot de passe. En outre, lorsque le formulaire est affiché dans une nouvelle action, il n'y a pas de modifications, mais lorsqu'il est affiché dans une action d'édition, un nouveau champ est ajouté au formulaire.

Je pense que c'est une bonne option de travailler sur la méthode isValid et d'ajouter le champ lorsque la validation retourne false, et si vous voulez quelque chose de plus maintenable, vous devez écrire votre propre validateur à cet effet.

Jetez un oeil à mon code:

class Admin_Form_User extends Zf_Form 
{ 
    public function __construct($options = NULL) 
    { 
     parent::__construct($options); 
     $this->setName('user'); 

     $id = new Zend_Form_Element_Hidden('id'); 

     $user = new Zend_Form_Element_Text('user'); 
     $user->setLabel('User:') 
     ->addFilter('stripTags') 
     ->addFilter('StringTrim') 
     ->setAllowEmpty(false) 
     ->setRequired(true); 

     $passwordChange = new Zend_Form_Element_Radio('changePassword'); 
     $passwordChange->setLabel('Would you like to change the password?') 
     ->addMultiOptions(array(1 => 'Sim', 2 => 'Não')) 
     ->setValue(2) 
     ->setSeparator(''); 

     $password = new Zend_Form_Element_Password('password'); 
     $password->setLabel('Password:') 
     ->addFilter('stripTags') 
     ->addFilter('StringTrim') 
     ->setRequired(true); 

     $confirm_password = new Zend_Form_Element_Password('confirm_password'); 
     $confirm_password->setLabel('Confirm the password:') 
     ->addFilter('stripTags') 
     ->addFilter('StringTrim') 
     ->addValidator('Identical') 
     ->setRequired(true); 

     $submit = new Zend_Form_Element_Submit('submit'); 
     $submit->setLabel('Save'); 

     $this->addElements(array($id,$name,$lastname,$group,$user,$passwordChange,$password,$confirm_password,$submit)); 

     $this->addDisplayGroup(array('password','confirm_password'),'passwordGroup'); 
     $this->submit->setOrder(8); 

     $this->setDisplayGroupDecorators(array(
      'FormElements', 
      array('HtmlTag', array('tag' => 'div','id' => 'div-password')) 
      ) 
     ); 

     $passwordChange->clearDecorators(); 

    } 

    public function addPasswordOption() 
    { 
     $this->changePassword->loadDefaultDecorators(); 

     $this->getDisplayGroup('passwordGroup') 
     ->addDecorators(array(
      array('HtmlTag', array('tag' => 'div','id' => 'div-password')) 
      ) 
     ); 

     $this->password->setRequired(false); 
     $this->confirm_password->setRequired(false); 
    } 

    public function setPasswordRequired($flag = true) 
    { 
     $this->password->setRequired($flag); 
     $this->confirm_password->setRequired($flag); 
    } 

    public function isValid($data) 
    { 
     $confirm = $this->getElement('confirm_password'); 
     $confirm->getValidator('Identical')->setToken($data['password']); 
     return parent::isValid($data); 
    } 

} 

Ainsi, dans mon contrôleur:

public function newAction() 
    { 
     $this->view->title = "New user"; 
     $this->view->headTitle($this->view->title, 'PREPEND'); 

     $form = $this->getForm(); 

     if($this->getRequest()->isPost()) 
     { 
      $formData = $this->_request->getPost(); 

      if($form->isValid($formData)) 
      { 
       $Model = $this->getModel(); 
       $id = $Model->insert($formData); 

       $this->_helper->flashMessenger('The user data has beed updated.'); 
       $this->_helper->redirector('list'); 
      } 
     } 

     $this->view->form = $form; 
    } 

    public function editAction() 
    {  
     $this->view->title = "Edit user"; 
     $this->view->headTitle($this->view->title, 'PREPEND'); 

     $id = $this->getRequest()->getParam('id'); 

     $form = $this->getForm(); 

     // Add yes or no password change option 
     $form->addPasswordOption(); 

     $Model = $this->getModel(); 

     if($this->getRequest()->isPost()) 
     { 
      $formData = $this->getRequest()->getPost(); 

      // Change password? 
      if($formData['changePassword'] == 2) $form->setPasswordRequired(false); 

      if($form->isValid($formData)) 
      { 
       $Model->update($formData); 

       $this->_helper->flashMessenger('The user data has beed updated.'); 
       $this->_helper->redirector('list'); 
      } 

     } 

     $data = $Model->getById($id)->toArray(); 

     $form->populate($data); 

     $this->view->form = $form; 
    } 
1

Vous aurez probablement besoin d'un validateur de formulaire Javascript pour cela. Dans la fonction submit, effectuez un appel AJAX pour vérifier si le code postal est unique. Si ce n'est pas le cas, affichez un champ de ville supplémentaire.

Mais vous devez encore effectuer le côté serveur de validation: ne faites jamais confiance aux entrées utilisateur, même si elles sont validées côté client.

Questions connexes