Двойной список с CollectionType/ChoiceType для пользовательских ролей

С Symfony 4 у меня нет этой проблемы: простая форма для выбора или редактирования роли пользователя со списком.

Поскольку я начинаю новый проект с Symfony 5 (с тем же кодом), когда редактирую профиль пользователя, у меня есть двойной список, подобный этому:

Пример формы

Одна часть User FormType:

$roles = [User::USER_DEFAULT => 'Simple User',
            User::USER_ADMIN_APP => 'App. Admin',
            User::USER_ADMIN_PROJECT => 'Project Admin',
            User::USER_ADMIN => 'Administrator'];

$builder->add('username')
            ->add('roles', CollectionType::class, [
                'label' => 'Roles', 'required' => true, 'entry_type' => ChoiceType::class,
                'entry_options' => ['label' => false, 'choices' => array_flip($roles)],])
            ->add('password')
            ->add('email')
            ->add('save', SubmitType::class);

В базе у меня есть классический формат json для ролей пользователей

#[ORM\Column(type: 'json')]
private $roles = [];

Некоторые данные из прибора, который я создал:

База данных

Я создал свежий пример GitHub на этой странице: формы-тесты-с-CollectionType

Я знаю, я что-то пропустил, но что?? Должен ли я использовать Data Transformers или Mappers иметь только один выбор списка?

Спасибо за ваши фары. ;)

Обновление от 04.05.2022:

Из моего старого проекта SF4 в новый проект SF5 единственное изменение для поля Roles — «Array» на «Json» в Doctrine:

//Migration file with "Json"
roles CLOB NOT NULL --(DC2Type:json)

//Migration file with "Array"
roles CLOB NOT NULL --(DC2Type:array)

Теперь у меня есть новый формат в базе данных для поля «Роли» с «Массивом»:

a:1:{i:0;s:14:"ROLE_ADMIN_APP";}

Раньше с «Json» с моей ошибкой в ​​приспособлении «ROLE_USER»:

["ROLE_USER","ROLE_ADMIN_APP"]

И с этим изменением у меня есть один список с ТОЛЬКО ОДНИМ ВЫБОРОМ для пользователя:

<select id = "user_roles_0" name = "user[roles][0]">
   <option value = "ROLE_USER">Simple User</option>
   <option value = "ROLE_ADMIN_APP">App. Admin</option>
   <option value = "ROLE_ADMIN_PROJECT" selected = "selected">Project Admin</option>
   <option value = "ROLE_ADMIN">Administrator</option>
</select>

Наконец, я могу создать или отредактировать пользователя с CollectionType и ChoiceType с несколькими ролями...

Надеюсь, это поможет будущим разработчикам/нубам вроде меня;)

Ваше здоровье !

Просто сделайте это как ChoiceType::class вместо CollectionType::class.. Также установите multiple => true.

Bossman 02.05.2022 16:20

Спасибо, это работает, но с несколькими вариантами выбора... Я не хочу (для пользователей) показывать строку с несколькими ролями. С моим первым кодом в SF4 все работает нормально. Я потерялся.. :(

Mick3DIY 03.05.2022 08:29

Не уверен, что понимаю, что вы имеете в виду, установите multiple => false, если вы не хотите, чтобы они выбирали несколько ролей..

Bossman 03.05.2022 11:31

При множественном => false у меня появляется предупреждающее сообщение «Преобразование массива в строку», нормально. Я перезагрузил свой мозг и начал с базы данных...

Mick3DIY 04.05.2022 10:44
JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
0
4
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать это:

$roles = [
    'Super Admin' => 'ROLE_SUPER_ADMIN',
    'Admin' => 'ROLE_ADMIN',
    ...
];

$builder->add('roles', ChoiceType::class, [
    'label' => 'form.label.role',
    'choices' => $roles,
    'required' => true,
    'multiple' => true,
    'expanded' => false
]);

Мой key => value перевернут, и я использую ChoiceType напрямую.

Спасибо, Томас, как я сказал Боссману, я не хочу показывать пользователям множественный выбор. Что-то изменилось в SF5/Form, потому что мой первый код хорошо работает в SF4. Продолжение следует... Я ищу в документах любые обновления об этом выборе формы... :)

Mick3DIY 03.05.2022 08:32

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