Индивидуальный флажок 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 должны быть удалены.

Другие вопросы по тегам