我使用symfony 2,我有一個窗體,我把@Assert \ NotBlank()註釋。 我自動填充字段,我的表單不通過isValid和isSubmitted測試,並在這些行後我得到一個非null值爲退出(var_dump($ recipeForm-> getErrors()));symfony2:表單錯誤不顯示在樹枝儘管非空getErrorsAsString()
private 'errors' =>
array (size=4)
0 =>
object(Symfony\Component\Form\FormError)[4119]
private 'message' => string 'Cette valeur doit être vide.' (length=29)
protected 'messageTemplate' => string 'This value should be blank.' (length=27)
protected 'messageParameters' =>
array (size=1)
...
protected 'messagePluralization' => null
private 'cause' =>
object(Symfony\Component\Validator\ConstraintViolation)[4062]
...
private 'origin' => null
在我的樹枝模板中,我使用簡單的表單(表單)渲染表單。 form_errors(form)或form_errors(form.field)不會顯示錯誤。爲什麼?爲什麼我可以進一步瞭解問題來自哪裏?
我有一個非常複雜的類型。對於我網站的其他形式,這些錯誤是正確顯示的。 我喜歡的類型:
<?php
//src/AppBundle/Form/FoodAnalytics/RecipeType.php
namespace AppBundle\Form\FoodAnalytics;
use AppBundle\Form\Core\MediaType;
use AppBundle\Repository\FoodAnalytics\UnitRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class RecipeType extends AbstractType
{
protected $recipeIngredientQueryBuilder;
protected $recipeSubrecipeQueryBuilder;
protected $unitRepository;
protected $action;
/**
* @return string
*/
public function getName()
{
return 'appbundle_foodanalytics_recipe' . $this->action;
}
public function __construct(UnitRepository $unitRepository, $recipeIngredientQueryBuilder=null, $recipeSubrecipeQueryBuilder=null, $action = null)
{
$this->recipeIngredientQueryBuilder = $recipeIngredientQueryBuilder;
$this->recipeSubrecipeQueryBuilder = $recipeSubrecipeQueryBuilder;
$this->unitRepository = $unitRepository;
$this->action = $action == null ? null : '_' . $action;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('recipeCategories', 'genemu_jqueryselect2_entity',array(
'multiple' => true,
'class' => 'AppBundle:FoodAnalytics\RecipeCategory',
'label' => 'Catégories',
'required' => false,
'by_reference' => false,
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Indiquez les catégories dans lesquelles enregistrer la recette pour un recherche future plus facile",
)))
->add('isProduct', null, array(
'label'=>'Correspond à un produit fini',
'required'=>false,
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"La recette correspond-elle à un produit fini qui peut être mis en vente ?",
)))
->add('name', null, array(
'label'=>'Nom détaillé',
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Indiquez le nom détaillé de la recette. Par exemple : 'millefeuilles praliné ganache vanille sur feuilletage inversé'",
)))
->add('nickName', null, array(
'label'=>'Nom raccourci',
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Indiquez un nom raccourci pour la recette. Par exemple : 'millefeuilles'",
)))
->add('recipeIngredients', 'collection', array(
'type' => new RecipeIngredientType($this->unitRepository, $this->recipeIngredientQueryBuilder),
'by_reference' => false,
'label'=>'Ingrédient',
'allow_add' => true,
'allow_delete' => true,
'cascade_validation' => true,
))
->add('subrecipes', 'collection', array(
'type' => new RecipeSubrecipeType($this->unitRepository, $this->recipeSubrecipeQueryBuilder),
'by_reference' => false,
'label'=>'Sous-recette',
'allow_add' => true,
'allow_delete' => true
))
->add('recipeSteps', 'collection', array(
'type' => new RecipeStepType(),
'by_reference' => false,
'label'=>'Etape de production',
'allow_add' => true,
'allow_delete' => true
))
->add('portions', null, array(
'label'=>'Nombre de parts/de pièces',
'required' => false,
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Indiquez le nombre d'éléments disponibles dans la recette. Cela peut permettre d'utiliser l'unité 'U' dans les recettes parentes qui l'utiliseront",
)))
->add('shortDescription', null, array(
'label'=>'Description courte',
'required'=>false,
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Décrivez succinctement la recette",
)))
->add('medias', 'collection', array(
'type' => new MediaType(),
'by_reference' => false,
'label'=>'Medias',
'allow_add' => true,
'allow_delete' => true,
'required' => false,
'attr'=>array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Ajoutez des images ou vidéos pour décrire la recette",
)))
->add('content', 'textarea', array(
'label'=>'Instructions générales',
'required'=>false,
'attr' => array(
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'class' => 'summernote',
'title'=>"Ajoutez du contenu supplémentaire pour détailler la recette",
)))
->add('workingDuration', 'timepicker', array(
'label'=>'Temps total de travail',
'required' => false,
'attr'=>array
(
'class' => 'timepicker',
'data-toggle'=>"tooltip",
'data-placement'=>"top",
'title'=>"Indiquez le temps total de travail consacré à la recette si il diffère du temps de travail cumulé des étapes de production",
)))
->add('sleepDuration', 'timepicker', array(
'label'=>'Temps total de repos',
'required' => false,
'attr'=>array
(
'data-toggle'=>"tooltip",
'class'=>'timepicker',
'data-placement'=>"top",
'title'=>"Indiquez le temps total de repos consacré à la recette si il diffère du temps de repos cumulé des étapes de production",
)))
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\FoodAnalytics\Recipe',
// 'cascade_validation' => true,
));
}
}
編輯:保持這種形式只有一個簡單的現場並不能改變什麼,錯誤將不會顯示
好吧,錯誤實際上是由添加到配方類型的字段引起的,並且我知道哪一個是我自願將其錯誤地放入。 form-> geterrorsasstring顯示正確的錯誤,但不顯示樹枝模板,這是奇怪的部分。 –