2017-09-14 2 views
0

J'ai un problème avec un champ Collection de formulaires Symfony. J'ai un formulaire parent qui a deux champs qui sont des collections de formulaires. Tout fonctionne parfaitement bien, sauf lorsque je soumets mon formulaire avec des données invalides. Les erreurs pour les champs de collection de formulaires sont affichées sous le formulaire sur la page. J'ai lu la documentation de error_bubbling sur ces champs et je me rends compte que pour les champs CollectionType, la valeur par défaut est true. Je l'ai donc mis à false sur chaque champ et toujours les erreurs ne sont pas mappées aux champs du formulaire.Erreurs Symfony Dynamic Forms Collection non associées à des champs

Les champs de collection peuvent être ajoutés dynamiquement à la page via javascript sur le frontal. Ce que j'ai remarqué, c'est que dans mon balisage, avant même que j'ai soumis le formulaire, il ya deux <div class=""form-group"> erronés ajoutés à la base de mon balisage que je ne produis pas dans mon modèle. Lorsque le formulaire est soumis et n'est pas valide, les erreurs sont générées dans ces divs.

Le code;

ItemFormType;

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
     $builder 
      ->add('shop', ShopType::class, [ 
       'data_class' => Shop::class, 
       'label' => false, 
      ]) 
      ->add('purchase', PurchaseType::class, [ 
       'data_class' => Purchase::class, 
       'label' => false, 
      ]) 
      ->add('missing_items', CollectionType::class, [ 
       'entry_type' => MissingItemFormType::class, 
       'allow_add' => true, 
       'allow_delete' => true, 
       'label' => false, 
       'prototype' => true, 
       'error_bubbling' => false, 
      ]) 
      ->add('replaced_items', CollectionType::class, [ 
       'entry_type' => ReplacedItemFormType::class, 
       'allow_add' => true, 
       'allow_delete' => true, 
       'label' => false, 
       'prototype' => true, 
       'error_bubbling' => false, 
      ]) 
      ->add('submit', SubmitType::class) 
      ->getForm(); 
    } 

    /** 
    * Get the form name. 
    * 
    * @return string 
    */ 
    public function getName(): string 
    { 
     return 'missing_form'; 
    } 

    /** 
    * Set form options. 
    * 
    * @param OptionsResolver $resolver 
    * 
    * @return void 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => null, 
      'error_bubbling' => false 
     ]); 
    } 

Contrôleur;

/** 
    * @Route("/", name="homepage") 
    * 
    * @param ClaimMailer $mailer 
    * @param Request $request 
    * 
    * @return Response 
    */ 
    public function indexAction(ClaimMailer $mailer, Request $request): Response 
    { 
     $purchase = [ 
      'shop' => new Shop(), 
      'purchase' => new Purchase(), 
     ]; 

     $form = $this->createForm(MissingFormType::class, $purchase); 

     $form->handleRequest($request); 

     if ($form->isSubmitted() && $form->isValid()) { 
      $this->store($form, $purchase); 

      // Send confirmation email. 
      $mailer->send(
       $purchase['purchase']->getEmail(), 
       $purchase['shop']->getName(), 
       $purchase['purchase']->getClaimReferenceNumber() 
      ); 

      return $this->render('form/form_complete.html.twig', [ 
       'purchase_id' => $purchase['purchase']->getPurchaseReferenceNumber(), 
      ]); 
     } 

     return $this->render('form/purchase_form.html.twig', [ 
      'form' => $form->createView(), 
     ]); 
    } 

    /** 
    * Store form data. 
    * 
    * @param Form $form 
    * @param array$claim 
    * 
    * @return void 
    */ 
    public function store(Form $form, $purchase){} 

Le modèle;

{% block _missing_form_missing_items_entry_row %} 
    {% for field in form %} 
     <td> 
      {{ form_row(field) }} 
     </td> 
    {% endfor %} 
{% endblock %} 

{% block _missing_form_replaced_items_entry_row %} 
    {% for field in form %} 
     <td> 
      {{ form_row(field) }} 
     </td> 
    {% endfor %} 
{% endblock %} 

{% block website_body %} 
    <div class="row"> 
     <div class="col-lg-12"> 
      <div class="panel panel-default"> 
       <div class="panel-body"> 
        {{ form_start(form) }} 
        <div class="row"> 
         <div class="col-lg-6"> 
          {{ form_row(form.shop.name) }} 
          {{ form_row(form.shop.accountNumber) }} 
          {{ form_row(form.shop.email) }} 
          {{ form_row(form.shop.addressLine1) }} 
         </div> 
         <div class="col-lg-6"> 
          {{ form_row(form.shop.addressLine2) }} 
          {{ form_row(form.shop.town) }} 
          {{ form_row(form.shop.county) }} 
          {{ form_row(form.shop.postcode) }} 
         </div> 
        </div> 
        <div class="row"> 
         <h3>Missing Items</h3> 
         <table class="table missing_items"> 
          <tbody class="missing_items" data-prototype="{{ form_row(form.missing_items.vars.prototype)|e('html_attr') }}"></tbody> 
         </table> 
        </div> 
        <div class="row"> 
         <div class="col-lg-6"> 
          {{ form_row(form.purchase.receivedReplacement) }} 
         </div> 
         <table class="table replacement-items"> 
          <tbody class="replacement_items" data-prototype="{{ form_row(form.replaced_items.vars.prototype)|e('html_attr') }}"></tbody> 
         </table> 
        </div> 
        <div class="row"> 
         <div class="col-lg-6"> 
          {{ form_row(form.submit) }} 
         </div> 
        </div> 
        {{ form_end(form) }} 
        {% embed 'form/components/terms_and_conditions.html.twig' %}{% endembed %} 
       </div> 
      </div> 
     </div> 
    </div> 
{% endblock %} 

Toute assistance serait grandement appréciée! J'ai tout essayé pour obtenir les erreurs au bon endroit.

Répondre

0

Donc, pour quelqu'un d'autre là-bas, j'ai trouvé la réponse à cette énigme. Fondamentalement, alors que mon JS rendait le formulaire sur la page via l'attribut "prototype" sur mon <tbody>, à la connaissance de Symfony, je ne publiais pas explicitement les champs dans mon modèle. Par conséquent, toutes les erreurs pour les champs d'élément ont été crachées lors de l'appel de 'form_end(form)' à la fin du modèle. En tant que form_rest()form_rest(), il affiche en sortie les champs du formulaire qui n'ont pas été rendus explicitement. Les erreurs de validation et leurs champs respectifs ont été générés à la fin du formulaire. page!

En générant explicitement ces champs dans le modèle, les erreurs et les champs associés s'affichaient correctement dans le formulaire; J'espère que cela aide quelqu'un d'autre qui se trouve dans la même situation!