增刪改查,數據庫操做的四大法寶中最經常使用的就是查了,一條記錄、幾條記錄、一大堆記錄。對於yii2而言,尤爲後臺,GridView是最經常使用且好用的數據列表部件,今天就說一說。php
GridView將結果集顯示爲表格(table),咱們從一個項目開始開始。
一天客戶老鄭(鄭訊)來到這裏,說要我作一個頁面,將全部的會員分頁顯示在列表裏,每頁10條數據,而且能按照表頭排序。
好吧~數據庫
我查詢了數據庫的user表數組
id | username | password | create_time | sex | province | city |
---|---|---|---|---|---|---|
1 | abei | dWRvDOMGjvGQZMGlxFR2xfhsfGpzu8Rx | 1479876598 | 1 | 北京 | 北京 |
2 | 鄭訊 | dWRvDOMGjvGQZMGlxFR2xfhsfGpzu8Rx | 1479876698 | 0 | 黑龍江 | 哈爾濱 |
11 | 馬化騰 | dWRvDOMGjvGQZMGlxFR2xfhsfGpzu8Rx | 1479877598 | 1 | 黑龍江 | 齊齊哈爾 |
19 | 馬雲 | dWRvDOMGjvGQZMGlxFR2xfhsfGpzu8Rx | 1479886598 | 1 | 黑龍江 | 嫩江 |
而後我決定使用GridView來顯示這些數據,這樣分頁、排序都直接搞定了,我知道須要兩步瀏覽器
第一步是在控制器UserController.php裏得到結果集yii2
public function actionIndex(){ $query = User::find(); $dataProvider = new ActiveDataProvider([ 'query'=>$query, 'pagination'=>[ 'pagesize'=>10 ] ]); return $this->render('index',[ 'dataProvider'=>$dataProvider ]); }
第二部渲染視圖
index.phpyii
use yii\grid\GridView; <?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ 'id', 'username', 'create_time', 'sex', 'province', 'city' ] ]);?>
完活了,聰明的GridView會搞定一切,我只須要將$dataProvider傳遞給ta,而且告訴他都要顯示User模型(user表)的那些屬性,放到columns數組中便可。
就這樣,表格出來了,且每一個表都都能排序,客戶的需求達到了。ide
30分鐘後我拿給鄭訊看,見他默默無語,說了幾句話。函數
表頭改爲編號、用戶名、生成時間等,不要英文。this
會員生成時間我看不懂,改爲年月日十分秒吧spa
性別改爲男or女
省市兩列合併,像province-city這樣
恩,客戶是上帝,改改吧~,主要是我知道:"這個其實很簡單,GridView都能輕鬆搞定"
對於表頭的顯示,GridView是根據User模型的attributeLabels函數來決定的,如今就改
User.php
/** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID', 'create_time' => 'Create Time', 'username'=>'Username', 'password'=>'Password', 'sex'=>'Sex', ]; }
如今就改,60秒過去了
/** * @inheritdoc */ public function attributeLabels() { return [ 'id' => '編號', 'create_time' => '生成時間', 'username'=>'用戶名', 'password'=>'Password', 'sex'=>'性別', ]; }
可是,我發現省市怎麼沒有,哦,想起來了,province和city是我後來添加到數據表的,並無更新User模型,那我直接加上就能夠了。
最終版
/** * @inheritdoc */ public function attributeLabels() { return [ 'id' => '編號', 'create_time' => '生成時間', 'username'=>'用戶名', 'password'=>'Password', 'sex'=>'性別', 'province'=>'省', 'city'=>'市' ]; }
???搞定,在運行程序,"表頭改爲編號、用戶名、生成時間等,不要英文"這個問題搞定了。
繼續把,如今要處理"會員生成時間我看不懂,改爲年月日十分秒吧"這個問題,它也很簡單,由於我知道除了向GridView的 columns傳遞每一個屬性名字外,咱們還能傳遞一個自定義的數組,格式化數據、邏輯處理,啥都能幹出來,至關禽獸。
開始改視圖index.php,我只花了10秒鐘
index.php
use yii\grid\GridView; <?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ 'id', 'username', [ 'attribute'=>'create_time', 'format'=>['date', 'php:Y-m-d H:i:s'] ], 'sex', 'province', 'city' ] ]);?>
'attribute'=>'create_time'
attribute要填寫,表明你在操做那個屬性,且在這裏排序也是根據他來的。
format是表明對create_time進行什麼樣的格式化,默認yiii18nFormatter 來對其處理。
刷新瀏覽器
又一個山頭給咱們攻克了。
這裏要提一下,[]的功能很強大,上面的實現也能夠根據如下代碼來實現
index.php
use yii\grid\GridView; <?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ 'id', 'username', [ 'attribute'=>'create_time', 'value'=>function($data){ return date('Y-m-d H:i:s',$data->create_time); } ], 'sex', 'province', 'city' ] ]);?>
"性別改爲男女",很少言,直接代碼
index.php
use yii\grid\GridView; <?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ 'id', 'username', [ 'attribute'=>'create_time', 'format'=>['date', 'php:Y-m-d H:i:s'] ], [ 'attribute'=>'sex', 'value'=>function($data){ return $data->sex == 1 ? '男' : '女'; } ], 'province', 'city' ] ]);?>
刷新瀏覽器
value是一個很好的屬性,當你不知道有沒有提供內置命令的時候,均可以使用value去用本身的思路實現需求。
還有最後一個,"省市兩列合併,像province-city這樣",勝利就在前方,我想你已經有了思路。
只須要改一點
[ 'attribute'=>'province', 'value'=>function($data){ return $data->province."-".$data->city; } ]
是的,你的思路是對的。可是發現一個問題,表頭顯示"省",ta應該顯示"省市"纔對,沒關係,咱們熱烈歡迎label屬性出場。
[ 'label'=>'省市', 'attribute'=>'province', 'value'=>function($data){ return $data->province."-".$data->city; } ]
最後我看了下。
不錯不錯,喝杯茶,一會去給客戶看。
10分鐘後,我鬱悶的回來了,知道這回客戶提了那些亂七八糟的需求麼?且聽下回分解《GridView - 睡衣篇》