我有一个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组,如图所示(只是表单的结尾):
因此,对于每个字段,用户可以选择类型并更新值。 这就是我更新表单的方式,这就是我不喜欢的方式:
foreach ($form->getData() as $fieldType){
$field = array_shift($fieldList);
$field->setFieldType($fieldType);
$em = $this->getDoctrine()->getManager();
$em->flush();
}
它有效,但一切看起来像一个小屋,我不喜欢这个。我从Symfony开始,所以我不确定,但是应该有更好的方法来创建我需要的那种形式并坚持下去。我试图创建一个ColletionType,但它没有用完。
有人知道更好的方法吗?
我有一个更复杂的案例,它将使用类似的逻辑,所以我试图解决这个问题。
答案 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来检查拼写错误,但它应该有效:)
希望这有点帮助...