Laravel はページネーション プラグインを使用してカスタム ページネーションを実装する方法を教えてください。この記事では、カスタム ページングを実装するための PHP フレームワーク Laravel5.1 プラグイン Pagination に関する関連情報を中心に紹介します。お役に立てれば幸いです。
Laravel のページネーションは非常に便利で、実際には拡張するのが非常に簡単です。以下の例を使用して、paginate() メソッドと simplePaginate() メソッドを拡張して、「前のページ」と「次のページ」を表示するなどのカスタム ページング スタイルを実装してみましょう。もちろん、展開方法をマスターすれば、特定のページにジャンプしたり、ページング内の総レコード数を表示したりするなど、自在にページングを展開することができます。現在表示されているレコード範囲は、なんとかなんとかです。 。 。
5.1と5.2は同じ方法であるはずですが、ここでは5.2バージョンを使用しています。ドキュメントによると、Paginator はクエリ ビルダーと Eloquent の simplePaginate メソッドに対応し、LengthAwarePaginator は paginate メソッドに相当します。次に、ソース コードを見てみましょう。具体的には、paginate は render() をどのように実装しているのでしょうか?
Illuminate/Pagination/LengthAwarePaginator.php
<?php namespace 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
<?php namespace 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。
<?php namespace 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 要素を書き換えるだけで済みます。これは非常に柔軟であり、ブレード テンプレート内で変更する必要があります。たとえば、デフォルトのページネーションは $users と呼ばれます。表示は次のようになります:
{!! $users->render() !!}カスタマイズされたページネーション表示に変更します:
{!! with(new AppFoundationsPaginationCustomerPresenter($categories))->render () !! }これで、ページング リンクに「前のページ」と「次のページ」のスタイルと数字が含まれていることがわかります。
では、simplePaginate を拡張するとどうなるでしょうか? それは実際には、CustomerPresenter を継承し、hasPages を実装してレンダリングするだけです。たとえば、上記のソース コードを参照するだけです。 、「前の記事」と「次の記事」に変更します 記事「
New AppFoundationsPaginationCustomerSimplePresenter.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 AppFoundationsPaginationCustomerSimplePresenter($categories))->」 ;render() !!}
このメソッドは、特定の変更を加え、独自のニーズに応じて HTML 要素を表示する対応するメソッドを書き直すだけです。
関連する推奨事項:
Laravelを使用してGravatarアバターアドレスを生成するエレガントな方法
以上がLaravelはPaginationプラグインを使用してカスタムページネーションを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。