亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

關于Yii2中GridView的用法總結

2020-03-22 19:29:09
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了關于關于Yii2中GridView的用法總結,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

我們采用的是yii2.0.14版本,為了學習方便,以問答式書寫。

開始GridView

GridView主要是為了實現表格復用,尤其我們做后臺的時候,你發現表單和表格占據了大部分頁面,而表格的樣式又是高度的統一,那么如果有這樣一個掛件,傳入數據集自動渲染表格該多好。

于是GridView出現了,一個有細節、夠穩定的表格渲染掛件。

通常情況下GridView是和各種dataProvider配合使用,針對于yii2框架中的dataProvider我之前寫過一篇文章,你可以看下,這將有助于你對GridView的學習。小談yii2中3個數據提供者及與GridView的搭配使用

在學習GridView掛件之前,我們需要先了解GridView的結構,看下圖。

585268283-5b220cee2047c_articlex[1].png

簡單的說,一個GridView由N個column(列)組成,而每個列里有自己的header、content和footer操作,這在GridView的代碼中有所體現

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ id , created_at:datetime:生成時間 , label = 會員名 , attribute = username , format = text }catch(/Exception $e){ // todo}

當然yii2已經做的相當細節,你可以不寫columns,GridView會根據dataProvider自動渲染出每一列,接下來我們開始問答區域,通過一問一答來深度了解GridView。

準備階段

為了問答進行的順利,我們模擬了一個數據表作為結果集的提供源。

idusernameprovincecitycreated_atupdated_atSex1abei黑龍江黑河1514201852152870774312周全吉林長春1528115243152811524313柏鑫吉林松原1528180018152825589014張楠遼寧沈陽152826588315282658830






Column

在A系列中我們先說說GridView中column的使用方法。

A1. 請渲染出id、username、province、city和sex。

當我們只需要$dataProvider每個對象的某些屬性的時,則必須要指定columns屬性,代碼如下

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ id , username , province , city , created_at }catch(/Exception $e){ // todo}

結果如下

700603640-5b220d03adbd8_articlex[1].jpg

A2.我想更改列的頭部內容

在A1中我們發現每一列的頭部是英文,現在想改成中文,有三個方法

方法1 更改對應模型中的attributeLabels方法

// app/models/Userhtml' target='_blank'>class User extends /yii/db/ActiveRecord { public function attributeLabels(){ return [ id = ID , username = 用戶名 , province = 省 , city = 城市 , created_at = 新建時間 , updated_at = 最近更新 , sex = 性別 ,}

當我們重新設置了attributeLabels方法后,對應的GridView會自動去拿取。

方法2 設置一個column的label屬性,如下代碼

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ username:text:用戶名 }catch(/Exception $e){ // todo}

可以通過設置列的label屬性實現,就像 username:text:用戶名,用英文冒號:分隔,分別是屬性名、格式以及label。

方法3 使用GridView的自定義屬性,如下代碼

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ label = 用戶名 , attribute = username }catch(/Exception $e){ // todo}

上面3種方法都可以,從1-3越來越靈活,當然代碼量也越來越大,第1種最簡單,第3種最靈活。

2695818392-5b220d3dd4fe8_articlex[1].jpg

A3.我不要時間戳

在A2中,我們看到新建時間這一列的內容竟然直接出現了時間戳,怎么變成對應的時間那?關于這個問題其實也有兩種方法。

方法1 設置column的format屬性

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ created_at:datetime }catch(/Exception $e){ // todo}

方法2 通過傳遞一個數組類型的column并設置其value來實現,如下代碼

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ attribute = created_at , value = function($model){// 形參為此行記錄對象 return date( Y-m-d H:i:s ,$model- created_at);}catch(/Exception $e){ // todo}

982257748-5b220d49d6099_articlex[1].jpg

從A3的方法1和方法2來看,其實方法1更多是方法2的快捷方式,因此我們通過設置數組類型column的format屬性等于datetime也能實現此題的需求。A4.我想定義一個屬性叫省市,將省和市字段內容合并

通過對A2和A3的學習,我想你已經知道可以通過數組類型的column來解決這個,沒錯,如下代碼

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ label = 省市 , value = function($model){ return {$model- province}-{$model- city} }catch(/Exception $e){ // todo}

value 屬性代表此單元格的數據內容,將結果返回即可,就像結果圖一樣。

281862048-5b220d55b3e54_articlex[1].jpg

但是問題出現了,我希望省市一列按照省屬性來排序,怎么辦?只需要指定attribute即可,這也是我們控制列排序的一種方法。

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ label = 省市 , attribute = province , value = function($model){ return {$model- province}-{$model- city} }catch(/Exception $e){ // todo}
A5.如何控制列排序?

從A4我們知道通過設置column的attribute屬性控制是否排序,但是attribute的本意并不在此,因此我們標準的去掉排序或設置排序的方法是通過其enableSorting屬性實現的。

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ label = 省市 , attribute = province , enableSorting = false, value = function($model){ return {$model- province}-{$model- city} }catch(/Exception $e){ // todo}

默認enableSorting為true,可以通過設置為false來取消此列排序功能,如下圖。

1817550607-5b220de457a4c_articlex[1].jpg

A6.列的樣式如何控制?

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

現在我們來做一個需求,將省市這一列個性化,列的頭部編程紅色,列的內容編程藍色,如下

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才可以。才可以才可以。

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出現了下面代碼

 tfoot  td /td  td /td  td /td  /tfoot 

因此每列的footerOptions就控制著在tfoot中這一列對應的td。

A8.footerRowOptions你是干毛用的?

在我們大搖大擺的用著A8中的showFooter的時候,突然PhpStorm自動關聯出一個footerRowOptions,這是個什么東西那?

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

比如針對上面的例子我們在配置下footerRowOptions

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

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

要注意:A6、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號管理員登錄的時候可以看到省市一列。

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。

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種

ActionColumn

CheckboxColumn

DataColumn

RadioButtonColumn

SerialColumn

通過GridView可以設置一列的默認類型,當然你可以針對特殊的類單獨指定其class。

try { echo GridView::widget([ dataProvider = $dataProvider, columns = [ dataColumnClass = yii/grid/DataColumn }catch(/Exception $e){ // todo}
B3.caption屬性

我們可以通過設置GridView的caption屬性來實現table的caption功能,作為table用途非常有用。

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容器的屬性,默認添加一個 >

tableOptions 控制著{items}表格的屬性,默認為其添加一個 >

現在你會改table的樣式類了么?

B5.一堆好基友 headerRowOptions 和 footerRowOptions

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

B6.rowOptions

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

你可以融入你的邏輯,比如現在我們要用rowOptions實現隔行換色的功能,來吧。

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

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

要記住的是,匿名函數返回的結果也會作為一行納入到渲染過程,比如當我們遇到奇數的時候就在此行下面添加一行,可以如下代碼

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 !

相關推薦:

關于PHP管道插件 League/Pipeline的解析

Laravel用戶認證系統(基礎介紹)

以上就是關于Yii2中GridView的用法總結的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清视频在线播放| 51视频国产精品一区二区| 亚洲精品福利免费在线观看| 日韩最新免费不卡| 国产日韩av在线| 中文字幕亚洲欧美日韩2019| 欧美综合激情网| 国产美女精品视频免费观看| 日韩一中文字幕| 最近2019中文字幕在线高清| 国产香蕉精品视频一区二区三区| 国产日韩在线观看av| 久久久久久久久久国产精品| 日本一区二区三区四区视频| 亚洲国产精品久久久久久| 91网站在线免费观看| 亚洲精品电影网| 久久久精品久久久| 久久综合九色九九| 亚洲国产又黄又爽女人高潮的| 国产精品日日摸夜夜添夜夜av| 日本午夜在线亚洲.国产| 亚洲国产高清高潮精品美女| 亚洲美女自拍视频| 久久91亚洲精品中文字幕奶水| 亚洲欧美国产另类| 色综合伊人色综合网| 亚洲一区二区三区在线免费观看| 久久天天躁狠狠躁夜夜躁| 国产精品久久久久aaaa九色| 九九九久久国产免费| 91精品久久久久久久久不口人| 久久精品国产96久久久香蕉| 日韩成人性视频| 自拍偷拍亚洲欧美| 国产精品自拍网| 亚洲精品女av网站| 久久69精品久久久久久国产越南| 精品亚洲一区二区三区在线观看| 国产精品视频资源| 久久久久一本一区二区青青蜜月| 欧美亚洲视频在线观看| 日本sm极度另类视频| 国产精品国产三级国产专播精品人| 最近2019中文字幕第三页视频| 欧美成人精品一区二区| 久久艹在线视频| 欧美诱惑福利视频| 精品国产老师黑色丝袜高跟鞋| 最新国产精品拍自在线播放| 日本中文字幕不卡免费| 亚洲色图偷窥自拍| 亚洲成色777777在线观看影院| 成人免费高清完整版在线观看| 亚洲成人激情在线| 一本色道久久88精品综合| 日本在线观看天堂男亚洲| 欧美丰满少妇xxxxx| 日韩电影视频免费| 精品毛片三在线观看| 热久久视久久精品18亚洲精品| 欧美激情喷水视频| 亚洲日本中文字幕免费在线不卡| 欧美精品福利在线| 国产最新精品视频| 久久人体大胆视频| 欧美伦理91i| 欧美性在线观看| 狠狠色噜噜狠狠狠狠97| 国内精品视频久久| 91sao在线观看国产| 欧美中在线观看| 日韩av在线一区| 一区二区欧美激情| 国产精品久久91| 久久国产精品免费视频| 欧美国产精品va在线观看| 国产日韩欧美视频| 伊人青青综合网站| 色偷偷88888欧美精品久久久| 亚洲欧洲中文天堂| 高清日韩电视剧大全免费播放在线观看| 国产精品久久97| 91精品国产沙发| 国产精品r级在线| 亚洲va欧美va国产综合剧情| 国内精品伊人久久| 在线精品国产欧美| 狠狠色狠狠色综合日日五| 欧美日韩爱爱视频| 中文字幕成人在线| 亚洲图片欧洲图片av| 中文在线不卡视频| 午夜精品美女自拍福到在线| 日韩精品视频中文在线观看| 国产精品丝袜久久久久久不卡| 亚洲r级在线观看| 国产精品久久久久久久久久尿| 色偷偷av亚洲男人的天堂| 日韩精品免费在线视频观看| 最近中文字幕日韩精品| 中文字幕亚洲一区二区三区五十路| 国产日韩换脸av一区在线观看| 欧美精品久久久久| 国产福利精品av综合导导航| 亚洲高清久久久久久| 中文字幕久久久av一区| 久久影院中文字幕| 欧美日韩亚洲国产一区| 91在线网站视频| 国产视频精品va久久久久久| 91九色精品视频| 亚洲国产日韩欧美在线图片| 日韩中文在线不卡| 精品国产区一区二区三区在线观看| 国产97在线|亚洲| 九九精品视频在线观看| 亚洲一区二区在线| 91色精品视频在线| 国产乱肥老妇国产一区二| 亚洲精品动漫100p| 亚洲国产精品久久久久| 精品小视频在线| 久久久久久欧美| 日本久久亚洲电影| 国产热re99久久6国产精品| 高清欧美一区二区三区| 91在线观看免费| 欧美性资源免费| 欧美日韩中文字幕日韩欧美| 最好看的2019的中文字幕视频| 久久人人爽人人爽人人片亚洲| 精品成人国产在线观看男人呻吟| 97香蕉超级碰碰久久免费软件| 一区二区三区黄色| 法国裸体一区二区| 欧美日韩成人网| 欧美一区二区.| 国内精品小视频在线观看| 日韩中文字幕视频在线| 欧美大全免费观看电视剧大泉洋| 欧亚精品中文字幕| 成人网页在线免费观看| 国产精品高潮呻吟久久av无限| 亚洲乱码一区av黑人高潮| 国产精品91久久| 久久免费视频观看| 亚洲第五色综合网| 国产精品综合久久久| 国产精品中文字幕在线| 国产69精品久久久久9| 色偷偷综合社区| 中文字幕精品久久久久| 欧美精品videosex极品1| 精品亚洲一区二区| 国内免费精品永久在线视频| 欧美床上激情在线观看| 91国语精品自产拍在线观看性色| 欧美精品做受xxx性少妇| 国产精品一区=区| 色99之美女主播在线视频| 亚洲aaa激情| 久久香蕉国产线看观看网| 91精品视频一区|