Php 如何创建根据其中一个字段对一个实体的对象进行分组的表单
我有两个实体:合同和绘图: DzialkiBundle\Entity\Contracts: 类型:实体 表:合同Php 如何创建根据其中一个字段对一个实体的对象进行分组的表单,php,symfony,doctrine,Php,Symfony,Doctrine,我有两个实体:合同和绘图: DzialkiBundle\Entity\Contracts: 类型:实体 表:合同 oneToMany: plots: targetEntity: Plots mappedBy: contract cascade: [persist] DzialkiBundle\Entity\Plots: 类型:实体 表:图表 fields:
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
我正在为合同实体创建一个表单。在此表格中,我还想插入一种选择(通过选择元素)绘图实体的可能性
但是,为了让它更难,我需要将图实体分成若干组。
它们必须按其中一个字段(位置)分组。当我选择地点(通过另一个select元素)时,必须将具有该地点值的绘图加载到另一个select元素(通过ajax)中,以便有机会从中进行选择
现在,我知道了如何完成其中的html/javascript部分。但我不知道如何实现ContractsType和PlotsType类,以使这个“分组”按我所希望的方式工作
我知道如何根据用户提交的内容或数据库中当前的内容动态添加另一个select元素。但我仍然不知道如何按字段对PlotsType进行分组(我不希望选择1、选择2…元素,我更希望它生成选择元素的集合,按位置字段自动分组)
我认为让我感到困难的是place字段位于Plots实体中,而不是合同中。因此,当我不知道Plots对象时,我无法检查place的值
有什么办法吗?提前感谢。您可以使用表单事件来完成。它在文档中定义 代码如下所示。(在其示例中,位置字段取决于运动字段的类型
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);
}
);
}
谢谢你的回答。但是动态表单生成对我来说并不难。我刚刚澄清了一点我的问题。你必须添加自定义查询来分组位置,而不是
$positions=null===$sport?array():$sport->getAvailablePositions();
问题是,这将只创建一个select元素,在该元素中,绘图可视地分组。我不需要这个。我需要若干个select元素,每个元素对应于绘图实体中位置字段的不同值。按“按位置字段分组”你是说只有与合同相关的绘图还是可视地分组?实际上两者都有。在链接到合同的绘图中,我想按位置字段对它们进行分组。