[yii2當心肝兒]GridView - 大衣篇

增刪改查,數據庫操做的四大法寶中最經常使用的就是查了,一條記錄、幾條記錄、一大堆記錄。對於yii2而言,尤爲後臺,GridView是最經常使用且好用的數據列表部件,今天就說一說。php

yiigridGridView;

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 - 睡衣篇》

相關文章
相關標籤/搜索