Symfony实体表单,包含来自另一实体的动态字段 问题:
考虑以下订单表格:Symfony实体表单,包含来自另一实体的动态字段 问题:,symfony,symfony-forms,silex,Symfony,Symfony Forms,Silex,考虑以下订单表格: META DATA: Title: [________] REQUIREMENTS: What size? [_] Small [_] Medium [_] Large What shape? [_] Circle [_] Square [_] Triangle . . . 如何生成表单 限制条件: 大小&形状&..应从另一个名为:需求的实体中检索 我的想法是: 订单 Class Order { private $t
META DATA:
Title: [________]
REQUIREMENTS:
What size? [_] Small [_] Medium [_] Large
What shape? [_] Circle [_] Square [_] Triangle
.
.
.
如何生成表单
限制条件:
&大小
&形状
应从另一个名为:..
的实体中检索需求
Class Order
{
private $title;
//OneToMany(targetEntity="Requirement", mappedBy="order")
private $requirements;
public function __construct()
{
$this->requirements = new ArrayCollection();
}
}
要求
Class Requirement
{
private $title;
//ManyToOne(targetEntity="Order", inversedBy="requirements")
private $order;
//OneToMany(targetEntity="Selection", mappedBy="selections")
private $selections;
public function __construct()
{
$this->selections = new ArrayCollection();
}
}
选择
Class Selection
{
private $title;
//ManyToOne(targetEntity="Requirement", inversedBy="selections")
private $requirement;
}
订单类型
class OrderType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'allow_extra_fields' => true
));
$resolver->setRequired('em');
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$em = $options['em'];
$requirements = $em->getRepository(Requirement::class)->findAll();
$form = $builder
->add('title', TextType::class, array());
foreach ($requirements as $requirement) {
$args['label'] = $requirement->getTitle();
$args['expanded'] = true;
$args['multiple'] = true;
$args['mapped'] = false;
$args['class'] = Selection::class;
$args['choice_label'] = 'title';
$args['choice_value'] = 'id';
$args['query_builder'] = call_user_func(function (EntityRepository $er, $requirement) {
return $er->createQueryBuilder('s')
->where('s.requirement = :requirement')
->setParameter('requirement', $requirement)
},$em->getRepository($args['class']), $requirement);
$form
->add($requirement->getTitle(), EntityType::class, $args);
}
$form
->add('submit', SubmitType::class, array(();
return $form;
}
}
问题:
这很好用,我可以保存新的订单
s。问题在于编辑订单
,如下所示
$form->createView()
正确填写订单标题时,不会更新选项(复选框)。我甚至不知道在Symfony上这样做是否正确。我不知道在呈现编辑实体表单时如何重新填充选定的复选框
注意:
我认为if不是一个好主意,因为需求在时间上不断变化,不能硬编码为FormType
s,因此应该存储在数据库中。我认为这可以通过设置数据选项$args['data']=$requirement->getChoice()来实现
如果您需要自动执行,可以在其他表单classRequirementType
中处理。然后你循环并将需求对象传递给它。我仍然不知道我是否正确理解了这个问题,所以我重新解释了它,以便我的答案符合一个问题:当重新加载表单时,以前选择的值消失了,对吗?这是因为所选的选择不会被存储在任何地方:一个需求
有$selections
,但没有保存所选的选择
选择。因此,我将添加一个属性$selectedChoice
,并将每个需求的formfield(现在的名称是$requirement->getTitle()
)更改为selectedChoice
,并将其映射(mapped=>true
),以便表单填充selectedChoice
属性。那有用吗?不,那不是我的问题。如果你喜欢阅读,请考虑阅读<代码>通知> /代码>章节,或者整个问题。