2017-02-16 55 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方法來添加新標籤字段。