我有一个标准的Gii创建的管理视图,它使用CGridView,它显示我的用户表数据。
问题是名称为“root”的用户必须不可见。
有没有办法在条件“...和用户名!='root'”中添加静态?
admin.php [查看]
'columns'=>array(
'id',
'username',
'password',
'realname',
'email',
.....
user.php [model]
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('username',$this->username,true);
$criteria->compare('password',$this->password,true);
$criteria->compare('realname',$this->realname,true);
$criteria->compare('email',$this->email,true);
......
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
答案 0 :(得分:7)
您可以像这样使用CDbCriteria's addCondition:
$criteria->addCondition("username !='root'");
答案 1 :(得分:6)
您最好的选择是使用Yii scopes,它基本上是一个保存的where子句(或现有标准的其他修改),您可以在整个应用中应用,只需要在一个地方更改,如果您的标准最后会改变。
使它们更酷的原因是你可以将它们与其他范围/标准变化(例如来自网格中的用户)一起串起来,而不必跟踪哪些标准条款被更改所改变。
可能适用于您的情况的一些示例。在你的控制器中你可能有这样的东西:
$users = User::model()->search()->findAll();
Asgaroth的答案回答了你在表面上提出的要求。但是你可以使用范围做更多的事情(并且很容易)。
如果您将以下内容添加到您的用户模型中:
class User extends CActiveRecord
{
......
public function scopes()
{
return array(
'active'=>array(
'condition'=>'active=1',
),
'isAdmin'=>array(
'condition'=>'isAdmin=1',
),
);
}
}
然后您可以在控制器中检索活动用户(仍然应用用户的过滤器):
$users = User::model()->active()->search()->findAll();
或者您可以检索所有活动的管理员用户(不会按照您的gridview标准进行过滤),如下所示:
$users = User::model()->active()->isAdmin()->findAll();
默认范围只是同一想法的扩展:
class User extends CActiveRecord
{
public function defaultScope()
{
return array(
'condition'=>"username != 'root'",
);
}
}
如果在您的isAdmin范围之前返回root用户,则应用默认范围将从返回的模型中删除root用户,因为它适用于您所做的每个User :: model()查询。