在Yii2.0項目的實際開發中,經常會遇到使用Yii2.0自帶的排序功能。下面是排序功能的具體使用方法。
一、設置排序規則
注意引入Sort類,如:use yii\data\Sort;
// 設置排序字段 $sortObject = new Sort([ 'sort' => $sort, 'defaultOrder' => ['id' => SORT_DESC], 'attributes' => [ 'id' => [ 'asc' => ['id' => SORT_ASC], 'desc' => ['id' => SORT_DESC], ], 'user_name' => [ 'asc' => ['ecs_users.user_name' => SORT_ASC], 'desc' => ['ecs_users.user_name' => SORT_DESC], ], 'add_time' => [ 'asc' => ['add_time' => SORT_ASC], 'desc' => ['add_time' => SORT_DESC], ], ], ]);
二、使用Yii2.0自帶分頁功能並加入排序
// 處理分頁 $queryClone = clone $query; $totalCount = $queryClone->count(); $pages = new Pagination(['defaultPageSize'=>$rows,'totalCount'=>$totalCount,'pageSizeLimit'=>false]); $query = $query->offset($offset) ->limit($pages->limit) ->orderBy($sortObject->orders) ->asArray() ->all();
三、修改Yii2.0排序底層代碼
底層對應源碼:vendor/yiisoft/yii2.0/data/Sort.php
1.為Sort類增加一個屬性:public $sort;
2.在源碼大約249行加入以下代碼:(實現post獲取分頁參數)
// get請求獲取數組為空,則調用自定義屬性sort。用於滿足post獲取后處理自定義參數 if(!isset($params[$this->sortParam])){ $params[$this->sortParam] = $this->sort; }
3.在控制器中接收分頁參數,如下:
$sort = $_POST['sort'] ? strval($_POST['sort']) : 'id'; $sort = $_POST['order'] == 'asc' ? $sort : '-'.$sort;
注意:Yii2.0中id代表按照id正序排序,-id代表按照id逆序排序。這也是上面語句2為什么要那么處理的原因。