我有很多要创建的集合,并且不想为每个entry_type创建FormType,因为它们只使用一次.
因此entry_type
,我没有在选项中提供表单类型FQCN ,而是尝试Type
直接从表单生成器中添加一个新的:
$type = $this ->get('form.factory') ->createBuilder(Type\FormType::class) ->add('label', Type\TextType::class, [ 'label' => 'Key', ]) ->add('value', Type\TextType::class, [ 'label' => 'Value', ]) ->getType() ; $form = $this ->get('form.factory') ->createBuilder(Type\FormType::class) ->add('hash', Type\CollectionType::class, [ 'entry_type' => $type, 'entry_options' => [], 'allow_add' => true, 'allow_delete' => true, 'prototype' => true, 'required' => false, 'delete_empty' => true, ]) ->getForm() ;
但由于某些原因,原型无效:
我手动创建的所有子字段$type
都丢失了.我的错误在哪里?
我终于找到了答案.
正如->getType()
我所使用的是在FormBuilder
课堂上,而不是在课堂上FormBuilderInterface
,我认为使用它是个坏主意.此外,FormType
返回的实例是空的(表单类型,但没有子项).
所以我改变了我的立场并创建了下面的EntryType
类(是的,我使用的是Form Type类,但是对于我以后的所有集合只使用了一个类):
add($field['name'], $field['type'], $field['options']); } } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'fields' => [], ]); } }
我现在可以使用此fields
选项在我的集合中使用任意字段:
use Symfony\Component\Form\Extension\Core\Type; use AppBundle\Form\Type\EntryType; // ... $form = $this ->get('form.factory') ->createBuilder(Type\FormType::class) ->add('hash', Type\CollectionType::class, [ 'entry_type' => EntryType::class, 'entry_options' => [ 'fields' => [ [ 'name' => 'key', 'type' => Type\TextType::class, 'options' => [ 'label' => 'Key', ], ], [ 'name' => 'value', 'type' => Type\TextType::class, 'options' => [ 'label' => 'Value', ], ], ], ], 'allow_add' => true, 'allow_delete' => true, 'prototype' => true, 'required' => false, 'delete_empty' => true, ]) ->getForm() ;