2017-02-16 59 views
0

我们与两个实体Product {properties: name, details } and Tag {properties: name}有多对多的关系。现在,当用户添加产品时,他也必须能够创建标签。所以我试过这个Symfony:与文本字段的多对多关系

$builder->add('tags', 'entity', array(
    'class' => 'AppBundle:Tag', 
    'multiple' => true, 
    'expanded' => true, 
    'property' => 'name', 
    'required' => true 
    'allow_add' => true)); 

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

到目前为止我发现的所有解决方案都与下拉或复选框选项有关。但就我而言,我没有数据库中的标签列表,我想在用户创建产品时创建标签。那我该怎么做?

回答

1

实体类型字段可能只是选择,复选框或单选按钮(取决于扩展和多个选项),所以这些不适合您。

您可以通过实现Tag类型来解决多个文本字段的渲染,并将其作为集合嵌入到表单中。

阿尔特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)在呈现表单之前向产品实体添加少量空标签,2)实现某种JavaScript方法来添加新标签字段。