Symfony3:从同一表单中持久保存多个对象的正确方法

时间:2017-01-13 22:42:27

标签: php forms symfony

我有一个Field类和一个FieldType类,我希望创建一个界面,用户可以一次编辑所有Field的FieldType。

所以我做了以下事情:

protected function createUpdateForm() {     
    $fieldList = $this->getDoctrine()->getRepository('AppBundle:Field')->findAll();
    $fieldTypeList = $this->getDoctrine()->getRepository('AppBundle:FieldType')->findAll();

    $form = $this->createFormBuilder();
    foreach ($fieldList as $field){
        $form->add($field->getDescription(), ChoiceType::class,
                  ['choices' => $fieldTypeList, 
                   'choice_label' => 'getDescription', 
                   'multiple'=>false, 'expanded'=>true, 
                   'data' => $field->getFieldType()]);
    }       
    $form->add('action', SubmitType::class, ['label' => 'Update']);
    $form->add('cancel', SubmitType::class, ['label' => 'Cancel']);

    return $form->getForm();
}

它从数据库中获取所有字段,并创建一个带有FieldTypes的Radio组,如图所示(只是表单的结尾):

enter image description here

因此,对于每个字段,用户可以选择类型并更新值。 这就是我更新表单的方式,这就是我不喜欢的方式:

foreach ($form->getData() as $fieldType){
    $field = array_shift($fieldList);
    $field->setFieldType($fieldType);
    $em = $this->getDoctrine()->getManager();
    $em->flush();                   
}

它有效,但一切看起来像一个小屋,我不喜欢这个。我从Symfony开始,所以我不确定,但是应该有更好的方法来创建我需要的那种形式并坚持下去。我试图创建一个ColletionType,但它没有用完。

有人知道更好的方法吗?

我有一个更复杂的案例,它将使用类似的逻辑,所以我试图解决这个问题。

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你,但如果我这样做了,就我所见,这需要CollectionType。另外,如果您将基础类型设置为EntityType,则可以进一步简化操作。

我认为这样的事情应该有效:

$fieldList = $this->getDoctrine()->getRepository('AppBundle:Field')->findAll();

$form = $this->createFormBuilder(['fields' => $fieldList])
    ->add('fields', CollectionType::class, [
        'entry_type' => EntityType::class,
        'entry_options' => [
            'class' => 'AppBundle:FieldType',
            'expanded' => true,
            'choice_label' => 'description'
        ]
    ])
    ->add('action', SubmitType::class, ['label' => 'Update'])
    ->add('cancel', SubmitType::class, ['label' => 'Cancel'])
    ->getForm();

更新

{{ form_label(form.fields) }}
{% for f in form.fields %}
    {{ form_row(f, {'label': f.vars.value.description}) }}
{% endfor %}

请记住,我目前没有使用dev env来检查拼写错误,但它应该有效:)

希望这有点帮助...