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
。
我目前正在构建一个表单,其中 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
。