这是我的错误:
表单的视图数据应该是类的实例 我的\ 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..
}
答案 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');