2014-12-23 17 views
5

Sto utilizzando symfony 2 e ho un modulo su cui ho inserito annotazioni @Assert \ NotBlank(). Sto volontariamente riempiendo i campi, il mio modulo non supera il test isValid e isSmitted e dopo quelle righe ottengo un valore non nullo per exit (var_dump ($ recipeForm-> getErrors()));symfony2: errori di modulo non visualizzati nel ramoscello nonostante un valore non zero 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 

Nel mio modello di ramoscello viene visualizzato il modulo con un modulo semplice (modulo). form_errors (form) o form_errors (form.field) non renderanno gli errori. Perché? Perché potrei fare per capire ulteriormente da dove viene il problema?

Ho un tipo piuttosto complicato. per alcune altre forme del mio sito Web, gli errori vengono visualizzati correttamente. mio tipo:

<?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, 
     )); 
    } 
} 

EDIT: mantenere un solo campo semplice di questa forma non cambia nulla, l'errore non verrà mostrato

risposta

0

sembra che l'errore è causato da una regola di convalida su una proprietà fa parte della tua entità Recipe ma non è stata aggiunta a RecipeType quindi l'errore non può essere collegato a nessuna sottomaschera.

provare a controllare la vostra impresa e trovare quale struttura dispone di regola di convalida e non aggiunto al RecipeType o aggiungere un valore predefinito per la proprietà o l'uso Validation Groups

+0

beh, l'errore è in realtà causato da un campo aggiunto al tipo di destinatario, e so qual è il campo in cui mi sbaglio volontariamente. Il form-> geterrorsasstring visualizza l'errore giusto ma non il modello di ramoscello, questa è la parte strana. –

6

Date un'occhiata a come gli errori sono resi qui: http://symfony.com/doc/current/cookbook/form/form_customization.html#customizing-error-output

Il problema con l'utilizzo di {{ form_errors(form) }} è che visualizza errori di modulo globali, non singoli campi, mentre getErrorsAsString() esegue il drill-down in tutti i campi. Se si desidera che tutti i singoli errori di campo siano accessibili tramite {{ form_errors(form) }}, è necessario modificare ogni singolo campo nel modulo e aggiungere l'opzione error_bubbling => true.

Se non si imposta l'errore bubbling su true su tutti i nostri campi, sarà necessario eseguire il rendering singolarmente di ogni errore di campo, ad esempio: {{ form_errors(form.name) }}, o semplicemente utilizzando {{ form_row(form.name) }} che esegue il rendering dell'etichetta, dell'elemento modulo e errori tutti in un colpo.

+1

Sfortunatamente, error_bubbling => true non funziona. Se sto visualizzando il modulo con form (form) o form_errors (form.field) o form_row (form.field), non cambia nulla. Ho anche un dump vuoto per quei valori mentre getErrorsAsString non è vuoto. Alcune altre forme sul mio sito stanno funzionando bene ... Sai come seguire gli errori da dove sono stati catturati dove sono visualizzati? Penso di aver bisogno di trucchi di debug aggiuntivi ... –

+0

Ti sei assicurato di mettere 'error_bubbling => true' su ogni singolo campo? Quando ho iniziato con i moduli Symfony ho pensato che avrei potuto impostare questa opzione per l'intero modulo, ma non è così. Deve essere per campo. Forse potresti pubblicare la configurazione in cui hai aggiunto l'errore bubbling, oltre al tuo codice Twig per la visualizzazione del modulo? –

+0

beh, se metto error_bubbling su nickName e metto anche un Assert \ NotBlank(), ottengo lo stesso risultato: nessun errore mostra ma posso vedere l'errore nel getErrorsAsString. Metterò un esempio di errore di forma più semplice per cercare di restringerlo verso il basso –

3

Ah mio dio!

Mi dispiace di aver fatto perdere tempo a questa gente! Il problema era che stavo passando come risposta una matrice $response = array(form->createView()) ma questa risposta di matrice è stata generata prima che gestisco la richiesta. Quindi perché potevo vederlo nel vardump e non nel ramoscello.

+1

È quasi sempre qualcosa di semplice. Sono contento che tu l'abbia capito. –

Problemi correlati