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

时间:2018-02-28 12:31:42

标签: php symfony doctrine

我有两个实体:合同情节

DzialkiBundle \实体\合同:      类型:实体      表:合同

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

DzialkiBundle \实体\图:      类型:实体      table: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 ...元素,我更愿意生成选择元素的集合,由地方自动分组领域)。

我认为让我难以理解的是,场地区域位于Plots实体中,而不是合约中。因此,当我不知道Plots对象时,我无法检查地点的价值。

任何想法怎么做?提前谢谢。

1 个答案:

答案 0 :(得分: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);
            }
        );
    }