Voici mon saveAction
code (où le formulaire transmet les données)
public function saveAction()
{
$user = OBUser();
$form = $this->createForm(new OBUserType(), $user);
if ($this->request->getMethod() == 'POST')
{
$form->bindRequest($this->request);
if ($form->isValid())
return $this->redirect($this->generateUrl('success_page'));
else
return $this->redirect($this->generateUrl('registration_form'));
} else
return new Response();
}
Ma question est: comment puis-je obtenir les erreurs en cas de $form->isValid()
retour false
?
error_bubbling
sur true dans votre type de formulaire en définissant explicitement l'option pour chaque champ.$form->getErrors(true)
inclure les erreurs des formulaires enfantsSymfony 2.3 / 2.4:
Cette fonction récupère toutes les erreurs. Celles du formulaire telles que "Le jeton CSRF n'est pas valide. Veuillez réessayer de soumettre le formulaire." ainsi que des erreurs supplémentaires sur les enfants du formulaire qui n'ont pas de bouillonnement d'erreur.
Pour obtenir toutes les erreurs sous forme de chaîne:
Symfony 2.5 / 3.0:
Docs:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (à le fond:
The method Form::getErrorsAsString() was removed
)la source
$errors[$child->getName()] = $this->getErrorMessages($child);
lançait une exception, car getErrorMessages était absent du composant Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller . Alors je l'ai remplacé par$form_errors[$child->getName()] = $child->getErrorsAsString();
$this->getErrorMessages()
et je pensais que c'était appelé directement dans un contrôleur et une partie de l'api Symfony.Voici la solution qui a fonctionné pour moi. Cette fonction se trouve dans un contrôleur et renverra un tableau structuré de tous les messages d'erreur et du champ qui les a provoqués.
Symfony 2.0:
Symfony 2.1 et plus récent:
la source
$this->getFormErrors
doit être$this->getErrorMessages
dans votre échantillon Symfony2.1Utilisez le validateur pour obtenir les erreurs pour une entité spécifique
Référence API:
la source
Pour obtenir des messages corrects (traduisibles), en utilisant actuellement SF 2.6.3, voici ma dernière fonction (car aucune de celles ci-dessus ne semble plus fonctionner):
car la méthode Form :: getErrors () retourne maintenant une instance de FormErrorIterator , sauf si vous changez le deuxième argument ($ flatten) sur true . (Il renverra ensuite une instance FormError , et vous devrez appeler la méthode getMessage () directement, sans la méthode current ():
)
Le plus important est en fait de définir le premier argument sur true afin d'obtenir les erreurs. Laisser le deuxième argument ($ flatten) à sa valeur par défaut ( true ) renverra des instances FormError , tandis qu'il renverra des instances FormErrorIterator lorsqu'il est défini sur false.
la source
Pour mes messages flash, j'étais content
$form->getErrorsAsString()
Edit (à partir de Benji_X80): Pour une utilisation SF3
$form->getErrors(true, false);
la source
This method should only be used to help debug a form.
( source )La fonction pour symfony 2.1 et plus récent, sans aucune fonction obsolète:
la source
IF
déclaration? Pourquoi s'exclut-il mutuellement? Autant que je sache: la forme peut avoir ses propres erreurs ainsi que des enfants.Messages d'erreur de forme traduite (Symfony2.1)
J'ai beaucoup de mal à trouver ces informations, donc je pense qu'il vaut vraiment la peine d'ajouter une note sur la traduction des erreurs de formulaire.
@Icode4food
answer renverra toutes les erreurs d'un formulaire. Cependant, le tableau renvoyé ne prend en compte ni la pluralisation ni la traduction des messages .Vous pouvez modifier la boucle de
@Icode4food
réponse foreach pour avoir un combo:C'est ici:
Cette réponse a été élaborée à partir de 3 articles différents:
la source
Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()
. Je soupçonne que c'est pour Symfony 2.1 uniquement?SYMFONY 3.X
Les autres méthodes SF 3.X données ici ne fonctionnaient pas pour moi car je pouvais soumettre des données vides au formulaire (mais j'ai des contraintes NotNull / NotBlanck). Dans ce cas, la chaîne d'erreur ressemblerait à ceci:
Ce qui n'est pas très utile. Alors j'ai fait ceci:
Ce qui rendrait cela:
la source
Vous pouvez également utiliser le service de validation pour obtenir des violations de contraintes:
la source
Messages d'erreur de forme traduite (Symfony2.3)
Ma version de la résolution du problème:
/src/Acme/MyBundle/Resources/config/services.yml
/src/Acme/MyBundle/Form/FormErrors.php
/src/Acme/MyBundle/Controller/DefaultController.php
Dans Symfony 2.5, vous pouvez obtenir toutes les erreurs de champs très facilement:
la source
Pour Symfony 3.2 et supérieur, utilisez ceci,
Utilisez str_replace si vous voulez vous débarrasser du texte ennuyeux « Erreur: » dans chaque texte de description d'erreur.
la source
Si vous utilisez des validateurs personnalisés, Symfony ne renvoie pas les erreurs générées par ces validateurs dans
$form->getErrors()
.$form->getErrorsAsString()
renverra toutes les erreurs dont vous avez besoin, mais sa sortie est malheureusement formatée sous forme de chaîne, pas de tableau.La méthode que vous utilisez pour obtenir toutes les erreurs (quelle que soit leur origine) dépend de la version de Symfony que vous utilisez.
La plupart des solutions suggérées impliquent la création d'une fonction récursive qui analyse tous les formulaires enfants et extrait les erreurs pertinentes dans un tableau. Symfony 2.3 n'a pas la
$form->hasChildren()
fonction, mais c'est le cas$form->all()
.Voici une classe d'assistance pour Symfony 2.3, que vous pouvez utiliser pour extraire toutes les erreurs de n'importe quelle forme. (Il est basé sur le code d'un commentaire de yapro sur un ticket de bogue associé dans le compte github de Symfony.)
Indicatif d'appel:
la source
Sur la base de la réponse de @Jay Seth, j'ai créé une version de la classe FormErrors spécialement pour Ajax Forms:
Utilisation (par exemple dans votre action):
Version de Symfony: 2.8.4
Exemple de réponse JSON:
L'objet d'erreur contient le champ "clé", qui est l'identifiant de l'élément DOM d'entrée, de sorte que vous pouvez facilement remplir les messages d'erreur.
Si vous avez des formulaires enfants dans le parent, n'oubliez pas d'ajouter l'
cascade_validation
option à l'intérieur du formulaire parentsetDefaults
.la source
Pour Symfony 2.1 et versions ultérieures à utiliser avec l'affichage des erreurs Twig, j'ai modifié la fonction pour ajouter un FormError au lieu de simplement les récupérer, de cette façon vous avez plus de contrôle sur les erreurs et n'avez pas à utiliser error_bubbling sur chaque entrée individuelle. Si vous ne le définissez pas de la manière ci-dessous, {{form_errors (form)}} restera vide:
la source
$ form-> getErrors () fonctionne pour moi.
la source
J'ai trouvé cette solution. Il fonctionne parfaitement avec le dernier Symfony 2.4 .
Je vais essayer de donner quelques explications.
Utilisation d'un validateur séparé
Je pense que c'est une mauvaise idée d'utiliser une validation séparée pour valider les entités et renvoyer des messages de violation de contrainte, comme suggéré par d'autres auteurs.
Vous aurez besoin de valider manuellement toutes les entités, de spécifier des groupes de validation, etc.
De cette façon, vous validerez le formulaire deux fois: une fois avec le formulaire et une fois avec un validateur séparé. C'est une mauvaise idée du point de vue des performances.
Je suggère d'itérer récursivement le type de formulaire avec ses enfants pour collecter les messages d'erreur.
Utilisation de certaines méthodes suggérées avec une instruction IF exclusive
Certaines réponses suggérées par d'autres auteurs contiennent des instructions IF mutuellement exclusives comme celle-ci:
if ($form->count() > 0)
ouif ($form->hasChildren())
.Autant que je sache, chaque formulaire peut avoir des erreurs aussi bien que des enfants. Je ne suis pas expert avec le composant Symfony Forms , mais dans la pratique, vous n'obtiendrez pas d'erreurs du formulaire lui-même, comme une erreur de protection CSRF ou des champs supplémentaires erreur de . Je suggère de supprimer cette séparation.
Utilisation de la structure de résultat dénormalisée
Certains auteurs suggèrent de mettre toutes les erreurs dans un tableau simple. Ainsi, tous les messages d'erreur du formulaire lui-même et de ses enfants seront ajoutés au même tableau avec différentes stratégies d'indexation: basé sur le nombre pour les propres erreurs du type et basé sur le nom pour les erreurs enfants. Je suggère d'utiliser la structure de données normalisée du formulaire:
De cette façon, le résultat peut être facilement réitéré plus tard.
Ma solution
Voici donc ma solution à ce problème:
J'espère que ça aidera quelqu'un.
la source
SYMFONY 3.1
J'ai simplement implémenté une méthode statique pour gérer l'affichage des erreurs
En espérant aider
la source
Symfony 3 et plus récent
J'ai récemment créé une fonction qui crée un arbre d'erreurs de forme. Cela sera utile pour renvoyer la liste des erreurs au front-end. Ceci est basé sur des types de formulaires ayant:
Code:
Production:
Remarque : je sais que les erreurs des champs de niveau plus profond peuvent être écrasées si le niveau supérieur contient des erreurs, mais c'est exprès pour mon utilisation.
la source
Pour Symfony 2.1:
Voici ma solution finale en rassemblant de nombreuses autres solutions:
la source