我们与两个实体Product {properties: name, details } and Tag {properties: name}
有很多关系。现在,当用户添加产品时,他也必须能够创建标签。所以我尝试了这个
$builder->add('tags', 'entity', array(
'class' => 'AppBundle:Tag',
'multiple' => true,
'expanded' => true,
'property' => 'name',
'required' => true
'allow_add' => true ));
不幸的是,这给了我一个标签的下拉列表。但我真正想要的是多个文本输入字段,用户可以在其中输入标签的名称,然后当用户保存类别表单时,这应保存在数据库中。
到目前为止我找到的所有解决方案都与下拉或复选框选项有关。但在我的情况下,我没有数据库中的标签列表,我想在用户创建产品时创建标签。那我怎么能这样做呢?
答案 0 :(得分:1)
实体类型字段可能只是选择,复选框或单选按钮(取决于扩展和多个选项),因此这些不适合您。
您可以通过实现标记类型来解决多个文本字段呈现,并将其作为集合嵌入到表单中。
按集合字段更改ProductType:
...
$builder->add('tags', CollectionType::class, array(
'allow_add' => true,
'allow_delete' => true,
'entry_type' => TagType::class,
'entry_options' => array(
...
),
)
...
创建TagType本身:
class TagType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('tagName', FormType\TextType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Entity\Tag',
)
);
}
}
但要注意缺点 - 如果没有为产品分配任何标签,则不会是任何提交的字段。您基本上有两个选项 - 1)在渲染表单之前向Product实体添加一些空标记,2)实现某种javascript方法以添加新标记字段。