2016-08-24 4 views
1

J'ai un complexe Zend\Form avec plusieurs Fieldset s imbriqués. Maintenant, j'ai besoin de mettre en place une validation-Fieldset. Cela signifie que la règle de validation fait référence à plusieurs Element s de différents Fieldset s. La seule façon que j'ai trouvé pour faire cela, est d'implémenter cette validation dans MyForm#isValid(), puisque c'est l'endroit unique, où je peux accéder à tous les Fieldset.Comment ajouter un message d'erreur au formulaire dans Zend Framework 2?

MyForm extends Form 
{ 
    public function isValid() 
    { 
     $isFormValid = parent::isValid(); 
     $isCrossFieldsetVaidationOk = // my additional validation logic 
     return $isFormValid && $isCrossFieldsetVaidationOk; 
    } 
} 

Pas encore testé, mais cela fonctionnera. Le problème est dans l'ajout de messages d'erreur.

J'ai essayé

$this->setMessages(array_merge(
    $this->getMessages(), ['my new message']) 
); 

Mais cela ne fonctionne pas. Comment ajouter des messages d'erreur Form?

Répondre

2

Les messages d'erreur sont des liens vers les éléments du formulaire, pas directement vers le formulaire. Donc comme newage dit, vous devez définir le message pour un élément spécifique (donc sa réponse est valide et je l'ai upvoted :-)).

Mais comme vous Prolonge le formulaire, vous pouvez vous mettre en propre méthode de messages d'erreur directement sous la forme:

MyForm extends Form 
{ 

    protected $errorMessages = []; 

    public function isValid() 
    { 
     $isFormValid = parent::isValid(); 
     $isCrossFieldsetValidationOk = // your additional validation logic 

     if (!$isCrossFieldsetValidationOk) { 
      $this->addErrorMessage('Oh oh... Cross-fieldset validation error...'); 
     } 
     return $isFormValid && $isCrossFieldsetValidationOk; 
    } 

    public function addErrorMessage($text) 
    { 
     $this->errorMessages[] = $text ; 
     return $this; // For a fluent setter 
    } 

    public function getErrorMessages() 
    { 
     return $this->errorMessages ; 
    } 

    public function getMessages($elementName = null) 
    { 
     if ($elementName) { 
      $messages = parent::getMessages($elementName); 
     } else { 
      $messages = array_merge($this->getErrorMessages(), parent::getMessages($elementName)); 
     } 
     return $messages; 
    } 

} 
+0

Merci pour votre réponse! En fait, de cette façon, je peux faire mon formulaire enregistrer les "messages d'erreur de formulaire" et les récupérer. L'étape suivante consiste à les intégrer avec les messages 'Element's ', de sorte qu'ils soient affichés ensemble. Pour ce faire, le 'Element # getMessages (...)' doit être surchargé. Je vais prolonger votre réponse avec ça. Ou peut-être y a-t-il une meilleure solution? – automatix

2

Vous devez rejoindre un message pour un élément de forme.

$form->get('password')->setMessages(['Wrong password']); 
+0

Merci pour votre réponse! Mais ce n'est pas l'élément, c'est invalide, c'est une condition sur plusieurs 'Element's (dans différents' Fieldset's). Par exemple: Il y a plusieurs éléments 'foo'' (nous ne pouvons pas savoir combien, ils sont ajoutés dynamiquement) de différents 'Fieldset's. Au moins un 'foo' doit être défini/rempli. Un autre exemple: Il existe plusieurs éléments 'bar'. La somme de leurs valeurs doit être supérieure à "x". Dans les deux cas, la valeur de 'Element' elle-même ne peut pas être valide ou invalide. C'est pourquoi je cherche un moyen de définir une validation "à travers le' Fieldset's "et d'ajouter les messages directement au' Form'. – automatix

+0

@automatix Peut-être que ce lien vous aidera. http://circlical.com/blog/2015/7/6/zend-framework-2-forms-factories-inputfilters-and-hydration – newage

+0

C'est un joli tutoriel, mais il ne donne pas de réponse à ma question. – automatix