Laravel5.1+ 分頁Pagination解析以及擴充

來源:互聯網
上載者:User
Laravel 的分頁很方便,其實擴充起來也挺容易的,下面就來做個樣本,擴充一下 paginate()和 simplePaginate()方法,來實現我們自訂分頁樣式,比如顯示 "上一頁""下一頁",而不是 "《""》",當然擴充的方法掌握了你就可以肆無忌憚的擴充一個你想要的分頁了,比如跳轉到某一頁,分頁顯示一共多少記錄,當前顯示的記錄範圍等等巴拉巴拉的。。。

5.1和5.2應該是同樣的方法,我這裡用的是5.2的版本。文檔告訴我們 Paginator對應於查詢語句構造器和 Eloquent 的 simplePaginate方法,而 LengthAwarePaginator則等同於 paginate方法。那我們還是來看下源碼,具體這個 paginate是如何? render()的,

  • Illuminate/Pagination/LengthAwarePaginator.php
render();    }......}

render()中傳入的是一個 Presenter的執行個體,並調用這個執行個體化的 render方法來實現分頁的顯示的。如果沒有則調用 BootstrapThreePresenter中 render()的,來看看 BootstrapThreePresenter是幹嘛的

  • Illuminate/Pagination/BootstrapThreePresenter.php
paginator = $paginator;        $this->window = is_null($window) ? UrlWindow::make($paginator) : $window->get();    }    /**     * Determine if the underlying paginator being presented has pages to show.     *     * @return bool     */    public function hasPages()    {        return $this->paginator->hasPages();    }    /**     * Convert the URL window into Bootstrap HTML.     *     * @return \Illuminate\Support\HtmlString     */    public function render()    {        if ($this->hasPages()) {            return new HtmlString(sprintf(                '
 
    %s %s %s
', $this->getPreviousButton(), $this->getLinks(), $this->getNextButton() )); } return ''; }......}

這裡可以看到 BootstrapThreePresenter實現了 PresenterContract的介面, render()才是分頁顯示的真正實現,構造方法中的第一個參數 PaginatorContract其實就是一個 Paginator我們繼續看下 PresenterContract也就是 Presenter介面中定義了什麼方法需要實現

  • illuminate/contracts/Pagination/Presenter.php
    

其中定義了 render和 hasPages方法需要實現

好了,那我們現在已經很清晰了,我們要自訂分頁的顯示,那麼就要寫一個我們自己的 Presenter來實現介面中的 render()和 hasPages()就可以了。

首先就來簡單的實現一個paginate(),顯示出來"上一頁"和"下一頁",中間是分頁數位例子。

建立檔案如下(個人習慣) app/Foundations/Pagination/CustomerPresenter.php

paginator = $paginator;        $this->window = is_null($window) ? UrlWindow::make($paginator) : $window->get();    }    /**     * Determine if the underlying paginator being presented has pages to show.     *     * @return bool     */    public function hasPages()    {        return $this->paginator->hasPages();    }    /**     * Convert the URL window into Bootstrap HTML.     *     * @return \Illuminate\Support\HtmlString     */    public function render()    {        if ($this->hasPages()) {            return new HtmlString(sprintf(                '
  
    %s %s %s
', $this->getPreviousButton('上一頁'),//具體實現可以查看該方法 $this->getLinks(), $this->getNextButton('下一頁')//具體實現可以查看該方法 )); } return ''; } /** * Get HTML wrapper for an available page link. * * @param string $url * @param int $page * @param string|null $rel * @return string */ protected function getAvailablePageWrapper($url, $page, $rel = null) { $rel = is_null($rel) ? '' : ' rel="' . $rel . '"'; return '
  • ' . $page . '
  • '; } /** * Get HTML wrapper for disabled text. * * @param string $text * @return string */ protected function getDisabledTextWrapper($text) { return '
  • ' . $text . '
  • '; } /** * Get HTML wrapper for active text. * * @param string $text * @return string */ protected function getActivePageWrapper($text) { return '
  • ' . $text . '
  • '; } /** * Get a pagination "dot" element. * * @return string */ protected function getDots() { return $this->getDisabledTextWrapper('...'); } /** * Get the current page from the paginator. * * @return int */ protected function currentPage() { return $this->paginator->currentPage(); } /** * Get the last page from the paginator. * * @return int */ protected function lastPage() { return $this->paginator->lastPage(); }}

    就這麼簡單,主要就是 render()方法,如果項目中需要修改分頁樣式,或者添加分頁跳轉之類的需求只要重寫其中的各項顯示的方法中的html元素就可以了,很靈活,在blade模板中也需要修該,比如我們的 Paginator叫 $users,預設的分頁顯示是這樣的:

    {!! $users->render() !!}

    修改成我們自訂後的分頁顯示:

    {!! with(new \App\Foundations\Pagination\CustomerPresenter($categories))->render() !!}

    好了,這樣在頁面應該就可以看到分頁連結中含有 "上一頁"和"下一頁"加數位樣式了。

    那麼如果擴充simplePaginate?其實很簡單,只要繼承剛才的 CustomerPresenter,實現 hasPages和 render,至於為什麼可以按照我上面查看源碼的方式看一下就知道了,比如我們改成"上一篇"和"下一篇"

    建立App\Foundations\Pagination\CustomerSimplePresenter.php

    paginator = $paginator;    }    /**     * Determine if the underlying paginator being presented has pages to show.     *     * @return bool     */    public function hasPages()    {        return $this->paginator->hasPages() && count($this->paginator->items()) > 0;    }    /**     * Convert the URL window into Bootstrap HTML.     *     * @return \Illuminate\Support\HtmlString     */    public function render()    {        if ($this->hasPages()) {            return new HtmlString(sprintf(                '
      
      %s %s
    ', $this->getPreviousButton('上一篇'), $this->getNextButton('下一篇') )); } return ''; }}

    分頁顯示:

    {!! with(new \App\Foundations\Pagination\CustomerSimplePresenter($categories))->render() !!}

    方法就是這個方法,具體修改按照自己需求重寫其中對應的顯示html元素的方法就可以了。

    轉載請註明:轉載自 Ryan是菜鳥 | LNMP技術棧筆記

    如果覺得本篇文章對您十分有益,何不打賞一下

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.