Symfony Easyadmin 角色的选择类型字段
Symfony Easyadmin choice type field for roles
我使用 easyadmin,我希望字段 "role" 显示字段类型 "radio" 中的角色选择,但出现此类型的错误(数组到字符串转换)(见下图) ):
Notice: Array to string conversion
这是我的配置:
easy_admin:
entities:
User:
class: AppBundle\Entity\User
form:
fields:
- { property: 'username' }
- { property: 'email' }
- { property: 'enabled' }
- property: 'plainPassword'
type: 'repeated'
type_options:
type: Symfony\Component\Form\Extension\Core\Type\PasswordType
required: false
first_options: { label: '%label.password%' }
second_options: { label: '%label.password_confirmation%' }
invalid_message: fos_user.password.mismatch
- property: 'roles'
type: 'choice'
type_options:
mapped: true
expanded: true
multiple: false
choices: { 'Conseiller': 'ROLE_USER', 'Administrateur': 'ROLE_ADMIN' }
有人可以提供解决方案让我可以使用 easyadmin 显示单选按钮吗?
提前致谢
这是 Symfony 3.4 中对此的解决方案(使用 Yes/No 下拉菜单)可能会有所帮助:
在config.yml
imports:
...
- { resource: easyAdmin.yml }
在easyadmin.yml
fields:
...
- property: 'hasRoleAdmin'
label: 'Is admin?'
type: choice
type_options:
choices:
'No': 'No'
'Yes': 'Yes'
在用户实体中:
public function hasRoleAdmin()
{
return ($this->hasRole('ROLE_ADMIN')) ? 'Yes' : 'No';
}
public function setHasRoleAdmin($isAdmin)
{
if ('Yes' === $isAdmin && 'No' === $this->hasRole('ROLE_ADMIN')) {
$this->addRole('ROLE_ADMIN');
}
if ('No' === $isAdmin && 'Yes' == $this->hasRole('ROLE_ADMIN')) {
$this->removeRole('ROLE_ADMIN');
}
$this->isAdmin = $isAdmin;
}
@johan-rm你做的几乎是正确的。
事实上,您不能为角色使用单选按钮,因为角色(请参阅 s
)是多项选择字段。您需要使用复选框(或多个 select)。
在您的代码中,唯一的错误是这部分:multiple: false
。
如果您尝试将数组映射到单个选择字段,那么您就是在尝试将数组映射到字符串,因此会出现错误。
只需将 multiple: false
更改为 multiple: true
.
这是结果:
easy_admin:
entities:
User:
class: AppBundle\Entity\User
form:
fields:
- { property: 'username' }
- { property: 'email' }
- { property: 'enabled' }
- property: 'plainPassword'
type: 'repeated'
type_options:
type: Symfony\Component\Form\Extension\Core\Type\PasswordType
required: false
first_options: { label: '%label.password%' }
second_options: { label: '%label.password_confirmation%' }
invalid_message: fos_user.password.mismatch
- property: 'roles'
type: 'choice'
type_options:
mapped: true
expanded: true
multiple: true
choices: { 'Conseiller': 'ROLE_USER', 'Administrateur': 'ROLE_ADMIN' }
我使用 easyadmin,我希望字段 "role" 显示字段类型 "radio" 中的角色选择,但出现此类型的错误(数组到字符串转换)(见下图) ):
Notice: Array to string conversion
这是我的配置:
easy_admin:
entities:
User:
class: AppBundle\Entity\User
form:
fields:
- { property: 'username' }
- { property: 'email' }
- { property: 'enabled' }
- property: 'plainPassword'
type: 'repeated'
type_options:
type: Symfony\Component\Form\Extension\Core\Type\PasswordType
required: false
first_options: { label: '%label.password%' }
second_options: { label: '%label.password_confirmation%' }
invalid_message: fos_user.password.mismatch
- property: 'roles'
type: 'choice'
type_options:
mapped: true
expanded: true
multiple: false
choices: { 'Conseiller': 'ROLE_USER', 'Administrateur': 'ROLE_ADMIN' }
有人可以提供解决方案让我可以使用 easyadmin 显示单选按钮吗?
提前致谢
这是 Symfony 3.4 中对此的解决方案(使用 Yes/No 下拉菜单)可能会有所帮助:
在config.yml
imports:
...
- { resource: easyAdmin.yml }
在easyadmin.yml
fields:
...
- property: 'hasRoleAdmin'
label: 'Is admin?'
type: choice
type_options:
choices:
'No': 'No'
'Yes': 'Yes'
在用户实体中:
public function hasRoleAdmin()
{
return ($this->hasRole('ROLE_ADMIN')) ? 'Yes' : 'No';
}
public function setHasRoleAdmin($isAdmin)
{
if ('Yes' === $isAdmin && 'No' === $this->hasRole('ROLE_ADMIN')) {
$this->addRole('ROLE_ADMIN');
}
if ('No' === $isAdmin && 'Yes' == $this->hasRole('ROLE_ADMIN')) {
$this->removeRole('ROLE_ADMIN');
}
$this->isAdmin = $isAdmin;
}
@johan-rm你做的几乎是正确的。
事实上,您不能为角色使用单选按钮,因为角色(请参阅 s
)是多项选择字段。您需要使用复选框(或多个 select)。
在您的代码中,唯一的错误是这部分:multiple: false
。
如果您尝试将数组映射到单个选择字段,那么您就是在尝试将数组映射到字符串,因此会出现错误。
只需将 multiple: false
更改为 multiple: true
.
这是结果:
easy_admin:
entities:
User:
class: AppBundle\Entity\User
form:
fields:
- { property: 'username' }
- { property: 'email' }
- { property: 'enabled' }
- property: 'plainPassword'
type: 'repeated'
type_options:
type: Symfony\Component\Form\Extension\Core\Type\PasswordType
required: false
first_options: { label: '%label.password%' }
second_options: { label: '%label.password_confirmation%' }
invalid_message: fos_user.password.mismatch
- property: 'roles'
type: 'choice'
type_options:
mapped: true
expanded: true
multiple: true
choices: { 'Conseiller': 'ROLE_USER', 'Administrateur': 'ROLE_ADMIN' }