Yii2 Gridview按权限过滤

时间:2015-09-28 15:02:33

标签: php gridview yii2 yii2-model

我有一个超级管理员,可以创建用户并为每个用户分配特定的位置。这存储在一个简单的表中,我们在其中获取用户的ID和位置的ID。

然后,我有一张客户表。每个客户端还有一个名为loc_id的位置。我如何进行过滤,以便在Gridview中用户只能看到居住在用户有权查看的位置的客户端(用户是一种可以操纵其辖区内客户端数据的管理员)?

我通过

获取用户ID
$userId = \Yii::$app->user->identity->id

然后找到他可以用

查看的位置
$userLocation = Userlocations::find()-where(['user_id' => $userId])->all();

但是现在我如何将它应用于带有搜索模型和DataProvider的标准Gridview,以便我仍然可以通过其他属性对GridView进行过滤和排序?

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

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

1 个答案:

答案 0 :(得分:1)

首先在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]);