2010-08-13 23 views
2

Je dois configurer une validation pour un champ de formulaire basé sur une valeur d'un autre champ. Par exemple, si la profession est Docteur, alors la spécialité doit être vide ('') ou aucune ('aucune').Zend Framework: Validation conditionnelle

$professionOptions = array(
     ''  => 'Choose Profession', 
     'Dr.' => 'Dr.', 
     'zzz' => 'zzz', 
     'None' => 'None'); 
$this->validator->field('profession')->inArray(array_keys($professionOptions)) ->message('Invalid profession.'); 


$specialtySelectOptions = array(
      ''  => 'Choose Specialty', 
      'Heart' => 'Heart', 
      'Lungs' => 'Lungs', 
      'Feet' => 'Feet', 
      'Nose' => 'Nose'); 

De quoi dépends-je la profession?

$this->validator->field('specialty')->inArray(array_keys($specialtySelectOptions)) 
              ->message('Invalid salutation.'); 

Répondre

1

Je vais habituellement cette façon

$f = new My_Form(); 

if($f->isValid($_POST)) { 
    // extra validation 
    if($f->getValue('profession') === 'Dr.') { 
    $specialty = $f->getValue('specialty'); 
    if($specialty === '' || $specialty === 'none') { 
     $f->markAsError(); 
     $f->specialty->addError('error_msg'); 
    } 
    } 

    if(!$f->isErrors()) { 
    $f->save(); 
    } 
} 
5

Vous pouvez étendre la méthode isValid() dans votre classe de formulaire, par ex.

/** 
* @param array $data The data from the request to validate 
*/ 
public function isValid($data) 
{ 
    $this->checkSpecialityForProfession($data); 
    return parent::isValid($data) 
} 

protected function checkSpecialityForProfession($data) 
{ 
    if($data['profession'] === 'Dr.') { 
     $validator = new Zend_Validate_InArray(array(
      'Heart', 
      'Lungs', 
      'Feet', 
      'Nose', 
      ) 
     ); 

     $this->getElement('specialty')->addValidator($validator); 
    } 

}