簡體   English   中英

如何在Yii中為ENUM列實現CGridView表的過濾?

[英]How to implement filtering of a CGridView table for an ENUM columnt in Yii?

在Yii應用程序中,我將數據顯示為表格。 我使用CGridView ,它為我處理(基於搜索的)數據過濾器和排序。 有用。

現在,我向user數據庫表添加了一個ENUMstatus 在網格中,我可以對此進行排序和過濾,但只能按表中的值進行。 好吧,這很有道理。 但是用戶實際上並不知道如何將其保存在數據庫中並與標簽一起使用(並希望對其進行排序和過濾)。

有沒有一種方法可以通過Yii中的ENUM數據庫表列通過自定義標簽提供排序和篩選(使用CActiveRecord模型和CGridView生成的數據網格)?


數據庫表

CREATE TABLE `users` (
    `userid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `email` varchar(45) NOT NULL,
    ...
    `status` enum('processed', 'waiting') NOT NULL,
    PRIMARY KEY (`userid`),
    UNIQUE KEY `email_UNIQUE` (`email`)
);

User模型

/**
 * ...
 * @property string $userid
 * @property string $email
 * ... 
 * @property string $status
 */
class User extends CActiveRecord
{

    public function tableName()
    {
        return 'users';
    }

    public function getFirstAndLastName(){
        return CHtml::encode($this->firstname." ".$this->lastname);
    }

    public function rules()
    {
        return array(
            ...
            array('userid, email, status', 'safe', 'on'=>'search'),
        );
    }

    public function attributeLabels()
    {
        return array(
            'userid' => 'Userid',
            'email' => 'Email',
            ...
            'status' => Yii::t('app', 'status'),
        );
    }

    public function relations()
    {
        return array(
            ...
        );
    }

    public function search()
    {
        $criteria=new CDbCriteria;

        $criteria->compare('userid',$this->userid,true);
        $criteria->compare('email',$this->email,true);
        ...
        $criteria->compare('status',$this->status,true);

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
            "pagination"=>array(
                "pageSize"=>25
            )
        ));
    }

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    protected function beforeSave()
    {
        return parent::beforeSave(); // TODO: Change the autogenerated stub
    }

    public function getProcessingStatus()
    {
        return Yii::t('app', $this->processing_status);
    }

}

UserController

class UserController extends Controller
{
    ...

    /**
     * Manages all models.
     */
    public function actionAdmin()
    {
//        Yii::app()->cache->flush();
        $model=new User('search');
        $model->unsetAttributes();  // clear any default values
        if(isset($_GET['User']))
            $model->attributes=$_GET['User'];

        $this->render('admin',array(
            'model'=>$model,
        ));
    }

    ...

}

視圖

...

<?php
$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'user-grid',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'columns' => array(
        'email',
        'status',
        array(
            'class' => 'CButtonColumn',
            'template' => '{view}{update}',
            'buttons' => array(
                'view' => array(
                )
            ),
        ),
    ),
));

您可以在CDataColumn指定自定義過濾器,方法是將filter屬性設置為數組。 這將導致一個下拉列表過濾器而不是文本字段過濾器。

例:

<?php
$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'user-grid',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'columns' => array(
        'email',
        array(
            'name' => 'status',
            'filter' => array(
                'processed' => 'Processed',
                'waiting' => 'Waiting',
            ),
        ),
        array(
            'class' => 'CButtonColumn',
            'template' => '{view}{update}',
            'buttons' => array(
                'view' => array(
                )
            ),
        ),
    ),
));

還查看文檔

模型:

class User extends CActiveRecord {

  const STATUS_PROCESSED = 'processed';
  const STATUS_WAITING = 'waiting';

  public static function getStatusList(){
    return array(
      self::STATUS_PROCESSED => 'Processed',
      self::STATUS_WAITING => 'Waiting',
    );
  }

  public function getStatusValue(){
    $list = self::getStatusList();
    return array_key_exists( $this->status, $list ) ? $list[ $this->status ] : 'Undefined';
  }
}

視圖:

$this->widget('zii.widgets.grid.CGridView', array(
  // other params
  'columns' => array(
    // other columns
    array(
      'name' => 'status',
      'value' => '$data->getStatusValue()',
      'filter' => User::getStatusList(),
    ),
  )
));

就這樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM