Elisseii
@Elisseii
Пишу музыку и код.

October CMS: Как скрывать (фильтровать) записи в Backend контроллере плагина, опираясь на группы пользователя?

Я создал небольшой плагин для October CMS с помощью Rainlab.Builder.
Он состоит из 2х моделей/контроллеров/таблиц в БД.

Branches - Филиалы.
таблица плагина: elisseiidev_branchmanagement_branches

Groups - Группы пользователей (менеджеров).
Стандартная таблица October CMS: backend_user_groups

При этом я использую ещё одну дополнительную таблицу для того что бы по ID связать записи в Branches с записями в Groups. Модель Groups берёт данные из стандартной October CMS таблички backend_user_groups

Объясню подробнее.

В RainLab.Builder сделал следующее:
1) Создал новое поле в модели Branches, Type: "Relations", Field name: groups
2) Создал таблицу в базе данных: elisseiidev_branchmanagement_branches_groups
3) Добавил в код модели Branches следующее:
public $belongsToMany =[ 
    'groups' =>[ 
        'Elisseiidev\BranchManagement\Models\Groups', 
        'table' => 'elisseiidev_branchmanagement_branches_groups', 
        'order' => 'name'
    ]
];

Сейчас в табличку записываются group_id и branch_id и таким образом они связываются. Это позволяет при создании новой записи в модели Branches указывать к какой группе пользователей относится данная запись (Branch).

Теперь Вопрос:
В Backend плагина мне необходимо скрыть все записи кроме тех, которые доступны текущему менеджеру.
Нужно использовать следующую логику:

Если code/slug роли текущего пользователя = 'manager', а так же пользователю присвоена хоть одна группа, то... Создаём переменную $userGroups и записываем в неё code/slug группы или нескольких групп, к которым относится текущий пользователь. Далее скрываем все записи, кроме тех, которые прикреплены к группе, название которой совпадает с названием группы текущего пользователя.

Надеюсь понятно это всё объяснил.
Подозреваю что нужно как то расширить контроллер, но не знаю как именно.

Как выводить записи с проверкой наличия какого либо value в колонке я понимаю)
А вот как выводить с проверкой зависимостей? Что то я уже в конец запутался))
Вот видел что-то похожее но не понял до сих пор как оно должно работать.

Заранее спасибо за ваше время.
  • Вопрос задан
  • 746 просмотров
Решения вопроса 1
Elisseii
@Elisseii Автор вопроса
Пишу музыку и код.
В общем я остановился на таком решении используя listExtendQuery() и eloquent методы.
Правда немного скорректировал названия моделей, что бы названия были в единственном числе без окончания "s".
И так, поехали, здесь я рассмотрю свой случай:
  • Создаем таблицу "elisseiidev_branchmanagement_branches" и модель "Branche" (имя в ед. числе, без "s").
  • Cоздаем промежуточную таблицу "elisseiidev_branchmanagement_branches_groups" с колонками "branche_id" и "user_group_id". Промежуточная таблица необходима для наших Relations связей.
  • Создаем для модели Branche наш fields.yaml, columns.yaml, контроллер с именем "Branches", менюшки и все такое как обычно.
    Добавляем поле Relations с именем "branches_groups" для модели Branche.
  • Теперь идем в файл модели Branche.php и настраиваем отношения для нашего Relations поля. Я хочу связать его с группами пользователей (за них отвечает стандартная модель октября).
    public $belongsToMany = [
        'branches_groups' => [
            Backend\Models\UserGroup::class, 
            'table' => 'elisseiidev_branchmanagement_branches_groups',
            'order' => 'name'
        ]
    ];

    После этого можно проверить работу поля на странице плагина, там появятся для выбора все существующие группы пользователей, уже можно к примеру указать несколько групп и привязать любую запись к ним.

  • Теперь нам нужно настроить запрос вывода записей в backend списке модели Branches. Наша цель показывать пользователям с ролью "manager" только те записи, которые скреплены с их группой или групами (их может быть несколько).
    По этому идем в код контроллера Branches.php и наконец-то добавляем наш запрос предварительно проверив наличие строчки use BackendMenu; в самом верху.
    И так, пишем:
    public function listExtendQuery($query) {
        $backendUser = \BackendAuth::getUser();
        $userGroupsId = $backendUser->groups->pluck('id')->toArray();
    
        $user_is_manager = $backendUser->role->code === 'manager' ? true : false;
    
        if ($user_is_manager) {        
            $query->whereHas('branches_groups', function ($q) use ($userGroupsId){
                $q->whereIn('user_group_id', $userGroupsId);
            });
        }
    }

    Этот код проверяет наличие роли "manager" у текущего пользователя, собирает id всех групп, в которых состоит пользователь, и далее делает запрос к базе собирая только те записи, которые скреплены с этими группами.
    Если таких записей не существует то пользователь вообще не увидит записей соответственно.


Это всё! Наслаждаемся результатом и спим спокойно, так как менеджеры-секретарши не получат доступа к редактированию всех записей в Branche, а смогут редактировать только те, на которые у них есть разрешения.

Остается только скрыть всякие кнопки создания и удаления итд для определённых ролей пользователей и настроить другие мелочи. Но это уже другая тема.

Может кому то это пригодится:) Всем удачи!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Комментировать
@talas1234
$q->whereIn('groups.code', $codes);
что это за поле в таблице?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы