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()来实现
如果您需要自动执行,可以在其他表单class
RequirementType
中处理。然后你循环并将需求对象传递给它。我仍然不知道我是否正确理解了这个问题,所以我重新解释了它,以便我的答案符合一个问题:当重新加载表单时,以前选择的值消失了,对吗?这是因为所选的选择不会被存储在任何地方:一个
需求
$selections
,但没有保存所选的
选择
选择。因此,我将添加一个属性
$selectedChoice
,并将每个需求的formfield(现在的名称是
$requirement->getTitle()
)更改为
selectedChoice
,并将其映射(
mapped=>true
),以便表单填充
selectedChoice
属性。那有用吗?不,那不是我的问题。如果你喜欢阅读,请考虑阅读<代码>通知> /代码>章节,或者整个问题。