如何在 CakePHP 3 中提取数据并将关联显示为多个 select 复选框?
How to pull data for and display an Association as a multiple-select checkbox in CakePHP 3?
我正在使用单独的 table 中的角色设置用户访问模型,并通过 UserRoles table.
链接到用户
我目前在 Model/Table/UsersTable.php 中有以下内容:
$this->belongsToMany('Roles', [
'through' => 'UserRoles'
]);
以及 Model/Table/RolesTable.php 中的以下内容:
$this->belongsToMany('Users', [
'through' => 'UserRoles'
]);
以及 Model/Table/UserRolesTable.php 中的以下内容:
$this->belongsTo('Users', [
'foreignKey' => 'user_id'
]);
$this->belongsTo('Roles', [
'foreignKey' => 'role_id'
]);
我创建了 3 个不同的角色,'viewer'、'creator' 和 'administrator'。我已经成功地根据用户类型设置了权限。我遇到困难的地方是通过关联表单向用户添加角色。
现在我已经给了管理员用户编辑用户信息的能力。这适用于我在用户 table 中拥有的基本信息,但我不知道如何为关联的角色设置表单字段。我希望它是一个复选框,管理员可以在其中 select 用户的每个权限。
我目前正在这样做,但没有给我想要的东西:
echo $this->Form->input('Users.role', ['type' => 'checkbox']);
这给我一个带有标签 "Role" 的复选框。我想从我的角色 table 中提取每一行并将它们全部列为选项。
我有几个与此相关的问题:
1) 这看起来很基础,但我只是没有找到明确说明。我的 UsersController 中需要什么代码来提取所有角色的列表? (不仅是那些与当前用户关联的对象,还有角色 table 中的所有对象。)
2) 我需要什么表单输入代码来显示包含所有可能角色的复选框,并显示当前用户权限(在我的 UserRoles table 中)已被选中?我想我的表格需要这样的东西:
echo $this->Form->select('User.Role', $options, ['multiple' => 'checkbox']);
...但我不知道 $options 应该是什么,以及如何设置已经 selected 的值。
我目前正在使用要编辑的用户对象提取角色:
$user = $this->Users->get($id, [
'contain' => ['Roles'],
'Users.id' => $this->Auth->user('id')
]);
...但我无法将其转换为复选框形式 selection.
非常感谢。
为了从一些选项中创建一个复选框列表,您首先需要从控制器发送选项:
$this->set('roles', $this->Users->Roles->find('list'));
然后,在您的模板中添加一个 multiple => checkbox
输入:
echo $this->Form->input('roles', ['multiple' => 'checkbox', 'options' => $roles]);
不需要在您的输入名称前加上前缀 User.
只需将您的输入命名为用户实体的属性即可。
我正在使用单独的 table 中的角色设置用户访问模型,并通过 UserRoles table.
链接到用户我目前在 Model/Table/UsersTable.php 中有以下内容:
$this->belongsToMany('Roles', [
'through' => 'UserRoles'
]);
以及 Model/Table/RolesTable.php 中的以下内容:
$this->belongsToMany('Users', [
'through' => 'UserRoles'
]);
以及 Model/Table/UserRolesTable.php 中的以下内容:
$this->belongsTo('Users', [
'foreignKey' => 'user_id'
]);
$this->belongsTo('Roles', [
'foreignKey' => 'role_id'
]);
我创建了 3 个不同的角色,'viewer'、'creator' 和 'administrator'。我已经成功地根据用户类型设置了权限。我遇到困难的地方是通过关联表单向用户添加角色。
现在我已经给了管理员用户编辑用户信息的能力。这适用于我在用户 table 中拥有的基本信息,但我不知道如何为关联的角色设置表单字段。我希望它是一个复选框,管理员可以在其中 select 用户的每个权限。
我目前正在这样做,但没有给我想要的东西:
echo $this->Form->input('Users.role', ['type' => 'checkbox']);
这给我一个带有标签 "Role" 的复选框。我想从我的角色 table 中提取每一行并将它们全部列为选项。
我有几个与此相关的问题:
1) 这看起来很基础,但我只是没有找到明确说明。我的 UsersController 中需要什么代码来提取所有角色的列表? (不仅是那些与当前用户关联的对象,还有角色 table 中的所有对象。)
2) 我需要什么表单输入代码来显示包含所有可能角色的复选框,并显示当前用户权限(在我的 UserRoles table 中)已被选中?我想我的表格需要这样的东西:
echo $this->Form->select('User.Role', $options, ['multiple' => 'checkbox']);
...但我不知道 $options 应该是什么,以及如何设置已经 selected 的值。
我目前正在使用要编辑的用户对象提取角色:
$user = $this->Users->get($id, [
'contain' => ['Roles'],
'Users.id' => $this->Auth->user('id')
]);
...但我无法将其转换为复选框形式 selection.
非常感谢。
为了从一些选项中创建一个复选框列表,您首先需要从控制器发送选项:
$this->set('roles', $this->Users->Roles->find('list'));
然后,在您的模板中添加一个 multiple => checkbox
输入:
echo $this->Form->input('roles', ['multiple' => 'checkbox', 'options' => $roles]);
不需要在您的输入名称前加上前缀 User.
只需将您的输入命名为用户实体的属性即可。