hasMany 关系的 FormHelper 单个复选框

FormHelper individual checkbox for hasMany relation

我目前正在构建一个表单,其中 Permissions 通过属于对多关系分配给 Roles。这目前在我的添加角色视图中。我设法让多个复选框和关联工作通过使用:

echo $this->Form->input('Roles.permissions._ids', [
    'label' => false,
    'type' => 'select',
    'multiple' => 'checkbox',
    'options' => $permissions
]);

这行得通,但是 Permissions 的列表正在增长,需要某种组织。所以现在我已经使用 map/reduce 按类别字段对这些权限进行分组,并且可以传递到视图中。 N

当我尝试手动遍历每个 Permission 结果并将实体 ID 和标签分配给整个视图中不同的复选框输入时,我的问题就出现了,但在同一个数组中。

这是我能得到的最接近实际将值以正确格式放入 _ids 数组以保存 belongsToMany 关联的方法:

echo $this->Form->input('Roles.permissions._ids[]', [
    'id' => 'roles-permissions-ids-' . $permission->PermissionId,
    'type' => 'checkbox',
    'label' => $permission->DisplayName,
    'value' => $permission->PermissionId,
    'hiddenField' => false
]);

这允许选择在正确的数组中结束并使其进入合并的实体,但它会引发以下警告:

Notice (8): Array to string conversion [CORE\src\View\Widget\CheckboxWidget.php, line 80]

在表单中输入的数据不会返回到表单输入中,但在其他地方似乎都是正确的。我试过手动添加隐藏输入、调整输入 ID 以及几乎所有其他操作。这是我将数据正确 post 的最佳方式。

CheckboxWidget 查看 CakePHP 源代码(版本 3.1.11)后,我注意到 isChecked 函数 returns return (string)$data['val'] === (string)$data['value']; 但不知何故它正在获取整个数组。

我在 return 语句之前进行了修改,它在技术上是可行的,但显然不是正确的长期解决方案:

if (is_array($data['val'])) {
    // value was right, so just copy it over to val
    $data['val'] = $data['value'];
}

如果有人知道我是否做错了什么或者这是框架中的错误,那将对我有很大帮助。

您的 input 方法调用需要类似于

echo $this->Form->input('permissions._ids', [
    'label' => false,
    'type' => 'select',
    'multiple' => 'checkbox',
    'options' => $permissions,
    'hiddenField' => false
]);

需要删除 Roles