我有两个实体:合同和情节:
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对象时,我无法检查地点的价值。
任何想法怎么做?提前谢谢。
答案 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);
}
);
}