如何创建根据其中一个字段对一个实体的对象进行分组的表单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建根据其中一个字段对一个实体的对象进行分组的表单相关的知识,希望对你有一定的参考价值。

我有两个实体:合同和地块:

DzialkiBundle \ Entity \ Contracts:type:entity table:Contracts

 oneToMany:
      plots:
           targetEntity:     Plots
           mappedBy:          contract
           cascade:          [persist]

DzialkiBundle \ Entity \ Plots:类型:实体表:图

 fields:
       place:
            type:             integer

manyToOne:
      contract:
           targetEntity:     Contracts
           inversedBy:     plots
           joinColumn:
                name:     contract_id
                referencedColumnName:     id

我正在为Contracts实体创建一个表单。在这种形式中,我想插入一种可能性来选择(通过选择元素)Plots实体。

但是,为了使其更难,我需要将Plots实体分成几组。它们必须按其中一个字段(地点)分组。当我选择地点(通过另一个选择元素)时,必须将具有此值的地块的地块加载到另一个选择元素(通过ajax)以提供选择的机会。

现在,我知道如何做html / javascript部分。但我不知道如何实现ContractsType和PlotsType类,以便让我的“分组”工作。

我知道如何基于用户提交的内容或当前在db上的内容动态添加另一个select元素。但我仍然不知道如何通过其字段对PlotsType进行分组(我不想要select1,select2 ...元素,我宁愿生成选择元素的集合,由place字段自动分组)。

我认为让我难以接受的是,场地区域位于Plots实体中,而不是合同中。所以当我不知道Plots对象时,我无法检查地方的值。

有什么想法怎么做?先感谢您。

答案

您可以使用表单事件来完成。它在文档https://symfony.com/doc/current/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms中定义

代码如下所示。 (在其示例中,位置字段取决于运动场。

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('sport', EntityType::class, array(
                'class'       => 'App\Entity\Sport',
                'placeholder' => '',
            ));
        ;

        $formModifier = function (FormInterface $form, Sport $sport = null) {
            $positions = null === $sport ? array() : $sport->getAvailablePositions();

            $form->add('position', EntityType::class, array(
                'class' => 'App\Entity\Position',
                'placeholder' => '',
                'choices' => $positions,
            ));
        };

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier) {
                // this would be your entity, i.e. SportMeetup
                $data = $event->getData();

                $formModifier($event->getForm(), $data->getSport());
            }
        );

        $builder->get('sport')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {
                // It's important here to fetch $event->getForm()->getData(), as
                // $event->getData() will get you the client data (that is, the ID)
                $sport = $event->getForm()->getData();

                // since we've added the listener to the child, we'll have to pass on
                // the parent to the callback functions!
                $formModifier($event->getForm()->getParent(), $sport);
            }
        );
    }

以上是关于如何创建根据其中一个字段对一个实体的对象进行分组的表单的主要内容,如果未能解决你的问题,请参考以下文章

在手动创建的部分中对核心数据 tableView 行进行分组

如何根据数据库中的表自动生成实体类

如何根据从 objectId 中提取的创建日期对 MongoDB 集合进行分组?

如何根据从 objectId 中提取的创建日期对 MongoDB 集合进行分组?

Flutter如何根据某个值从firebase对列表进行分组

如何按键对一组对象进行分组?