Symfony Форма - Тип коллекции с флажками внутри - PullRequest
2 голосов
/ 06 апреля 2020

Я использую 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;
            }
        ));

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

screenshot of error

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

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

Я нашел способ сделать это с помощью Выбрать поле , но я не могу найти способ сделать это с помощью флажка.

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

1 Ответ

0 голосов
/ 15 апреля 2020

Вы можете использовать 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'
);
...