關於Yii2中GridView的用法總結

默認enableSorting爲true,能夠經過設置爲false來取消此列排序功能,以下圖。css

1817550607-5b220de457a4c_articlex[1].jpg

A6.列的樣式如何控制?

到如今你已經知道了5個使用GridView的技巧,咱們繼續,在A6中咱們嘗試改變表格某一列的樣式。針對於列樣式,GridView提供了3個屬性,分別爲headerOptions、contentOptions和footerOptions。html

如今咱們來作一個需求,將省市這一列個性化,列的頭部編程紅色,列的內容編程藍色,以下編程

1數組

2瀏覽器

3yii2

4app

5框架

6yii

7ide

8

9

10

11

12

13

14

15

16

17

18

19

20

try {

    echo GridView::widget([

        'dataProvider' => $dataProvider,

         

        'columns'=>[

            [

                'label'=>'省市',

                'attribute'=>'province',

                'enableSorting' => false,

                'value'=>function($model){

                    return "{$model->province}-{$model->city}";

                },

                'headerOptions' => ['style'=>'color:red'],

                'contentOptions' => ['style'=>'color:blue'],

            ]

        ]

    ]);

}catch(\Exception $e){

    // todo

}

是的,使用這一列的headerOptions和contentOptions便可

3581100424-5b220df2a6267_articlex[1].jpg

有個要注意的地方,咱們使用瀏覽器的f12看看標註顏色的列。

1743074111-5b220e0014fb3_articlex[1].jpg

你看到了,headerOptions和contentOptions直接做用到了th和td標籤,爲其增長相似於style等屬性,所以若是你的th或td標籤中還有其餘的html標籤,直接定義style就沒法生效了,此時能夠經過css類解決這個問題。

A7.關於GridView中footerOptions的使用。

在A6中咱們說GridView的列有一個footerOptions屬性,那麼這個屬性是幹嗎用的那?從單詞上分析是控制列footer的屬性(好比樣式等等),可是footer在哪裏???在哪裏在哪裏?

須要先設置GridView的showFooter等於true才能夠。才能夠才能夠。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

try {

    echo GridView::widget([

        'dataProvider' => $dataProvider,

         

        'columns'=>[

            [

                'label'=>'省市',

                'attribute'=>'province',

                'enableSorting' => false,

                'value'=>function($model){

                    return "{$model->province}-{$model->city}";

                },

                'headerOptions' => ['style'=>'color:red'],

                'contentOptions' => ['style'=>'color:blue'],

                'footerOptions'=>['style'=>'color:yellow']

            ]

        ],

        'showFooter'=>true

    ]);

}catch(\Exception $e){

    // todo

}

在showFooter=true的天空下,列的footerOptions才能自由飛翔。

4137986696-5b220e0c2bd7a_articlex[1].jpg

從原理上說,'showFooter'=>true的結果是讓table出現了下面代碼

1

2

3

4

5

6

7

<tfoot>

   <tr>

       <td></td>

       <td></td>

       <td></td>

   <tr>

</tfoot>

所以每列的footerOptions就控制着在tfoot中這一列對應的td。

A8.footerRowOptions你是幹毛用的?

在咱們大搖大擺的用着A8中的showFooter的時候,忽然PhpStorm自動關聯出一個footerRowOptions,這是個什麼東西那?

footerRowOptions是GridView的屬性,它控制着tfoot的tr標籤屬性,簡單點說,你最後在tfoot上每一個單元格看到的效果是footerRowOptions + footerOptions 的結合體(就style而言)。

好比針對上面的例子咱們在配置下footerRowOptions

1

'footerRowOptions'=>['style'=>'font-size:20px;']

則你會發現黃色字體變成了20px。

要注意:A六、A7和A8中的這些xxxOptions所能控制的是標籤的屬性,不僅僅是style。

A9.showFooter的你們族

從A7中咱們知道了GridView的showFooter,它決定這table是否顯示tfoot信息,除此以外show家族還有一些其餘成員。

  • showHeader 能夠控制table的頭部是否顯示,默認顯示。

  • showOnEmpty 當數據爲空的時候,table框架是否存在,默認不存在。

A10.魔術師visible的戲法

這個片斷咱們說下GridView列的visible屬性,此屬性默認爲true表明此列顯示,經過設置visible屬性能夠隱藏一列,這種隱藏非css的display:none,而是在渲染表格的時候就去掉了此列。

你可能會問,若是我要使用visible來隱藏一列,我不寫這一列不就行了麼?

是的,你的思路沒錯,可是visible是能夠傳遞一個表達式,實現邏輯判斷,好比下面的需求當1號管理員登陸的時候能夠看到省市一列。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

try {

    echo GridView::widget([

        'dataProvider' => $dataProvider,

         

        'columns'=>[

            [

                'label'=>'省市',

                'attribute'=>'province',

                'enableSorting' => false,

                'value'=>function($model){

                    return "{$model->province}-{$model->city}";

                },

                'visible'=>(Yii::$app->admin->id === 1)

            ]

        ],

        'showFooter'=>true

    ]);

}catch(\Exception $e){

    // todo

}

A1-A10 咱們重點說的是GridView每列的公共屬性,這並非所有,針對於不一樣類型的列還有會其餘的屬性,好比DataColumn、ActionColumn、CheckboxColumn等等,針對於不一樣類型列的講解,要後續放出。

GridView

接下來咱們進入B系列,B系列的重點在講解GridView。

B1 關於佈局layout

默認狀況下GridView的佈局以下圖

782334426-5b220e1ca96f6_articlex[1].jpg

這個佈局來自於GridView的layout屬性,咱們能夠改變這個模板,好比要去掉summary。

1

2

3

4

5

6

7

8

9

10

11

12

try {

    echo GridView::widget([

        'dataProvider' => $dataProvider,

         

        'columns'=>[

             

        ],

        'layout'=>"{items}\n{pager}"

    ]);

}catch(\Exception $e){

    // todo

}

layout內有5個可使用的值,分別爲{summary}、{errors}、{items}、{sorter}和{pager}。

B2.指定列默認的類型 dataColumnClass

在一個表格中每列都有不一樣的做用,有的是數據類型的、有的是複選框類型,具體有5種

  1. ActionColumn

  2. CheckboxColumn

  3. DataColumn

  4. RadioButtonColumn

  5. SerialColumn

經過GridView能夠設置一列的默認類型,固然你能夠針對特殊的類單獨指定其class。

1

2

3

4

5

6

7

8

9

10

11

12

try {

    echo GridView::widget([

        'dataProvider' => $dataProvider,

         

        'columns'=>[

             

        ],

        'dataColumnClass'=>"yii\grid\DataColumn"

    ]);

}catch(\Exception $e){

    // todo

}

B3.caption屬性

咱們能夠經過設置GridView的caption屬性來實現table的caption功能,做爲table用途很是有用。

1

2

3

4

5

6

7

8

9

10

11

try {

    echo GridView::widget([

        'dataProvider' => $dataProvider,

        'columns'=>[

             

        ],

        'caption'=>"會員列表"

    ]);

}catch(\Exception $e){

    // todo

}

效果圖以下

4006144808-5b220e3e9da7c_articlex[1].jpg

固然不用多說,GridView也提供了captionOptions屬性來讓你控制caption的屬性。

B4.tableOptions和options屬性

這兩個屬性有的開發者可能會混淆,接下來我用一張圖讓你瞬間明白。

2438330366-5b220e5e9d146_articlex[1].jpg

就是說GridView渲染的時候首先弄出來一個p容器,這是這個GridView的表明,接下來在此容器內放各類元素,好比{summary}、{items}等等。

  • options 控制着p容器的屬性,默認添加一個class="grid-view"

  • tableOptions 控制着{items}表格的屬性,默認爲其添加一個 class="table table-striped table-bordered"

如今你會改table的樣式類了麼?

B5.一堆好基友 headerRowOptions 和 footerRowOptions

咱們在A8中講了footerRowOptions的用法,headerRowOptions的用法和它同樣,只不過它管理的是thead下tr的屬性。

B6.rowOptions

學會了B5,你可能看着rowOptions一眼識破,沒錯它的目的就是管理tbody下的每一個tr,可是它更強大,除了直接接收一個數組外還能傳入匿名函數。

你能夠融入你的邏輯,好比如今咱們要用rowOptions實現隔行換色的功能,來吧。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

try {

    echo GridView::widget([

        'dataProvider' => $dataProvider,

        'columns'=>[

             

        ],

        'rowOptions'=>function($model,$key, $index){

            if($index%2 === 0){

                return ['style'=>'background:red'];

            }

        }

    ]);

}catch(\Exception $e){

    // todo

}

目的達到,看效果

3365928132-5b220e52b6eb3_articlex[1].jpg

對於rowOptions接收的匿名行數的4個形參,這裏說明一下

  • $model: 當前被渲染的對象

  • $key: 當前對象的逐漸

  • $index: 針對於當前頁面,從0開始,逐行加1

  • $grid: GridView對象

B7. beforeRow和afterRow

這是一對很是靈活的屬性,它們接收一個匿名函數。分別表示在渲染了一行以前和以後發生點什麼?固然具體發生什麼由你來決定。

要記住的是,匿名函數返回的結果也會做爲一行歸入到渲染過程,好比當咱們遇到奇數的時候就在此行下面添加一行,能夠以下代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

try {

    echo GridView::widget([

        'dataProvider' => $dataProvider,

        'tableOptions' => ['class'=>'table table-bordered'],

        'columns'=>[

            'id',

            'username:text:用戶名',

            .....

        ],

        'afterRow'=>function($model,$key, $index,$grid){

            if(($index+1)%2 != 0){

                return "<tr><td colspan='4'>我是基數</td></tr>";

            }

        }

    ]);

}catch(\Exception $e){

    // todo

}

很是好,獲得了咱們想要的結果

2924391307-5b220e6c003f3_articlex[1].jpg

B8. 兩個小盆友placeFooterAfterBody & emptyCell

很細節的兩個小屬性

  • placeFooterAfterBody 當咱們要顯示footer的時候,placeFooterAfterBody屬性決定將此html放到table的什麼位置,默認放到header後面,你能夠選擇placeFooterAfterBody=true來讓footer放到body後面。此功能是在yii2.0.14才支持的。

  • emptyCell 又是一個小細節,若是一個單元格爲空,用什麼字符填充那?默認是 &nbsp,你能夠從新指定。

小結

不知不覺寫了3000多字,本想一篇完成GridView的講解,如今看來比較困難,畢竟還有不少類型的列要去研究分享,仍是變成專題吧,接下來我會對每一個列作單獨的分析,但願對你有用。

以上就是本文的所有內容,但願對你們的學習有所幫助,更多相關內容請關注PHP中文網!

相關文章
相關標籤/搜索