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

首頁 > 語言 > PHP > 正文

PHP框架Laravel插件Pagination實現自定義分頁

2024-05-04 23:46:34
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP框架Laravel5.1插件Pagination實現自定義分頁的相關資料,需要的朋友可以參考下
 

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

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

Illuminate/Pagination/LengthAwarePaginator.php

<?phpnamespace Illuminate/Pagination;......class LengthAwarePaginator extends AbstractPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Jsonable, LengthAwarePaginatorContract {......  public function render(Presenter $presenter = null)  {    if (is_null($presenter) && static::$presenterResolver) {      $presenter = call_user_func(static::$presenterResolver, $this);    }    $presenter = $presenter ?: new BootstrapThreePresenter($this);    return $presenter->render();  }......}

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

Illuminate/Pagination/BootstrapThreePresenter.php

<?phpnamespace Illuminate/Pagination;use Illuminate/Support/HtmlString; use Illuminate/Contracts/Pagination/Paginator as PaginatorContract; use Illuminate/Contracts/Pagination/Presenter as PresenterContract;class BootstrapThreePresenter implements PresenterContract {  use BootstrapThreeNextPreviousButtonRendererTrait, UrlWindowPresenterTrait;  /**   * The paginator implementation.   *   * @var /Illuminate/Contracts/Pagination/Paginator   */  protected $paginator;  /**   * The URL window data structure.   *   * @var array   */  protected $window;  /**   * Create a new Bootstrap presenter instance.   *   * @param /Illuminate/Contracts/Pagination/Paginator $paginator   * @param /Illuminate/Pagination/UrlWindow|null $window   * @return void   */  public function __construct(PaginatorContract $paginator, UrlWindow $window = null)  {    $this->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(        '<ul class="pagination">%s %s %s</ul>',        $this->getPreviousButton(),        $this->getLinks(),        $this->getNextButton()      ));    }    return '';  }......}

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

illuminate/contracts/Pagination/Presenter.php

<?phpnamespace Illuminate/Contracts/Pagination;interface Presenter {  /**   * Render the given paginator.   *   * @return /Illuminate/Contracts/Support/Htmlable|string   */  public function render();  /**   * Determine if the underlying paginator being presented has pages to show.   *   * @return bool   */  public function hasPages();}

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

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

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

新建文件如下(個人習慣)

app/Foundations/Pagination/CustomerPresenter.php

 

<?php namespace App/Foundations/Pagination;use Illuminate/Contracts/Pagination/Presenter as PresenterContract; use Illuminate/Contracts/Pagination/LengthAwarePaginator as PaginatorContract; use Illuminate/Pagination/UrlWindow; use Illuminate/Support/HtmlString; use Illuminate/Pagination/BootstrapThreeNextPreviousButtonRendererTrait; use Illuminate/Pagination/UrlWindowPresenterTrait;class CustomerPresenter implements PresenterContract {  use BootstrapThreeNextPreviousButtonRendererTrait, UrlWindowPresenterTrait;  protected $paginator;  protected $window;  /**   * Create a new Bootstrap presenter instance.   *   * @param /Illuminate/Contracts/Pagination/Paginator $paginator   * @param /Illuminate/Pagination/UrlWindow|null $window   * @return void   */  public function __construct(PaginatorContract $paginator, UrlWindow $window = null)  {    $this->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(        '<ul class="pagination">%s %s %s</ul>',        $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 '<li><a href="' . htmlentities($url) . '"' . $rel . '>' . $page . '</a></li>';  }  /**   * Get HTML wrapper for disabled text.   *   * @param string $text   * @return string   */  protected function getDisabledTextWrapper($text)  {    return '<li class="disabled hide"><span>' . $text . '</span></li>';  }  /**   * Get HTML wrapper for active text.   *   * @param string $text   * @return string   */  protected function getActivePageWrapper($text)  {    return '<li class="active"><span>' . $text . '</span></li>';  }  /**   * 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

 

<?php namespace App/Foundations/Pagination;use Illuminate/Support/HtmlString; use Illuminate/Contracts/Pagination/Paginator as PaginatorContract;class CustomerSimplePresenter extends CustomerPresenter {  /**   * Create a simple Bootstrap 3 presenter.   *   * @param /Illuminate/Contracts/Pagination/Paginator $paginator   * @return void   */  public function __construct(PaginatorContract $paginator)  {    $this->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(        '<ul class="pager">%s %s</ul>',        $this->getPreviousButton('上一篇'),        $this->getNextButton('下一篇')      ));    }    return '';  }}

分頁顯示:

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

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

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

以上就是本文的全部內容,希望對大家學習PHP程序設計有所幫助。



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一av在线| 亚洲人成电影网站| 国产精品福利观看| 久久久999成人| 久久视频在线直播| 久久视频在线直播| 欧美精品日韩三级| 久久久久国产视频| 亚洲国产精品va在线看黑人动漫| 色无极亚洲影院| 亚洲人成电影网站| 国产精品成人品| 亚洲精品一区av在线播放| 国产精品日日摸夜夜添夜夜av| 国产精彩精品视频| 亚洲欧美在线第一页| 久久亚洲精品网站| 日本三级久久久| 欧美日本高清视频| 国产精品99久久久久久久久久久久| 亚洲黄页视频免费观看| 正在播放国产一区| 91亚洲永久免费精品| 亚洲国产精品久久精品怡红院| 国产福利精品av综合导导航| 亚洲国产99精品国自产| 亚洲综合在线播放| 亚洲美女免费精品视频在线观看| 亚洲字幕一区二区| 久久6免费高清热精品| 欧美日韩成人黄色| 日韩精品中文字幕久久臀| 日本精品视频在线观看| 亚洲综合第一页| 2019中文在线观看| 国产精品日韩欧美| 尤物yw午夜国产精品视频| 成人免费大片黄在线播放| 国产精品福利在线观看| 亚洲欧美日韩第一区| 亚洲性视频网址| 日韩视频亚洲视频| 亚洲欧美一区二区三区在线| 日韩高清人体午夜| 久热精品视频在线| 亚洲视频电影图片偷拍一区| 91在线播放国产| 国产欧美日韩高清| 久久天天躁狠狠躁夜夜爽蜜月| 国产有码在线一区二区视频| 亚洲a成v人在线观看| 福利精品视频在线| 日韩最新免费不卡| 亚洲人成电影在线| 国产精品高清免费在线观看| 日韩精品在线视频| 国产视频亚洲视频| 亚洲精品电影在线观看| 日日摸夜夜添一区| 欧美极品欧美精品欧美视频| 国产成人中文字幕| 日韩美女在线播放| 日韩在线播放av| 成人乱人伦精品视频在线观看| 亚洲一区999| 成人欧美一区二区三区黑人孕妇| 91大神福利视频在线| 欧美最猛性xxxxx亚洲精品| 在线看欧美日韩| 亚洲男人的天堂在线播放| 欧美大成色www永久网站婷| 欧美黑人巨大精品一区二区| 国产精品国产三级国产aⅴ9色| 成人高h视频在线| 欧美日韩亚洲一区二区三区| 久久亚洲欧美日韩精品专区| 色系列之999| 国产精品极品美女在线观看免费| 日韩中文字幕久久| 国产性猛交xxxx免费看久久| 亚洲永久免费观看| 日韩一区二区三区国产| 亚洲bt欧美bt日本bt| 岛国视频午夜一区免费在线观看| 2019最新中文字幕| 日韩av网址在线观看| 在线观看中文字幕亚洲| 久久久999精品视频| 欧美丰满老妇厨房牲生活| 庆余年2免费日韩剧观看大牛| 亚洲国产精品免费| 国产精品久久久久久久电影| 亚洲欧美国产精品专区久久| 欧美在线观看一区二区三区| 成人欧美一区二区三区在线湿哒哒| 欧美老少配视频| 2019中文字幕在线| 国产成人精品免高潮在线观看| 国产精品久久久久久久久久免费| 91精品国产一区| 国内精品久久久久久中文字幕| 中文字幕在线日韩| 日韩h在线观看| 国产精品电影观看| 欧美在线观看视频| 亚洲精品久久久一区二区三区| 这里精品视频免费| 欧美日韩在线一区| 日韩不卡在线观看| 亚洲天堂视频在线观看| 欧美日韩在线观看视频| 欧美激情精品久久久久久久变态| 一本大道久久加勒比香蕉| 日本欧美一级片| 欧美日韩国产123| 综合136福利视频在线| 亚洲视频一区二区| 不卡av在线播放| 欧美激情在线观看视频| 国产成人精品免高潮费视频| 亚洲精品国产精品乱码不99按摩| 日韩a**中文字幕| 一个人看的www欧美| 91精品国产综合久久男男| 日韩中文字幕第一页| 日韩av毛片网| 一区二区亚洲欧洲国产日韩| 欧美另类暴力丝袜| 韩国一区二区电影| 久久夜色精品国产欧美乱| 国产精品久久久久久久久久三级| 91在线免费看网站| 欧美激情在线狂野欧美精品| 亚洲自拍偷拍福利| 91美女福利视频高清| 成人h猎奇视频网站| 欧美国产日本在线| 国产精品成熟老女人| 日韩中文字幕免费| 黄色成人在线播放| 亚洲视频一区二区三区| 国产成人自拍视频在线观看| 久久99精品久久久久久青青91| 久久99精品久久久久久琪琪| 亚洲欧美日韩国产中文专区| 91精品国产综合久久男男| 色yeye香蕉凹凸一区二区av| 欧美巨大黑人极品精男| 国产精品电影久久久久电影网| 午夜精品一区二区三区在线视频| 日韩小视频网址| 国产精品久久久久久久午夜| 国产亚洲激情视频在线| 欧美日韩另类字幕中文| 欧美特黄级在线| 国产aⅴ夜夜欢一区二区三区| 亚洲影视中文字幕| 亚洲欧美福利视频| 欧美在线视频免费播放| 日韩亚洲一区二区| 国产精品一区专区欧美日韩| 国自产精品手机在线观看视频| 亚洲精品白浆高清久久久久久| 中文字幕视频一区二区在线有码|