繁体   English   中英

Symfony2创建表单类型添加多条同类型记录

[英]Symfony2 create a form type to add multiple records of the same type

我需要创建一个表单类型来创建某个实体的多个记录。

我想出创建一个父表单类型,然后在里面添加一个集合。 此父类型不绑定到任何实体,但子类型是。 问题是,当我处理请求时,我得到一个空的数据对象。

这是我的父类型:

class ChallengeCollectionType extends AbstractType {

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email_invitations', CollectionType::class, [
            'entry_type' => EmailInvitationType::class
        ]);
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'csrf_protection'   => false
        ));
    }

}

我的孩子类型:

class EmailInvitationType extends AbstractType {

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', EmailType::class);
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'        => Challenge::class,
            'csrf_protection'   => false
        ));
    }

}

以下是我在 Controller 中处理数据的方式:

public function inviteEmailAction(Request $request){

        $form = $this->createForm(ChallengeCollectionType::class);

        $form->handleRequest($request);

        dump($form->getData());
        dump($form->get('email_invitations')->getData());
        die();
}

我在 POST 请求中提交数据(这是 API,没有 HTML 表单),如下所示:

challenge_collection[email_invitations][0][email] = "email@address.com"
challenge_collection[email_invitations][1][email] = "address@email.com"

并且 Controller 为所有转储返回空 []。

我实际上找到了一种解决方法,但看起来很糟糕:

        $data = ['email_invitations' => [new Challenge(), new Challenge()]];        

        $form = $this->createForm(ChallengeCollectionType::class, $data);

        $form->handleRequest($request);

这会起作用,所以我必须发送一个实体类型的空对象数组来处理请求。

甚至这样:

    $data = ['email_invitations' => []];

    if(!empty($request->request->get('challenge_collection'))){
        if(!empty($request->request->get('challenge_collection')['email_invitations'])){
            for($i = 0; $i < count($request->request->get('challenge_collection')['email_invitations']); $i ++){
                $data['email_invitations'][] = new Challenge();
            }
        }
    }

应该有更好的方法,请帮我找到。

您应该尝试在集合字段类型中使用allow_addallow_delete选项。 请参阅集合字段类型文档

此外,这对于父实体与子实体的mapped-by很重要,这将使您在控制器的ArrayCollection对象中获得子对象。

此外,如果您想根据请求自动保存/删除它们,您需要实现“by_reference false and set association with级联持久性and级联删除的关联。

我已经多次使用带有 API 的collection字段类型,它的工作方式非常迷人。 如果您需要进一步解释,请告诉我。

也许你应该在你的控制器中尝试类似的东西:

$invitations = $this->getDoctrine()->getRepository('yourInvitationEntityClass')->findAll());         
$form = $this->createForm(ChallengeCollectionType::class, $invitations );

你可以在这里找到解释:

http://symfony.com/doc/current/cookbook/form/form_collections.html

一种形式,包含一个实体的所有行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM