2013-05-28 2 views
3

Я использую Yii Framework и хочу фильтровать по статусу список моих пользователей. Статус определяется номером:Как фильтровать мой список пользователей по статусу? - 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; 
} 

Поэтому при просмотре пользователей у меня отображается хороший статус (например: «Включено»), но когда я хочу фильтровать по sta tus Мне нужно фильтровать 1, 2 или 3.

Я хотел знать, можно ли фильтровать по статусу (активным, запрещенным, отключенным)?

ответ

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 и узнайте больше.

LE:

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

И это довольно много его.

+0

Благодарим за отзыв. Но теперь я хочу использовать это исследование в функции search() моей модели, чтобы использовать $ criteria-> compare (status, this-> status). Не могли бы вы рассказать мне, как вы это делаете? – Florent

+0

определите выпадающий список со значениями 0,1,2 и именами ваших статусов, а затем, когда ваш метод поиска() будет извлекать значения, и вы можете напрямую сравнить их, как указано выше. – Twisted1919

+0

Извините, но может вы даете мне пример кода? – Florent

 Смежные вопросы

  • Нет связанных вопросов^_^