Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms Symfony:与文本字段的多对多关系_Forms_Symfony - Fatal编程技术网

Forms Symfony:与文本字段的多对多关系

Forms Symfony:与文本字段的多对多关系,forms,symfony,Forms,Symfony,我们与两个实体产品{properties:name,details}和标记{properties:name}有多对多关系。现在,当用户添加产品时,他必须能够创建标签。所以我试过这个 $builder->add('tags', 'entity', array( 'class' => 'AppBundle:Tag', 'multiple' => true, 'expanded' => true, 'property' => 'name',

我们与两个实体
产品{properties:name,details}和标记{properties:name}
有多对多关系。现在,当用户添加产品时,他必须能够创建标签。所以我试过这个

$builder->add('tags', 'entity', array(
    'class' => 'AppBundle:Tag',
    'multiple' => true,
    'expanded' => true,
    'property' => 'name',
    'required' => true
    'allow_add'    => true ));
不幸的是,这给了我一个标签下拉列表。但我真正想要的是多个文本输入字段,用户可以在其中输入标签的名称,然后在用户保存类别表单时,应该将其保存在数据库中


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

实体类型字段只能是选择、复选框或单选按钮(取决于展开的选项和多个选项),因此这些选项不适合您

通过实现标记类型并将其作为集合嵌入表单,可以解决多个文本字段的呈现问题

按集合字段更改ProductType:

...
$builder->add('tags', CollectionType::class, array(
    'allow_add' => true,
    'allow_delete' => true,
    'entry_type'   => TagType::class,
    'entry_options'  => array(
        ...
    ),
)
...
创建标记类型本身:

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方法来添加新的标记字段