我使用Yii Framework,我希望按用户列表的状态进行过滤。状态由数字定义:
因此显示正确的状态我使用函数itemAlias():
public static function itemAlias($attribute, $value=null) {
$_items = array(
'status' => array(
'0' => Yii::t("status", 'Enabled'),
'1' => Yii::t("status", 'Banned'),
'2' => Yii::t("status", 'Disabled'),
),
);
if (isset($value))
return isset($_items[$attribute][$value]) ? $_items[$attribute][$value] : false;
else
return isset($_items[$attribute]) ? $_items[$attribute] : false;
}
因此,当查看用户时,我会显示状态良好(例如:“已启用”),但是当我想按状态过滤时,我必须使用1,2或3进行过滤。
我想知道是否可以按状态过滤(有效,禁用,禁用)?
答案 0 :(得分:4)
当然有可能。 您可以创建以下范围:
public function scopes()
{
return array(
'enabled' => array(
'condition' => 'status=0',
),
'banned' => array(
'condition' => 'status=1',
),
);
}
然后在你的查询中你会有类似的东西:
$activeUsers = User::model()->enabled()->findAll();
$bannedUsers = User::model()->banned()->findAll();
此外,您可以使用命名范围:
public function statusIs($status)
{
// you can accept a status string here and translate it in an integer, your choice.
return $this->getDbCriteria()->mergeWith(array(
'condition' => 'status = '.(int)$status
));
}
并在您的查询中使用它,如:
User::model()->statusIs(0)->findAll();// get all enabled
此外,使用范围您也可以查询相关模型,例如:
Posts::model()->with('users:enabled')->findAll();
也应该有用。
只需查看http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes并了解详情。
L.E:
public function getStatuses()
{
return array(
'0' => Yii::t("status", 'Enabled'),
'1' => Yii::t("status", 'Banned'),
'2' => Yii::t("status", 'Disabled'),
);
}
public function getStatusesDropDown(array $htmlOpts = array())
{
return CHtml::activeDropDownList($this, 'status', $this->getStatuses(),$htmlOpts);
}
现在您有下拉代码,在您的CActiveForm或任何其他表单中显示此状态,如下所示:
echo $model->getStatusesDropDown();
当您从下拉列表中选择状态并提交表单时,将提交名为YourModel[status]
的输入。这将具有值0或1或2.接下来,在您search()
方法中,您必须:
public function search()
{
$criteria = new CDbCriteria;
[...]
if ($this->status !== null && (int)$this->status >= 0) {
$criteria->compare('status', (int)$this->status);
}
[...]
}
这就是它。