2017-02-21 2 views
1

Ich möchte Bearbeitungsformulare für alle Objekte in einer Ansicht haben.Edit Forms aller Entity-Objekt auf einer Seite Symfony3

Schon, ich habe diesen Effekt: PICTURE

Aber wenn ich versuche, ein einfaches Objekt zu bearbeiten, funktioniert es nicht.

Corrections.html.twig

<div class="row"> 
    <div class="col-sm-10 col-sm-offset-1"> 
     <table class="table table-bordered"> 
      <thead> 
       <tr> 
        <th>Nazwa poprawki</th> 
        <th>Status dla</th> 
        <th>Status dla klienta</th> 
        <th>Nazwa projektu</th> 
        <th>Klient</th> 
        <th>Obszar</th> 
        <th>Piorytet</th> 
        <th>Data utworzenia</th> 
        <th>Iteracja</th> 
       </tr> 
      </thead> 
      <tbody> 

       {% for correction in corrections %} 
        {{ form_start(form[loop.index0]) }} 
        <tr> 
         <td>{{correction.correctionName}}</td> 
         <td>{{ form_widget(form[loop.index0].adminStatusCorrectionId) }}</td> 
         <td>{{ form_widget(form[loop.index0].userStatusCorrectionId) }}</td> 
         <td>{{correction.projectId.projectName}}</td> 
         <td>{{correction.projectId.userId.firstName}} {{correction.projectId.userId.lastName}}</td> 
         <td>{{ form_widget(form[loop.index0].areaId) }}</td> 
         {% if correction.priority %} 
          <td>Tak</td> 
         {% else %} 
          <td>Nie</td> 
         {% endif %} 
         <td>{{correction.creationDate|date('Y-m-d')}}</td> 
         <td>{{correction.iteration}}</td> 
         <td>{{ form_widget(form[loop.index0].save) }}</td> 
        </tr> 
        </form> 
        {{ form_end(form[loop.index0]) }} 
       {%endfor %} 

      </tbody> 
     </table> 
    </div> 
</div> 

AdministratorController.php

public function correctionsAction(Request $request) { 
    $repository = $this->getDoctrine()->getRepository('AppBundle:Correction'); 
    $corrections = $repository->findAll(); 

    foreach ($corrections as $key => $value) { 
     $form = $this->createForm(CorrectionType::class, $corrections[$key]); 
     $formView[] = $form->createView(); 
    } 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 

     $correction = $form->getData(); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($correction); 
     $em->flush(); 

     return $this->redirectToRoute('admin_view_corrections'); 
    } 

    return $this->render('administrator/corrections.html.twig', array(
       'corrections' => $corrections, 
       'form' => $formView 
    )); 
} 

CorrectionType.php

class CorrectionType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder 
       ->add('adminStatusCorrectionId', EntityType::class, array(
        'class' => 'AppBundle:AdminStatusCorrection', 
        'choice_label' => 'statusName' 
       )) 
       ->add('userStatusCorrectionId', EntityType::class, array(
        'class' => 'AppBundle:UserStatusCorrection', 
        'choice_label' => 'statusName' 
       )) 
       ->add('areaId', EntityType::class, array(
        'class' => 'AppBundle:Area', 
        'choice_label' => 'areaName' 
       )) 
       ->add('save', SubmitType::class, array('label' => 'Aktualizacja')) 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults(array(
      'data_class' => Correction::class, 
     )); 
    } 

} 

Was kann ich jetzt tun?

EDIT

Alle meine Form "Korrektur" Namen haben.

In diesem Fall i 12 Formen bekommen haben:

<form name="correction" method="post"></form> 
+0

Können Sie uns den Fehler geben, den Sie erhalten? –

Antwort

0

Sie sollten die Form haben, müssen Sie jedes Ihrer Formulare anderen Namen geben, auch in Ihrem foreach Zyklus Handhabung, so dass Sie die createNamed verwenden könnte() Methode der 'form.factory':

foreach ($corrections as $key => $value) { 
    $formName = 'form_' . $key; 
    $form = $this->get('form.factory')->createNamed($formName, CorrectionType::class, $corrections[$key]); 

    if ($request->getMethod() === 'POST' && $request->request->has($formName)) { 
     $form->handleRequest($request); 
    } 

    if ($form->isSubmitted() && $form->isValid()) { 

     $correction = $form->getData(); 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($correction); 
     $em->flush(); 

     return $this->redirectToRoute('admin_view_corrections'); 
    } 

    $formView[] = $form->createView(); 
} 
+0

Vielen Dank für Ihre Antwort. Wenn ich eine Zeile bearbeite, werden alle Zeilen bearbeitet. Wo ist das Problem jetzt? :) – Terixer

+0

Können Sie mir sagen, wie man createNamed() Methode der 'form.factory' verwendet? Ich habe es viele Male versucht und es hat nicht funktioniert:/ – Terixer

+0

Das Problem ist, dass alle Formulare den gleichen Namen haben und die handleRequest() -Methode kann nicht identifizieren, welche gesendet wird. Ich habe die Antwort aktualisiert, um die Methode createNamed() des Dienstes 'form.factory' zu verwenden, sodass Sie jedem Formular einen anderen Namen zuweisen können. Dann können Sie überprüfen, welches Formular gesendet wurde. Überprüfen Sie meine Antwort auf den aktualisierten Code. –

Verwandte Themen