代码总是有帮助的,但如果我理解正确,我会做类似的事情来显示用户消息;我设置了一个初始过滤器以仅查找发送给登录用户的消息,然后我还需要让用户按主题和发件人过滤消息。我不知道您的模型或标准的名称,所以这里有一个简化的例子来说明我是如何做到的:
控制器:
public function actionIndex()
{
$model = new Message('search');
$model->unsetAttributes();
if(isset($_GET['Message']))
$model->attributes = $_GET['Message'];
// Set default filter
$model->msg_to = Yii::app()->user->id;
$this->render('index', array('model' => $model));
}
看法:
$this->widget('zii.widgets.grid.CGridView', array(
'id'=> 'message-grid',
'dataProvider'=> $model->search(),
'filter'=> $model,
));
模型:
public function search()
{
$criteria = new CDbCriteria;
$criteria->compare('from',$this->from);
$criteria->compare('msg_to',$this->msg_to);
$criteria->compare('from_name',$this->from_name,true);
$criteria->compare('subject',$this->subject,true);
$criteria->compare('body',$this->body,true);
$criteria->compare('read',$this->read);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'pagination'=>array('pageSize'=>15),
));
}
如果默认过滤器的标准非常复杂,最好的办法是在模型中创建一个命名范围,如下所示:
public function scopes()
{
return array(
'inbox' => array(
'condition' => 't.msg_to = :user_id',
'params' => array(':user_id' => Yii::app()->user->id),
'order' => 'min(t.read) ASC, t.posted_on DESC',
),
);
}
要使用该范围,您将$model->inbox()->search()
在 CGridView 中编写而不是$model->search()
您还应该删除该$model->msg_to = Yii::app()->user->id;
行
最后一件事:如果您的条件需要用户输入,例如通过 $_GET 变量,您可以使用“参数化命名范围”。请参阅此页面上的部分:http ://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes您将以相同的方式使用它们:$model->inbox()->search()