2015-12-01 1 views
0

J'essaie de rendre un formulaire en utilisant Nette\Forms où les types de champs sont stockés dans la base de données. Donc, selon que le champ est un e-mail ou une simple saisie de texte; le type de validation diffèrent comme suit:Définir la validation conditionnelle sur des méthodes chaînées dans des formulaires Nette

// For textbox  
$form->addText($field['name'], $field['label']) 
    ->setRequired('Enter your ' . $field['label']); 

// For Email 
$form->addText($field['name'], $field['label']) 
     ->setRequired('Enter your email') 
     ->addRule(FORM::EMAIL, 'Enter a valid email'); 

Si c'était un domaine que je pouvais le faire avec une si la condition, mais il y aura beaucoup plus de domaines et il semble juste impossible de le faire. Et comme il est une méthode enchaînée je ne peux pas briser les méthodes en mettant intermédiaire instruction if comme suit:

$form->addText($field['name'], $field['label']) 
     ->setRequired('Enter your email'); 
    if ($field['type'] == ['email']) { 
     $form->addRule(FORM::EMAIL, 'Enter a valid email'); 
    } 

Y at-il une meilleure façon d'y parvenir que d'utiliser des instructions conditionnelles pour chaque ensemble de règles?

Répondre

3

Vous appelez addRule() sur l'objet $form lui-même, et non la valeur renvoyée de l'appel $form->addText().

$name = $form->addText($field['name'], $field['label']) 
if ($field['type'] == ['email']) { 
    $name->setRequired('Enter your email') 
    ->addRule(FORM::EMAIL, 'Enter a valid email'); 
}