Форма Symfony — тип коллекции с флажками внутри

Я использую Symfony 5, я хочу иметь страницу «Редактирование пользователя» в администрировании, на которой я буду менять роли пользователей, я хочу, чтобы флажки определяли, какую роль назначить пользователю, поэтому для этого мне нужен Тип коллекции с CheckboxType запись внутри (если я прав), но сначала я не могу использовать массив пользовательских ролей как значение для типа коллекции

$builder
        ->add('roles', CollectionType::class, [
            'entry_type' => CheckboxType::class,
            'entry_options' => [
                'required' => false,
            ],
        ])

Это выдает ошибку

Невозможно преобразовать значение для пути свойства "[0]": ожидается логическое значение.

после этого я попытался использовать модельный преобразователь для изменения значения, ниже приведен код, как я это сделал

$builder->get('roles')
        ->addModelTransformer(new CallbackTransformer(
            function($rolesAsArray){
                $rolesAsArray = array_flip($rolesAsArray);
                foreach($rolesAsArray as &$role){
                    $role = true; // I also tried to set key instead of value - true
                }
                return $rolesAsArray;
            },
            function($rolesAsString){
                dump($rolesAsString);die;
            }
        ));

После этого я не получил ошибку, но я получаю форму с этим видом

скриншот ошибки

Поэтому у меня нет возможности изменить метки, и даже я отправляю форму с этими полями, она выдает ошибку

Ожидаемый аргумент типа "массив", "нуль", указанный в пути свойства "роли".

Я нашел способ сделать это с помощью Select Box, но я не нашел способа сделать это с помощью Checkbox.

Если у вас есть какие-либо идеи, скажите мне, пожалуйста.


person Ashot Hayrapetyan    schedule 06.04.2020    source источник


Ответы (1)


Вы можете использовать ChoiceType :

$builder->add('roles', ChoiceType::class, array(
                'label' => 'form.label.role',

                'choices' => User::ROLES,
                'choice_translation_domain' => 'user',
                'multiple'  => true,
                'expanded' => true,
                'required' => true,
                ));

В объекте пользователя:

const ROLES = array(
    'roles.admin' => 'ROLE_ADMIN',
    'roles.secretary' => 'ROLE_SECRETARY',
    'roles.user' => 'ROLE_USER'
);
person threeside    schedule 14.04.2020
comment
нет, мне нужно иметь несколько ролей, с полем выбора я уже сделал, это не так сложно, вопрос в том, чтобы этот функционал был с флажками - person Ashot Hayrapetyan; 15.04.2020
comment
У вас есть несколько ролей с флажком, когда вы используете ChoiceType с несколькими = истинными и расширенными = истинными, я использую его для своих пользовательских ролей - person threeside; 15.04.2020