В предыдущей статье мы познакомились с общими механизмами RBAC. Здесь же мы рассмотрим один из прикладных вопросов, связанных с интерфейсом пользователя.
Как известно большинство web приложений имеют так называемую админ панель, в которой осуществляется работа в том числе с учётными записями пользователей. Эта статья посвящена тому, как правильно реализовать сортировку и поиск пользователей по ролям если для этого используется стандартный виджет GridView.
Итак, первое, что необходимо сделать для подключения сортировки и поиска, создать модели для таблиц auth_item (роли) и auth_assignment (назначение ролей пользователям). Проще всего это сделать при помощи gii, тем более доработка этих моделей нам не потребуется.
После создания моделей в классе, отвечающем за хранение информации о пользователях в базе данных, необходимо прописать связь с таблицей auth_assignment. Например:
1 2 3 |
public function getauth_assignment(){ return $this->hasMany(AuthAssignment::className(), ['user_id' => 'id']); } |
Далее в классе модели, отвечающем за поиск и сортировку (его имя начинается с Search (например, SearchUsers)) в методе search получаем данные из созданных нами в самом начале моделей при помощи метода joinWidth.
1 2 3 4 |
$query->joinWith([ 'auth_assignment', 'auth_assignment.itemName' ]); |
Здесь auth_assignment.itemName обозначает связь таблиц auth_assignment и auth_item.
Для сортировки используем способ, описанный в статьях [1] и [2].
1 2 3 4 5 6 7 8 9 10 11 12 |
public $roleName; . . . $dataProvider->sort->attributes['roleName'] = [ 'asc' => [ 'auth_assignment.item_name' => SORT_ASC, 'username' => SORT_ASC ], 'desc' => [ 'auth_assignment.item_name' => SORT_DESC, 'username' => SORT_ASC ] ]; |
В данном примере мы выполняем сортировку одновременно по двум полям. Имени роли (см. [3]) и имени пользователя (по нему всегда по возрастанию). При желании можно использовать иначе в соответствии требованиями конкретной задачи.
Поиск реализуем согласно способу из [2]. В нижеприведённом примере поиск осуществляется по полю description таблицы auth_item, в котором содержится название роли понятное для пользователя.
1 2 3 4 |
$query->andFilterWhere([ 'like', 'auth_item.description', $this->roleName ]); |
На этом подключения сортировки и поиска ролей в GridView для модуля RBAC можно считать завершённым. Код для GridView не приводится, так как он аналогичен [3].
Таким не особо хитрым образом можно «подружить» админ панель со стандартным GridView со стандартным же модулем RBAC.
Источники
- GridView и связанные таблицы в Yii 2;
- Использование псевдонимов связанных таблиц в Yii 2;
- Настраиваем доступ к web приложению на основе ролей Yii 2. Часть 1. Общие механизмы работы.
Добавить комментарий