Symfony3 表单删除实体



>我想用Symfony3创建一个表单。它将是一个表,显示数据库中表中的所有实体,删除按钮将允许通过javascript删除行。然后,单击应用按钮并删除缺少的实体:

+----+------+--------+
| ID | Name | Delete |
+----+------+--------+
| 1  | Foo  |   X    |
+----+------+--------+
| 2  | Bar  |   X    |
+----+------+--------+
| 3  | Plop |   X    |
+----+------+--------+
+-------+
| Apply |
+-------+

据我了解,CollectionType将允许我这样做。但是我不知道如何使用它。确切地说,我不明白实体会在什么时候链接到表单并通过树枝中的表单函数出现。

这是我的代码:

控制器:

class TurnamentController extends Controller
{
    /**
     * @Route("/admin/turnament", name="adminTurnament")
     */
    public function indexAction( Request $request )
    {
        $em = $this->getDoctrine()->getManager();
        $turnaments = $em->getRepository( 'AppBundle:Turnament' )->findAll();
        $form = $this->createFormBuilder()
            ->add( 'turnaments', CollectionType::class, array(
                'entry_type' => TurnamentType::class,
                'entry_options' => $turnaments,
            ))
            ->add( 'apply', SubmitType::class, array(
                'label' => 'Appliquer'
            ))
            ->getForm();
        $form->handleRequest( $request );
        if ( $form->isSubmitted() )
        {
            //...
        }
        return $this->render(
            'admin/turnament.html.twig',
            array(
                'turnamentsForm' => $form
            )
        );
    }
}

转弯类型:

class TurnementType extends AbstractType
{
    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder->add( 'delete', SubmitType::class );
    }
    public function configureOptions( OptionsResolver $resolver )
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundleEntityTurnament',
        ));
    }
}

模板:

{{ form_start( turnamentsForm ) }}
{% for turnament in turnamentsForm.turnaments %}
    {{ form_widget(turnament.delete) }}
{% endfor %}
{{ form_widget( turnamentsForm.apply ) }}
{{ form_end( turnamentsForm ) }}

我很迷茫,我尝试使用 dump() 来看看发生了什么。看起来我传入entry_options$turnaments没有生成 TurnamentTypes...

欢迎任何帮助!

CollectionType的"entry_options"选项采用直接传递给您输入entry_type的选项。您正在尝试将锦标赛选择作为选项直接传递给您的TurnamentType。如果CollectionType不包含任何数据,则不会呈现任何字段。因此,您应该将锦标赛设置为集合类型的数据:

$form = $this->createFormBuilder()
    ->add( 'turnaments', CollectionType::class, array(
        'entry_type' => TurnamentType::class,
        'data' => $turnaments,
    ));

有关 CollectionType 的更多信息,请查看参考指南:http://symfony.com/doc/current/reference/forms/types/collection.html

以及有关自定义表单类型的一些信息:http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html

最新更新