我有一个用sonataadminbundle创建的crud,一切正常,除了列出现有配置文件时,它们包含一个"角色"字段,该字段由几个角色组成,并且在实体中定义为"角色"字段数组。好吧,当您尝试渲染从数据库中获得的数据时,它会引发错误,指示它无法从"数组"转换为"字符串",错误的确是以下内容:
在渲染模板的渲染过程中,已经抛出了一个例外("注意:字符串转换数组"(。
我有这个 configurelistfields :
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->add('id', 'integer',
array(
'label' => 'ID'
)
)
->addIdentifier('name', 'string',
array(
'label' => 'Name'
)
)
->add('slug', 'string',
array(
'label' => 'Slug'
)
)
->add('roles', 'array',
array(
'label' => 'Roles'
)
)
;
}
实体"配置文件":
class Profile
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @GedmoVersioned()
* @ORMColumn(name="name", type="string", length=100)
* @GedmoTranslatable
*/
private $name;
/**
* @var string
*
* @GedmoVersioned()
* @ORMColumn(name="slug", type="string", length=120, unique=true)
*/
private $slug;
/**
* @var array
*
* @GedmoVersioned()
* @ORMColumn(name="roles", type="array")
*/
private $roles;
/**
* @GedmoLocale
*/
private $locale;
public function setTranslatableLocale($locale)
{
$this->locale = $locale;
}
/**
* Constructor
*/
public function __construct()
{
$this->roles = array();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Profile
*/
public function setName($name)
{
$this->name = $name;
$this->slug = Tools::getSlug($name);
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set slug
*
* @param string $slug
*
* @return Profile
*/
public function setSlug($slug)
{
$this->slug = $slug;
return $this;
}
/**
* Get slug
*
* @return string
*/
public function getSlug()
{
return $this->slug;
}
/**
* @param $role
* @return $this
*/
public function addRole($role)
{
if (!$this->hasRole($role)) {
$this->roles[] = strtoupper($role);
}
return $this;
}
/**
* Remove role
*
* @param array $role
*/
public function removeRole($role)
{
$this->roles->removeElement($role);
}
/**
* @return array|Array
*/
public function getRoles()
{
return $this->roles;
}
/**
* @param $role
* @return bool
*/
public function hasRole($role)
{
return in_array(strtoupper($role), $this->roles, true);
}
public function __toString()
{
return $this->name;
}
}
,当我将列表加载到浏览器中时,它显示了上面提到的错误。
我也尝试过,结果是相同的:
->add('roles', 'collection',
array(
'label' => 'Roles'
)
)
我该怎么做才能在列表中显示字符串并正确渲染模板?
注意:如果在configurelistfields((方法中,我删除了"角色"字段,一切正常。
您可以创建一个自定义。如果列表字段不使用类型array
(尽管应该...如果丑陋(,则可能会在Profile
中添加一种方法以转换为更好的字符串:
public function getRolesAsString()
{
return implode(',', $this->roles);
}
然后在ListMapper中:
->add('rolesAsString', 'string', ['label' => 'Roles'])
编辑:误读,您的意思是列表字段...为表格 - 请参见上文
您可以使用多个允许的选择类型:
$roles = [
'ROLE_ADMIN' => 'Admin',
'ROLE_USER' => 'User',
'ROLE_GOD' => 'Hallelujah',
];
$formMapper
->add('roles', 'choice', [
'choices' => $roles,
'expanded' => false,
'multiple' => true,
])
;
我默认认为,此存储一个序列化的数组字符串并将其转换为表单。