alexsobolenko
@alexsobolenko
Программист

Как правильно настроить фильтр по ролям в SonataAdminBundle?

Перелопатил документацию SonataAdminBundle, но ничего не нашел подходящего.

Если указывать в configureDatagridFilters вот так:
$datagridMapper->add('roles');
фильтр работает хорошо всегда, кроме одного случая - при выборе advanced filters и is equal to
5d28c54a9765b405660929.png
всё из-за мудреной формы записи ролей в базу данных: a:1:{i:0;s:9;"ROLE_USER";}

Я решил использовать колбэк для поиска
$datagridMapper
            ->add(
                'roles',
                CallbackFilter::class,
                [
                    'operator_type' => TextType::class,
                    'callback' => [$this, 'filterByRoles'],
                ]
            );

и функцию реализовал, но
5d28c7e4ee940175340578.png
здесь пропал селект. Думаю, что я указал что-то не так в configureDatagridFilters, но никак не могу понять что.

Собственно, фильтр работает как надо, только заменить текстовое поле (на второй картинке) на селект, как на первой картинке.
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
alexsobolenko
@alexsobolenko Автор вопроса
Программист
$datagridMapper->add(
                'roles',
                CallbackFilter::class,
                [
                    'operator_type' => ChoiceType::class,
                    'callback' => [$this, 'filterByRoles'],
                    'operator_options' => [
                        'choices'=> [
                            "contains" => 1,
                            "not contains" => 2,
                            "is equals to" => 3,
                        ],
                    ],
                ],
                ChoiceType::class,
                [
                    'choices' => [
                        'USER' => 'ROLE_USER',
                        'ADMIN' => 'ROLE_ADMIN',
                        'SUPPORTER' => 'ROLE_SUPPORTER',
                        'COPYWRITER' => 'ROLE_COPYWRITER',
                        'SUPER_ADMIN' => 'ROLE_SUPER_ADMIN',
                    ],
                    'multiple' => true,
                ]
            );
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mad_maximus
@mad_maximus
Если что, роли необязательно хранить так, как говорит симфони в документации. Это могут быть и простые строки. Важно только то, как вы вернете роли для симфони. Чтобы сильно не мучиться, можно сделать так:

->add('role', ChoiceType::class, [
                'choices' => [
                    'Пользователь' => Role::ROLE_USER,
                    'Автор' => Role::ROLE_AUTHOR,
                    'Редактор' => Role::ROLE_EDITOR,
                    'Главред' => Role::ROLE_CHIEF_EDITOR,
                    'Администратор' => Role::ROLE_ADMIN,
                ],
                'required' => false,
                'placeholder' => 'Роль',
            ])
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы