2017-02-21 20 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, 
     )); 
    } 

} 

我现在可以做什么?

编辑

我的所有形式的有 “修正” 的名字。

在这种情况下,我已经得到了12点的形式:

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

你能给我们提供你得到的错误吗? –

回答

0

你应该有表格的foreach循环内处理,还需要对你的每一个形式给予不同的名字,所以你可以使用createNamed ()方法:

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

你能告诉我如何使用'form.factory'的createNamed()方法吗?我尝试了很多次,但没有成功:/ – Terixer

+0

问题是所有表单都具有相同的名称,而handleRequest()方法无法识别哪一个被提交。我更新了使用'form.factory'服务的createNamed()方法的答案,以便您可以为每个表单设置不同的名称。然后你可以检查提交的表单。检查我的答案更新的代码。 –

相关问题