日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

yii2 / 在这里有个叫BaseDataProvider的老爹

發布時間:2025/3/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 yii2 / 在这里有个叫BaseDataProvider的老爹 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們昨天說到了ActiveDataProvider、SqlDataProvider和ArrayDataProvider,從描述中不難發現這幾個貨的行為都差不多,因此yii2的開發者們為它們設置了一個BaseDataProvider的父類,而BaseDataProvider又實現了一個叫做DataProviderInterface的接口。

在PHP中,實現接口的類必須完成接口中聲明的所有函數,當我們要看BaseDataProvider中有哪些可用方法的時候,首先要關注DataProviderInterface接口。

DataProviderInterface

  • prepare
  • getCount
  • getTotalCount
  • getModels
  • getKeys
  • getSort
  • getPagination

以上是DataProviderInterface為我們提供的函數聲明,也就是說BaseDataProvider類實現了這些函數,而我們的DataProvider三兄弟也因為繼承了BaseDataProvider自然擁有了這些方法。

因此昨天的文章『小談yii2中3個數據提供者及與GridView的搭配使用』中,我們大膽的使用了getCount、getTotalCount、getModels等。

接下來我們先說在BaseDataProvider中來自接口DataProviderInterface的方法。

prepare

數據準備,這是一個功能性的函數,它負責組裝DataProvider中的_models和_keys屬性,我們來大體看一下這個函數。

public function prepare($forcePrepare = false){if ($forcePrepare || $this->_models === null) {$this->_models = $this->prepareModels();}if ($forcePrepare || $this->_keys === null) {$this->_keys = $this->prepareKeys($this->_models);} }

要研究明白這個函數,我們首先要了解下 _models_keys 屬性。

  • _models 這個很容易理解,我們通過getModels或GridView得到的對象集或數組集合。每一項代表著具體的數據。
  • _keys 表示每個數據項的唯一鍵,當我們使用ActiveDataProvider是就是每條數據的主鍵值,而其他兩種DataProvider的是_models數組的key值。

prepare函數僅僅在BaseDataProvider類中定義,而每種DataProvider定義了自己的prepareModels和prepareKeys方法,因此我們在不同的DataProvider下調用prepare得到的是不同的值。

另外prepare也有一個叫做$forcePrepare的參數,用意很簡單,是否在_models_keys屬性值已經存在的情況下強行刷新,默認為false不強行刷新。

getKeys

在介紹prepare的時候我們看到了prepareModels和prepareKeys,正因為有它們的存在我們才能正確通過getModels和getKeys函數拿到相應的數據。

我們先來說說getKeys函數,其實也就是在DataProvider中 $_keys 屬性的內容。

這里有一點不同,我們來看下。

ActiveDataProvider

$dataProvider = new ActiveDataProvider(['query' => Blog::find()->select(['title','id']),'pagination' => ['pageSize' => 20,], ]);VarDumper::dump($dataProvider->getKeys(),10,true);

我們得到的結果如下

[0 => 11 => 22 => 33 => 44 => 55 => 9 ]

是的,你一定發現了,_keys是一個數組,數組的key代表每一行數據項,value值代表對應數據的主鍵。

注意:如果你數據項中不存在id列,將返回null。比如我們上面代碼的$query是Blog::find()->select(['title'])。

而針對ArrayDataProvider和SqlDataProvider提供者,getKeys得到的數組就簡單的多了,數據項就是一個數組,因此得到的都是如下

[0 => 01 => 12 => 23 => 34 => 45 => 5 ]

當然你也可以通過setKeys函數對這些規則進行重寫,后續篇章會講到

getCount & getTotalCount

這是兩個關于數量統計的函數,用意也及其明白,之所以誕生是因為DataProvider支持分頁功能。

  • getCount 當前頁面的數據項數量
  • getTotalCount 數據項總數量

getSort

得到排序的信息,這個方法實現及其簡單,看一下。

public function getSort() {if ($this->_sort === null) {$this->setSort([]);}return $this->_sort; }

從代碼看還是返回了_sort屬性,那么問題就回到setSort方法身上,研究明白如何對_sort賦值就能知道getSort得到的是什么了~

我們先把代碼貼過來

public function setSort($value){if (is_array($value)) {$config = ['class' => Sort::className()];if ($this->id !== null) {$config['sortParam'] = $this->id . '-sort';}$this->_sort = Yii::createObject(array_merge($config, $value));} elseif ($value instanceof Sort || $value === false) {$this->_sort = $value;} else {throw new InvalidParamException('Only Sort instance, configuration array or false is allowed.');} }

對于$value的傳遞一共有三種可能

  • Array 一個配置數組
  • Sort 一個sort對象
  • Bool 一個布爾型的值

這些我們可以通過新建DataProvider對象時候傳入,比如

$dataProvider = new ActiveDataProvider(['query' => Blog::find()->select(['title','id']),'sort'=>false ]);

重點 當sort為false時候代表不排序,sort不能為true(會報錯),當我們要排序的時候應該出入配置數組和sort對象。

setSort方法會根據參數的類型來進行不同的邏輯處理,比如傳遞數組類型的會生成一個一個Sort對象并將你的設置作為新建對象的參數,當然你也可以直接傳入一個Sort對象,效果是一樣的。

getPagination

這是一個重要的函數,它負責分頁。

public function getPagination() {if ($this->_pagination === null) {$this->setPagination([]);}return $this->_pagination; }

但是不要擔心,這個方法和getSort方法的思路完全一致,當我們發現對象的_pagination不存在時,調用setPagination對其進行設置,接下來的代碼你會非常熟悉。

public function setPagination($value) {if (is_array($value)) {$config = ['class' => Pagination::className()];if ($this->id !== null) {$config['pageParam'] = $this->id . '-page';$config['pageSizeParam'] = $this->id . '-per-page';}$this->_pagination = Yii::createObject(array_merge($config, $value));} elseif ($value instanceof Pagination || $value === false) {$this->_pagination = $value;} else {throw new InvalidParamException('Only Pagination instance, configuration array or false is allowed.');} }

是吧,你是不是發現和setSort完全一致,接收的函數也一樣。

小結

現在你知道DataProvider的運行原理以及常用方法了么?接下來我將為你介紹在GridView中是如何對DataProvider對象進行處理的。

本文來自于 https://nai8.me

總結

以上是生活随笔為你收集整理的yii2 / 在这里有个叫BaseDataProvider的老爹的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91叉叉叉 | 一道本久在线中文字幕 | 久久在线| 青娱乐精品视频 | 国产福利小视频在线 | 日本a级免费| 欧美成人免费大片 | 波多野结衣大片 | 国产欧美日韩精品区一区二污污污 | 日韩伦理视频 | 性欧美大战久久久久久久免费观看 | 一区二区三区免费在线观看视频 | 视频二区在线观看 | 欧美性受xxxxxx黑人xyx性爽 | 中国女人内谢69xxxx | 久久精品国产一区 | 肥臀浪妇太爽了快点再快点 | 涩涩涩999 | 国产精品视频在线观看免费 | 国产在线一区不卡 | 成人蜜桃av| 久久与婷婷 | xxxxx色| 欧美成人吸奶水做爰 | 中文字幕一区二区三区四区五区 | 尤物视频在线观看免费 | 久久精品国产一区二区 | www.在线国产| 麻豆精品网站 | 男人天堂av电影 | 日韩精品无码一区二区 | 国产强被迫伦姧在线观看无码 | 欧美老熟妇一区二区三区 | 爆操白虎逼 | 日本一区不卡在线观看 | 激情五月五月婷婷 | 欧美成人国产精品一区二区 | 国产高清av在线 | 久久精品操| 男人av网| 亚洲人人爽 | 黄色片视频免费观看 | 午夜免费一级片 | 91精品一区二区三区在线观看 | 一级全黄少妇性色生活片 | a级性生活视频 | 成人网在线看 | 亚洲福利社区 | 日日淫| 欧美性大战xxxxx久久久 | 精品黑人一区二区三区国语馆 | 不卡中文 | 成年女人色毛片 | 久久中文字幕无码 | 国产精品无码天天爽视频 | 国产精成人品 | 免费91网站 | 亚洲男女在线 | 日韩成人中文字幕 | 黄视频网站在线 | 一级黄色片网站 | 久久国产这里只有精品 | 日产精品久久久 | 欧美资源网| 国产三级午夜理伦三级 | 香蕉视频在线免费播放 | 国模私拍av | 农村老熟妇乱子伦视频 | 国产网站精品 | 无码日韩精品一区二区 | 少妇名器的沉沦 | 天天插天天搞 | 仙踪林久久久久久久999 | av在线免费观看网址 | 天堂av一区二区三区 | 国产网红女主播精品视频 | 国产美女在线播放 | 95香蕉视频| 亚洲av综合色区无码一区爱av | 自拍偷拍第八页 | 午夜精品久久久久久久第一页按摩 | 国产精品探花在线观看 | 亚洲精品色图 | 97国产在线播放 | 色视频在线观看 | 中文字幕一区二区三区手机版 | 四虎影视国产精品 | 色夜av| 久久影视网 | 久久精品免费一区二区 | 国产欧美一区二区在线观看 | 青青国产精品 | 抱着老师的嫩臀猛然挺进视频 | 超级黄色录像 | 亚洲天天视频 | 在线看a级片 | 欧美激情一区二区三区在线 | 男人的天堂2018| 狠狠干干 |