3

我使用 Yii 框架,我想按状态过滤我的用户列表。状态由一个数字定义:

  • 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 进行过滤。

我想知道是否可以按状态(活动、禁止、禁用)进行过滤?

4

1 回答 1

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并查看更多信息。

乐:

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

差不多就是这样。

于 2013-05-28T12:21:43.753 回答