如何在CakePHP 3中为关联提取数据并将其显示为多选复选框



我正在设置一个用户访问模型,其中Roles位于一个单独的表中,并通过UserRoles表链接到Users。

我目前在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个不同的角色,"查看器"、"创建者"one_answers"管理员"。我已经成功地根据用户类型设置了权限。我陷入困境的地方是通过关联表单向用户添加角色

现在,我已经为管理员用户提供了编辑用户信息的能力。这适用于我在Users表中的基本信息,但我不知道如何设置关联角色的表单字段。我希望它是一个复选框,管理员可以在其中为用户选择每个权限。

我目前正在做这件事,但这并没有给我想要的:

 echo $this->Form->input('Users.role', ['type' => 'checkbox']);

这给了我一个标签为"角色"的复选框。我想从角色表中提取每一行,并将它们全部列为选项。

我有几个问题与此有关:

1) 这看起来真的很初级,但我只是觉得没有明确说明。我的UsersController中需要什么代码来提取所有角色的列表?(不仅是与当前用户相关联的对象,还有角色表中的所有对象。)

2) 我需要什么形式的输入代码来显示包含所有可能角色的复选框,并将当前用户权限(在我的UserRoles表中)显示为已签出?我想我的表格中需要这样的东西:

 echo $this->Form->select('User.Role', $options, ['multiple' => 'checkbox']);

但我不知道$options应该是什么,以及如何设置已经选择的值。

我当前正在使用要编辑的用户对象拉取角色:

    $user = $this->Users->get($id, [
        'contain' => ['Roles'],
        'Users.id' => $this->Auth->user('id')
    ]);

但我在将其转换为复选框表单选择时遇到了问题。

非常感谢。

为了创建一些选项的复选框列表,您首先需要从控制器发送选项:

$this->set('roles', $this->Users->Roles->find('list'));

然后,在模板中添加multiple => checkbox输入:

echo $this->Form->input('roles', ['multiple' => 'checkbox', 'options' => $roles]);

不必在输入名称前面加上User.,只需将输入命名为用户实体的属性即可。