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

问题描述 投票:1回答:1

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

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对象时,我无法检查地方的值。

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

php symfony doctrine
1个回答
1
投票

您可以使用表单事件来完成。它在文档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);
            }
        );
    }
© www.soinside.com 2019 - 2024. All rights reserved.