国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

重寫yii2的數(shù)據(jù)提供器ArrayDataProvider類

xiaokai / 1060人閱讀

摘要:再看看另一個(gè)方法,的提供的數(shù)據(jù)統(tǒng)計(jì)總條數(shù)的方法是的,默認(rèn)計(jì)算分頁(yè)總數(shù)是根據(jù)數(shù)組計(jì)算的,而的數(shù)據(jù)就是我們查詢賦值給提供器的。統(tǒng)計(jì)總數(shù)預(yù)處理函數(shù)直接獲取通過(guò)函數(shù)獲取傳遞給數(shù)據(jù)提供器的數(shù)據(jù)總和。

首先看看ArrayDataProvider官方的doc:

ArrayDataProvider implements a data provider based on a data array.
ArrayDataProvider實(shí)現(xiàn)了一個(gè)基于數(shù)據(jù)數(shù)組的數(shù)據(jù)提供器。

The [[allModels]] property contains all data models that may be sorted and/or paginated.
[[allModels]]包含了需要排序和(或)分頁(yè)的所有數(shù)據(jù)模型。

ArrayDataProvider will provide the data after sorting and/or pagination.
ArrayDataProvider提供排序和(或)分頁(yè)后的數(shù)據(jù)。

You may configure the [[sort]] and [[pagination]] properties to
customize the sorting and pagination behaviors.
你可以配置[[sort]][[pagination]]屬性自定義排序和分頁(yè)行為。

Elements in the [[allModels]] array may be either objects (e.g. model objects) or associative arrays (e.g. query results of DAO).
[[allModels]]數(shù)組中的元素也許是對(duì)象(如,model對(duì)象)也許是關(guān)聯(lián)數(shù)組(如,PDO的查詢結(jié)果)。

Make sure to set the [[key]] property to the name of the field that uniquely identifies a data record or false if you do not have such a field.
確保設(shè)置的[[key]]屬性是唯一標(biāo)識(shí)一條記錄的字段的名字,如果沒(méi)有這樣的字段,則設(shè)為false。

Compared to [[ActiveDataProvider]], ArrayDataProvider could be less efficient because it needs to have [[allModels]] ready.
[[ActiveDataProvider]]比較,ArrayDataProvider可能效率較低,因?yàn)樗枰獪?zhǔn)備[[allModels]]

ArrayDataProvider may be used in the following way:
ArrayDataProvider可以按照下面的方式使用:

$query = new Query;
$provider = new ArrayDataProvider([
    "allModels" => $query->from("post")->all(),
    "sort" => [
        "attributes" => ["id", "username", "email"],
    ],
    "pagination" => [
        "pageSize" => 10,
    ],
]);
// get the posts in the current page
$posts = $provider->getModels();

Note: if you want to use the sorting feature, you must configure the [[sort]] property
so that the provider knows which columns can be sorted.
注意:你給你想使用排序功能,你必須配置[[sort]]屬性。

@author Qiang Xue
@since 2.0

從上面的指南可以看出,使用ArrayDataProvider需要準(zhǔn)備好[[allModels]]數(shù)據(jù),才開始渲染視圖,并實(shí)現(xiàn)分頁(yè)。

ArrayDataProvider是先把數(shù)據(jù)拉渠道內(nèi)存中,然后再根據(jù)已有數(shù)據(jù)進(jìn)行分頁(yè),這一點(diǎn)感覺(jué)像JQuery的DataTables插件,但是DataTables插件支持異步獲取數(shù)據(jù),也就是說(shuō)可以根據(jù)配置可以分頁(yè)從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),顯然,yii2自帶的ArrayDataProvider明顯不提供此功能。

先看看,yii2的ArrayDataProvider提供預(yù)處理models的方法,該方法處理排序和分頁(yè):

/**
     * @inheritdoc
     */
    protected function prepareModels()
    {
        if (($models = $this->allModels) === null) {
            return [];
        }

        if (($sort = $this->getSort()) !== false) {
            $models = $this->sortModels($models, $sort);
        }

        if (($pagination = $this->getPagination()) !== false) {
            $pagination->totalCount = $this->getTotalCount();

            if ($pagination->getPageSize() > 0) {
                $models = array_slice($models, $pagination->getOffset(), $pagination->getLimit());
            }
        }

        return $models;
    }

對(duì)于分頁(yè)代碼,如過(guò)設(shè)置了pagination對(duì)象,也就是設(shè)置了分頁(yè),則統(tǒng)計(jì)數(shù)據(jù)總條數(shù),然后根據(jù)每頁(yè)的大小分片。

if (($pagination = $this->getPagination()) !== false) {

  $pagination->totalCount = $this->getTotalCount();
  if ($pagination->getPageSize() > 0) {
      $models = array_slice($models, $pagination->getOffset(), $pagination->getLimit());
   }

}

再看看另一個(gè)方法,yii2的ArrayDataProvider提供的數(shù)據(jù)統(tǒng)計(jì)總條數(shù)的方法:

/**
     * @inheritdoc
     */
    protected function prepareTotalCount()
    {
        return count($this->allModels);
    }

是的,ArrayDataProvider默認(rèn)計(jì)算分頁(yè)總數(shù)是根據(jù)allModels數(shù)組計(jì)算的,而allModels的數(shù)據(jù)就是我們查詢賦值給提供器的。

這里面有兩個(gè)很重要的方法必須看看:

    public function getTotalCount()
    {
        if ($this->getPagination() === false) {
            return $this->getCount();
        } elseif ($this->_totalCount === null) {
            $this->_totalCount = $this->prepareTotalCount();
        }

        return $this->_totalCount;
    }

該方法就是統(tǒng)計(jì)數(shù)據(jù)總數(shù)的,相應(yīng)的應(yīng)該有一個(gè)設(shè)置數(shù)據(jù)總數(shù)的:

    public function setTotalCount($value)
    {
        $this->_totalCount = $value;
    }

而在ArrayDataProvider及其分類中,并沒(méi)有一個(gè)public的totalCount屬性,因此yii在處理的時(shí)候,將totalCount通過(guò)魔法函數(shù)進(jìn)行設(shè)置,因?yàn)閥ii2中所有的類都是Object的子類,關(guān)于魔法函數(shù),這一塊內(nèi)容參考深入理解yii2.0,在此感謝作者帶我們走的這么深。

因此,不管你分頁(yè)不分頁(yè),ArrayDataProvider并不是服務(wù)器端分頁(yè)的,而是將已有數(shù)據(jù)分頁(yè)處理的。

這種情況,如果數(shù)據(jù)量很大的時(shí)候,一點(diǎn)也不好,線上服務(wù)動(dòng)輒上百萬(wàn)的數(shù)據(jù),一下子拿出來(lái)分頁(yè),服務(wù)器吃不消,你也耗不起這個(gè)等待時(shí)間。

下面,我們需要重寫這兩個(gè)方法:

models預(yù)處理方法

取消對(duì)已有數(shù)據(jù)的分片處理,統(tǒng)計(jì)數(shù)據(jù)總數(shù)根據(jù)我們的方式統(tǒng)計(jì),比如數(shù)據(jù)庫(kù)中的總條數(shù)。

     /*
     *  @inheritdoc
     */
    protected function prepareModels()
    {
        if (($models = $this->allModels) === null) {
            return [];
        }

        if (($sort = $this->getSort()) !== false) {
            $models = $this->sortModels($models, $sort);
        }

        if (($pagination = $this->getPagination()) !== false) {
            $pagination->totalCount = $this->getTotalCount();
        }

        return $models;
    }

統(tǒng)計(jì)總數(shù)預(yù)處理函數(shù)

直接獲取通過(guò)getTotalCount()函數(shù)獲取傳遞給數(shù)據(jù)提供器的數(shù)據(jù)總和。

     /*
     *       @inheritdoc
     */
    protected function prepareTotalCount()
    {
        return $this->getTotalCount();
    }

下面給出重寫后的完整ArrayDataProvider:

allModels) === null) {
            return [];
        }

        if (($sort = $this->getSort()) !== false) {
            $models = $this->sortModels($models, $sort);
        }

        if (($pagination = $this->getPagination()) !== false) {
            $pagination->totalCount = $this->getTotalCount();
        }

        return $models;
    }

    /*
     *       @inheritdoc
     */
    protected function prepareTotalCount()
    {
        return $this->getTotalCount();
    }

}

最后,來(lái)一個(gè)實(shí)際使用案例:

// TODO 業(yè)務(wù)邏輯
$data = ... // 數(shù)據(jù)數(shù)組或?qū)ο?$count = ... // 數(shù)據(jù)總條數(shù),并不是count($data)的值,是數(shù)據(jù)庫(kù)中符合條件的所有數(shù)據(jù)總數(shù)
$dataProvider = new ackendextensionsArrayDataProvider([
"allModels" => $data,
"totalCount" => isset($count) ? $count : 0,
"key" => "ltime",
"sort" => [
    "attributes" => [
        "gmv",
        "ltime",
        "uv"
    ],
    "defaultOrder" => [
        "gmv" => SORT_DESC,
        "ltime" => SORT_DESC,
        "uv" => SORT_DESC,
    ],
],
"pagination" => [
    "pageSize" => 15,
],
]);

// 傳遞到test視圖渲染
return $this->render("test", ["model" => $model, "dataProvider" => $dataProvider]);

在視圖層接收該數(shù)據(jù)提供器,傳遞給一個(gè)數(shù)據(jù)渲染插件,比如GridView:

echo GridView::widget([
    "dataProvider" => $dataProvider,
    "columns" => [
        ["class" => "yiigridSerialColumn"],
        [
            "class" => "yiigridDataColumn",
            "value" => function ($data) {
                if (isset($data["ltime"]) && !empty($data["ltime"])) {
                    return date("Y-m-d", $data["ltime"]);
                }
            },
            "label" => "日期",
            "format" => "raw",
    ],
    "moneyPerUvOrder:raw:訂單UV單價(jià)",
    "moneyPerUvPurchase:raw:銷售UV單價(jià)"
    ]
]);

到此結(jié)束,如果幫到你,請(qǐng)點(diǎn)擊收藏!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21705.html

相關(guān)文章

  • Yii2 GridView使用方法

    摘要:是實(shí)現(xiàn)網(wǎng)格視圖的小部件,一般用于報(bào)表視圖的展示。就是連續(xù)的列,主要用于網(wǎng)格的行號(hào),屬于自增式的列。指定處理的類,必須。 Yii2 GridView是實(shí)現(xiàn)yii網(wǎng)格視圖的小部件,一般用于報(bào)表視圖的展示。今天,結(jié)合DataProvider(ArrayDataProvider以及SqlDataProvider)說(shuō)一下GridView中的幾個(gè)Columns(SerialColumn,DataC...

    Paul_King 評(píng)論0 收藏0
  • 阿北知識(shí)分享小程序中restful使用經(jīng)驗(yàn)貼

    摘要:大家知道我最近在給阿北的知識(shí)分享微信小程序改版,使用的是中的功能,接下來(lái)把遇到的一些問(wèn)題及小技巧分享一下。小結(jié)以上就是目前為止在使用的開發(fā)小程序時(shí)候使用的一些知識(shí)和技巧,希望對(duì)你有用,以后如果有再分享哈。 大家知道我最近在給阿北的知識(shí)分享微信小程序改版,使用的是yii2中的restful功能,接下來(lái)把遇到的一些問(wèn)題及小技巧分享一下。 先安利一下小程序碼 鏈接 開始分享。 URL要重寫 ...

    Meils 評(píng)論0 收藏0
  • Yii修行之路 - Extension 擴(kuò)展

    摘要:運(yùn)行來(lái)安裝指定的擴(kuò)展。這更便于用戶辨別是否是的擴(kuò)展。當(dāng)用戶運(yùn)行安裝一個(gè)擴(kuò)展時(shí),文件會(huì)被自動(dòng)更新使之包含新擴(kuò)展的信息。上述代碼表明該擴(kuò)展依賴于包。例如,上述的條目聲明將對(duì)應(yīng)于別名。為達(dá)到這個(gè)目的,你應(yīng)當(dāng)在公開發(fā)布前做測(cè)試。 簡(jiǎn)述 擴(kuò)展是專門設(shè)計(jì)的在 Yii 應(yīng)用中隨時(shí)可拿來(lái)使用的, 并可重發(fā)布的軟件包。 基礎(chǔ) 例如, yiisoft/yii2-debug 擴(kuò)展在你的應(yīng)用的每個(gè)頁(yè)面底部添加...

    bovenson 評(píng)論0 收藏0
  • 微信小程序[第十一篇] -- 添加照片(小程序圖片上傳功能)

    摘要:注拍照功能在某些機(jī)型上還有閃退現(xiàn)象,希望微信官方可以盡快完善。這涉及到函數(shù),這是微信小程序內(nèi)置的,用來(lái)上傳一個(gè)文件,有幾個(gè)點(diǎn)要說(shuō)下綠色框要上傳文件資源的路徑,也就是我們相冊(cè)里選擇的圖片路徑。 我們喜歡小程序的原因之一就是它提供了更多和手機(jī)系統(tǒng)交互的接口,比如今天要說(shuō)的這個(gè)從相冊(cè)選擇 / 拍照功能。注:拍照功能在某些機(jī)型上還有閃退現(xiàn)象,希望微信官方可以盡快完善。 在上一篇中我們搞定了相冊(cè)...

    muzhuyu 評(píng)論0 收藏0
  • YII2項(xiàng)目常用技能知識(shí)總結(jié)

    摘要:不通過(guò)日志獲取執(zhí)行的原生語(yǔ)句和打印變量數(shù)據(jù)打印變量數(shù)據(jù)可以這樣寫引用命名空間使用使用第二個(gè)參數(shù)是數(shù)組的深度第三個(gè)參數(shù)是是否顯示代碼高亮默認(rèn)不顯示從數(shù)據(jù)庫(kù)二維數(shù)組中返回一維數(shù)組并配合驗(yàn)證規(guī)則實(shí)現(xiàn)分類數(shù)據(jù)過(guò)濾。 1、不通過(guò)日志獲取AR執(zhí)行的原生SQL語(yǔ)句和打印變量數(shù)據(jù) $query = User::find() ->select([username])->where([id=>[1,2,3...

    W_BinaryTree 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<