ホームページ > バックエンド開発 > PHPチュートリアル > Laravel5.1+ ページネーション分析と拡張機能

Laravel5.1+ ページネーション分析と拡張機能

WBOY
リリース: 2016-06-20 12:29:02
オリジナル
934 人が閲覧しました

Laravel のページネーションは非常に便利で、実際に拡張するのは非常に簡単です。以下の例を使用して、paginate() メソッドと simplePaginate() メソッドを拡張して、Display などのカスタム ページング スタイルを実装してみましょう。 「前のページ」「次のページ」 の代わりに """""" をマスターすると、もちろん展開されます。メソッドを使用すると、特定のページにジャンプしたり、ページング内のレコードの総数や現在表示されているレコードの範囲を表示したりするなど、目的のページングを無節操に拡張できます。 。 。

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() はページング表示の実際の実装です。次に、Presenter インターフェイスで定義されている PaginatorContract を見てみましょう。

  • 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 メソッドが定義されており、実装する必要があります。

これで、ページング表示をカスタマイズしたい場合は、インターフェイスに render() と hasPages() を実装する独自の Presenter を作成する必要があることが明確になりました。

まず、真ん中にページネーション番号の例を使用して、「前のページ」と「次のページ」を表示する 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 要素を書き換えるだけで済みます。たとえば、Paginator はブレード テンプレート内で変更する必要があります。 $users と呼ばれるデフォルトのページング表示は次のようなものです:

{!! $users->render() !!}
ログイン後にコピー
これをカスタマイズしたページング表示に変更します:

{!! with(new \App\Foundations\Pagination\CustomerPresenter($categories))->render() !!}
ログイン後にコピー
OK、ページ上に表示されるはずです。ページネーション リンクには、「前のページ」と「次のページ」のスタイルと数字が含まれるようになりました。

では、simplePaginate を拡張するとどうなるでしょうか。実際には、CustomerPresenter を継承し、hasPages を実装してレンダリングするだけです。その理由については、私がソース コードを見たときと同じように考えることができます。たとえば、上記では「前の記事」と「次の記事」に変更します。

Create 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 \App\Foundations\Pagination\CustomerSimplePresenter($categories))->render() !!}
ログイン後にコピー
この方法は、必要に応じて具体的な変更を加えて、対応する HTML 要素を表示する方法で十分です。

転載する場合は次のように明記してください: Ryan は新人です | LNMP テクノロジー スタック ノートから転載

この記事が非常に役立つと思われる場合は、報酬を贈ってみてはいかがでしょうか

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート