Symfony:与文本字段有很多关系

时间:2017-02-16 17:49:25

标签: forms symfony

我们与两个实体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 ));

不幸的是,这给了我一个标签的下拉列表。但我真正想要的是多个文本输入字段,用户可以在其中输入标签的名称,然后当用户保存类别表单时,这应保存在数据库中。

到目前为止我找到的所有解决方案都与下拉或复选框选项有关。但在我的情况下,我没有数据库中的标签列表,我想在用户创建产品时创建标签。那我怎么能这样做呢?

1 个答案:

答案 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方法以添加新标记字段。