在我的系统中,我有 3 种类型的用户,Admin,Supervisor和Normal user。每种类型的用户都有一个主管,主管本身就是另一个用户。
假设我们有两个表,users
并且documents
关系如下:
这里的documents
表格是users
按user_id
列与表格相关的。
在我的系统中,我有一个Documents
基于登录用户类型的 CGridview 模块。如果登录的用户类型是Admin,那么它会显示表的所有条目document
。
如果登录的用户类型是Supervisor,那么它将只显示documents
表中的那些条目,其中documents.user_id
等于 those users.user_id
, who users.sp_id = LoggedInUser
,如果我不能清楚地表达,对不起。
我可以通过在模型中使用关系在 CGridview 中显示数据Documents
。
public function relations(){
'users' => array(self::BELONGS_TO, 'Users', 'user_id'),
}
在 Document
模型中我声明了两个自定义函数来返回所需的 DataProvider。那些是:
public function searchByUser($id)
{
$criteria=new CDbCriteria;
$criteria->condition = "user_id=$id";
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>array(
'defaultOrder'=>'doc_id DESC',
),
));
}
和
public function searchBySupervisor($supervisor_id)
{
$criteria=new CDbCriteria;
$criteria->with=array('users');
$criteria->compare('user_id',$this->user_id,true);
$criteria->condition = "sp_id=$supervisor_id AND status='active'";
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>array(
'defaultOrder'=>'doc_idDESC',
),
));
}
在我/documents/admin
看来,我 在 CGridview 中使用基于登录用户的 dataProvider :
if ($UserType=="Normal_User"){
$this->widget(
'booster.widgets.TbGridView', array(
'type' => 'striped bordered condensed',
'dataProvider'=>$model->searchByUser(Yii::app()->user->getId()),
elseif($UserType == "supervisor"){
$this->widget(
'booster.widgets.TbGridView', array(
'type' => 'striped bordered condensed',
'dataProvider'=>$model->searchBySupervisor(Yii::app()->user->getId()),
一切正常,除了我的搜索功能不工作。如果我以主管身份登录,则意味着如果我使用:'dataProvider'=>$model->searchBySupervisor(Yii::app()->user->getId()),
dataprovider,我的高级搜索选项不会根据搜索参数过滤 gridview,它返回相同的数据。