2017-02-21 46 views
1

Я хочу иметь формы редактирования для всего объекта в одном представлении.Редактировать формы всего объекта объекта на одной странице Symfony3

Уже, у меня есть этот эффект: PICTURE

Но когда я пытаюсь изменить простой объект, он не работает.

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

} 

Что я могу сделать сейчас?

EDIT

Все мои формы имеют название "коррекции".

В этом случае я получил 12 форм:

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

Не могли бы вы дать нам ошибку? –

ответ

0

Вы должны иметь обработку внутри Еогеасп цикла формы, и вы должны дать другое имя для каждого из ваших форм, так что вы можете использовать createNamed() метода «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

Спасибо за ваш ответ. Когда я редактирую одну строку, все строки редактируются. Итак, где проблема сейчас? :) – Terixer

+0

Можете ли вы рассказать мне, как использовать метод createNamed() для 'form.factory'? Я пробовал это много раз, и это не сработало:/ – Terixer

+0

Проблема в том, что все формы имеют одинаковое имя, а метод handleRequest() не может определить, какой из них отправлен. Я обновил ответ, чтобы использовать метод createNamed() службы form.factory, чтобы вы могли установить другое имя для каждой формы. Затем вы можете проверить, какая форма была отправлена. Проверьте мой ответ на обновленный код. –