Индивидуальный флажок FormHelper для отношения hasMany
Я в настоящее время строю форму, где Permissions
назначены на Roles
через отношения Принадлежит ко многим. В настоящее время это мой вид добавления роли. Мне удалось получить несколько флажков и ассоциацию, работающую с помощью:
echo $this->Form->input('Roles.permissions._ids', [
'label' => false,
'type' => 'select',
'multiple' => 'checkbox',
'options' => $permissions
]);
Это сработало, но список Permissions
растет и нуждается в какой-то организации. Итак, теперь я использовал map / lower, чтобы сгруппировать эти разрешения по полю категории, и это работает, чтобы перейти в представление. N
Моя проблема существует, когда я пытаюсь вручную перебрать каждый Permission
результат и назначить идентификатор объекта и метку для различных входов флажка по всему представлению, но в том же массиве.
Вот самое близкое, что я могу сделать, к фактическому размещению значений в правильном формате для _ids
Массив для сохранения ассоциации ownToMany:
echo $this->Form->input('Roles.permissions._ids[]', [
'id' => 'roles-permissions-ids-' . $permission->PermissionId,
'type' => 'checkbox',
'label' => $permission->DisplayName,
'value' => $permission->PermissionId,
'hiddenField' => false
]);
Это позволяет выборкам заканчиваться в правильном массиве и превращаться в объединенную сущность, но выдает следующее предупреждение:
Примечание (8): преобразование массива в строку [CORE\src\View\Widget\CheckboxWidget.php, строка 80]
Данные, введенные в форму, не возвращаются во входные данные формы, но, похоже, верны везде. Я попытался вручную добавить скрытый ввод, настроить идентификаторы ввода и почти все остальное. Это лучший способ получить правильные данные.
После просмотра исходного кода CakePHP (в версии 3.1.11) на CheckboxWidget
Я заметил, что функция isChecked возвращает 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'];
}
Если кто-то знает, что я делаю что-то не так или это ошибка в фреймворке, это очень мне поможет.
1 ответ
Ваш input
вызов метода должен выглядеть
echo $this->Form->input('permissions._ids', [
'label' => false,
'type' => 'select',
'multiple' => 'checkbox',
'options' => $permissions,
'hiddenField' => false
]);
Roles
должны быть удалены.