Symfony无法决定哪个课程需要

时间:2014-03-01 19:23:22

标签: php arrays forms symfony symfony-forms

这是我的错误:

  

表单的视图数据应该是类的实例   我的\ Bundle \ Entity \ Tags,但是是类的实例   教义\共同\类别\ ArrayCollection的即可。您可以避免此错误   通过将“data_class”选项设置为null或添加视图   转换类实例的转换器   Doctrine \ Common \ Collections \ ArrayCollection到一个实例   我的\捆绑\实体\标签

这是我的表单构建器

 $builder
            ->add('name')
            ->add('tags','collection',array(
                        'data_class' => 'My\Bundle\Entity\Tags'
                        )
            )
            ->add('save','submit')
        ;

我将data_class更改为null(仅限于此),我收到错误:

  

表单的视图数据应该是标量,数组或类型   \ ArrayAccess的实例,**但是是类的实例   我\包\实体\标签* 。您可以通过设置来避免此错误   “data_class”选项为“My \ Bundle \ Entity \ Tags”或添加视图   转换类My \ Bundle \ Entity \ Tags的实例的转换器   标量,数组或\ ArrayAccess的实例。

我尝试使用变压器,所以看起来像这样:

    $transformer = new TagTransformer($this->entityManager);
    $builder
        ->add(
            $builder->create(
                'tags','collection',array(
                    'data_class' => 'My\Bundle\Entity\Tags'
                    )
            )->addModelTransformer($transformer)
        );

和变压器:

public function transform($tag)
{
    if (null === $tag) {
        return "";
    }

    return $tag->toArray();
}

再次将data_class更改为null。我得到了什么:

  

表单的视图数据应该是标量,数组或类型   \ ArrayAccess的实例,但是是类的实例   我\包\实体\代码。您可以通过设置来避免此错误   “data_class”选项为“My \ Bundle \ Entity \ Tags”或添加视图   转换类My \ Bundle \ Entity \ Tags的实例的转换器   标量,数组或\ ArrayAccess的实例。

当我将data_class更改为My\Bundle\Entity\Tags

  

表单的视图数据应该是类的实例   我的\ Bundle \ Entity \ Tags,但是是(n)数组。你可以避免这个错误   将“data_class”选项设置为null或添加视图   将(n)数组转换为实例的变换器   我的\捆绑\实体\标签

嗯..我的意思是...... wtf?我究竟做错了什么?我怎么能改变它?

修改

我的用户实体:

class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @ORM\ManyToMany(targetEntity="Tags", cascade={"persist"})
     */
    protected $tags;

// methods, etc..
}

2 个答案:

答案 0 :(得分:4)

因此,您收到错误的原因是因为您使用的集合字段类型有点不正确。首先,集合字段类型不支持data_class。当你说

->add('tags','collection',array(
    'data_class' => 'My\Bundle\Entity\Tags'
     )
)

你基本上是说标签(根据你的声明是一个数组集合)实际上是一个标签。如果查看集合类型的文档,您会注意到data_class甚至不是受支持的选项。 http://symfony.com/doc/current/reference/forms/types/collection.html

所以如果你想渲染一个多选项的标签列表,你正在寻找实体类型,但这些是标签,如果你有任何类型的体面网站,你可能会有多个选择列表是实用的。设计方面你想要一个自动完成器来显示键入文本时已存在的标签,然后让用户按Enter键添加标签是否存在。然后在自动完成器上方显示已添加的标签,并在旁边有x和x,他们可以按下以删除标签。

你可以通过在表单中​​使用标记字段作为未映射的文本类型来欺骗,并使用javascript将标记组合成表单提交中的字符串,然后在您的操作中将字符串转换为标记。

答案 1 :(得分:0)

很抱歉这里有延迟,但这对你有用吗?

 $builder
            ->add('name')
            ->add('tags','collection',array(
                    'type' => '**{{ NAME OF THE FORM }}**',
                )
            )
            ->add('save','submit');