Yii2 Gridview фильтр по разрешению

У меня есть супер администратор, который может создавать пользователей и назначать определенные места для каждого пользователя. Это хранится в простой таблице, где мы получаем идентификатор пользователя и идентификатор местоположения.

Затем у меня есть таблица клиентов. У каждого клиента также есть местоположение с именем loc_id. Как я могу фильтровать так, чтобы в Gridview пользователь мог видеть только клиентов, которые живут в местоположении, на которое у пользователя есть разрешение на просмотр (пользователь — это своего рода администратор, который может манипулировать данными клиента в своей юрисдикции)?

Я получаю идентификатор пользователя

$userId = \Yii::$app->user->identity->id

а затем найти места, которые он может просматривать

$userLocation = Userlocations::find()-where(['user_id' => $userId])->all();

Но теперь, как я могу применить это к стандартному Gridview с моделью поиска и DataProvider, чтобы я все еще мог фильтровать и сортировать GridView по другим свойствам?

$searchModel = new AsociatiiSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);

2

Решение

Сначала внутри вашего класса AsociatiiSearch вам нужно добавить открытый атрибут:

class AsociatiiSearch {
public $userLocation;
...

Затем внутри действия вашего контроллера вы найдете userLocation:

$userId = \Yii::$app->user->identity->id
$userLocation = Userlocations::find()-where(['user_id' => $userId])->all();
$searchModel = new AsociatiiSearch();
$searchModel->userLocation = $userLocation;

$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);

Наконец, в методе поиска AsociatiiSearch вы можете просто добавить еще один фильтр, используя глобальный userLocation:

$query->andFilterWhere(['userLocation' => $this->userLocation]);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]