ホームページ  >  記事  >  バックエンド開発  >  LaravelはPaginationプラグインを使用してカスタムページネーションを実装します

LaravelはPaginationプラグインを使用してカスタムページネーションを実装します

*文
*文オリジナル
2018-01-02 10:03:202071ブラウズ

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(
        &#39;<ul class="pagination">%s %s %s</ul>&#39;,
        $this->getPreviousButton(),
        $this->getLinks(),
        $this->getNextButton()
      ));
    }

    return &#39;&#39;;
  }
......
}

ここで、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(
        &#39;<ul class="pagination">%s %s %s</ul>&#39;,
        $this->getPreviousButton(&#39;上一页&#39;),//具体实现可以查看该方法
        $this->getLinks(),
        $this->getNextButton(&#39;下一页&#39;)//具体实现可以查看该方法
      ));
    }

    return &#39;&#39;;
  }

  /**
   * 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) ? &#39;&#39; : &#39; rel="&#39; . $rel . &#39;"&#39;;

    return &#39;<li><a href="&#39; . htmlentities($url) . &#39;"&#39; . $rel . &#39;>&#39; . $page . &#39;</a></li>&#39;;
  }

  /**
   * Get HTML wrapper for disabled text.
   *
   * @param string $text
   * @return string
   */
  protected function getDisabledTextWrapper($text)
  {
    return &#39;<li class="disabled hide"><span>&#39; . $text . &#39;</span></li>&#39;;
  }

  /**
   * Get HTML wrapper for active text.
   *
   * @param string $text
   * @return string
   */
  protected function getActivePageWrapper($text)
  {
    return &#39;<li class="active"><span>&#39; . $text . &#39;</span></li>&#39;;
  }

  /**
   * Get a pagination "dot" element.
   *
   * @return string
   */
  protected function getDots()
  {
    return $this->getDisabledTextWrapper(&#39;...&#39;);
  }

  /**
   * 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(
        &#39;<ul class="pager">%s %s</ul>&#39;,
        $this->getPreviousButton(&#39;上一篇&#39;),
        $this->getNextButton(&#39;下一篇&#39;)
      ));
    }

    return &#39;&#39;;
  }

}

ページネーション表示:

{!! with(new AppFoundationsPaginationCustomerSimplePresenter($categories))->」 ;render() !!}

このメソッドは、特定の変更を加え、独自のニーズに応じて HTML 要素を表示する対応するメソッドを書き直すだけです。

関連する推奨事項:

Laravelを使用してGravatarアバターアドレスを生成するエレガントな方法

Laravelのパスワードリセット例の詳細な説明

laravelのAPPインターフェイス(API)の作成

以上がLaravelはPaginationプラグインを使用してカスタムページネーションを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。