PHP フレームワーク Laravel プラグインについて カスタム ページングを実装するページネーション メソッド

不言
リリース: 2023-04-01 06:16:01
オリジナル
2324 人が閲覧しました

この記事では、カスタムページングを実装するためのPHPフレームワークLaravel5.1のプラグインPaginationに関する関連情報を中心に紹介しますので、必要な方は参考にしてください

Laravelのページングは​​とても便利です。拡張するのは非常に簡単です。例として、paginate() メソッドと simplePaginate() メソッドを拡張して、「《」と「》」の代わりに「前のページ」と「次のページ」を表示するなどのカスタム ページング スタイルを実装してみましょう。もちろん、展開方法をマスターすれば、特定のページにジャンプしたり、ページング内の総レコード数や現在表示されているレコード範囲を表示したりなど、思い通りのページングを展開することができます。 。 。

5.1 と 5.2 は同じ方法であるはずです。ここでは 5.2 バージョンを使用しています。ドキュメントによると、Paginator はクエリ ビルダーと Eloquent の simplePaginate メソッドに対応し、LengthAwarePaginator は 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 です。つまり、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 要素を書き換えるだけです。これはブレード テンプレートでも修正する必要があります。たとえば、Paginator は $users と呼ばれ、デフォルトのページング表示は $users->render() のようになります。 !!}

カスタマイズされたページング表示に変更します:
{!! with(new \App\Foundations\Pagination\CustomerPresenter($categories))->render() !!}

これで、ページング リンクに「前のページ」と「次のページ」のスタイルと数字が含まれていることがページ上で確認できるはずです。
では、simplePaginate を拡張するとどうなるでしょうか。実際には、CustomerPresenter を継承し、hasPages を実装してレンダリングするだけです。その理由については、私がソース コードを見たときと同じように考えてください。たとえば、上記を「前の記事」と「次の記事」

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

    return &#39;&#39;;
  }

}
ログイン後にコピー

ページネーション表示:

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


このメソッドを変更し、必要に応じて HTML 要素を表示する対応するメソッドを書き換えるだけです。

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

Laravel 4 でのページとフォームの検証

Laravel のスロットル ミドルウェアの障害の問題を解決する方法

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

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