如何在奏鸣曲列表字段中显示数组



我有一个用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,
    ])
;

我默认认为,此存储一个序列化的数组字符串并将其转换为表单。

相关内容

  • 没有找到相关文章

最新更新