如何按状态过滤我的用户列表? - Yii

时间:2013-05-28 12:14:14

标签: php yii-extensions yii yii-components

我使用Yii Framework,我希望按用户列表的状态进行过滤。状态由数字定义:

  • 0:已启用
  • 1:禁止
  • 2:已停用

因此显示正确的状态我使用函数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进行过滤。

我想知道是否可以按状态过滤(有效,禁用,禁用)?

1 个答案:

答案 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);
    }
    [...]
}

这就是它。