Heim  >  Artikel  >  Backend-Entwicklung  >  Laravel verwendet das Pagination-Plug-in, um benutzerdefinierte Paginierung zu implementieren

Laravel verwendet das Pagination-Plug-in, um benutzerdefinierte Paginierung zu implementieren

*文
*文Original
2018-01-02 10:03:202010Durchsuche

Wie nutzt Laravel das Pagination-Plug-in, um benutzerdefinierte Paginierung zu implementieren? In diesem Artikel werden hauptsächlich relevante Informationen zum PHP-Framework Laravel5.1-Plug-in Pagination zur Implementierung von benutzerdefiniertem Paging vorgestellt. Ich hoffe, es hilft allen.

Die Paginierung von Laravel ist sehr praktisch und lässt sich tatsächlich ganz einfach erweitern. Nehmen wir das folgende Beispiel und erweitern Sie die Methoden paginate() und simplePaginate(), um unseren benutzerdefinierten Paginierungsstil zu implementieren, z. B. die Anzeige von „Up“. Eine Seite“ und „Nächste Seite“ anstelle von „““ und „““. Wenn Sie die Erweiterungsmethode beherrschen, können Sie natürlich eine gewünschte Seite ohne Einschränkungen erweitern, z. B. durch Springen zu einer bestimmten Seite und Anzeigen der Seite. Wie viele Datensätze gibt es insgesamt, der Bereich der derzeit angezeigten Datensätze usw. . .

5.1 und 5.2 sollten die gleiche Methode sein. Ich verwende hier Version 5.2. Aus der Dokumentation geht hervor, dass Paginator dem Abfrage-Builder und der simplePaginate-Methode von Eloquent entspricht, während LengthAwarePaginator der Paginate-Methode entspricht. Schauen wir uns dann den Quellcode an. Wie implementiert paginate render()? Was wird übergeben, und die Render-Methode dieser Instanziierung wird aufgerufen, um die Paging-Anzeige zu realisieren. Wenn nicht, rufen Sie render() in BootstrapThreePresenter auf, um zu sehen, was BootstrapThreePresenter tut Schnittstelle von PresenterContract. render() ist die eigentliche Implementierung der Paging-Anzeige. Der erste Parameter PaginatorContract in der Konstruktionsmethode ist tatsächlich ein PaginatorContract, welche Methoden in der Presenter-Schnittstelle definiert sind und implementiert werden müssen

illuminate/contracts/Pagination/Presenter.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();
  }
......
}

Es definiert Render- und hasPages-Methoden, die implementiert werden müssen

Okay, jetzt ist uns alles klar. Wenn wir die Paging-Anzeige anpassen möchten, müssen wir unseren eigenen Presenter schreiben, um render() und hasPages() in der Schnittstelle zu implementieren.
<?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;;
  }
......
}

Zuerst implementieren wir einfach eine paginate(), um „vorherige Seite“ und „nächste Seite“ anzuzeigen, mit einem Beispiel für Paginierungszahlen in der Mitte.

Die neue Datei lautet wie folgt (persönliche Gewohnheit)

app/Foundations/Pagination/CustomerPresenter.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();
}
So einfach ist das, Die Hauptsache ist die Methode render (). Wenn Sie den Paging-Stil ändern oder Paging-Sprünge im Projekt hinzufügen müssen, müssen Sie nur die HTML-Elemente in den angezeigten Methoden neu schreiben. Sie ist sehr flexibel und muss im Blade geändert werden Beispiel: Unser Paginator heißt $users und die Standard-Paginierungsanzeige ist wie folgt:

{!! $users->render() !!}

wird geändert zu unserer angepassten Paginierungsanzeige:

{!! with(new AppFoundationsPaginationCustomerPresenter($categories))->render() !!}

Okay, Sie sollten die Paginierung sehen können Link auf der Seite. Enthält die Stile „Vorherige Seite“ und „Nächste Seite“ mit Zahlen.

Was ist, wenn Sie simplePaginate erweitern? Es ist eigentlich ganz einfach, den CustomerPresenter zu erben und hasPages zu implementieren. Was den Grund betrifft, können Sie es sich einfach so ansehen, wie ich den Quellcode gesehen habe Oben ändern wir es zum Beispiel in „Vorheriger Artikel“ und „Nächster Artikel“

<?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();
  }

}

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

Die Methode ist speziell modifiziert es und schreiben Sie die entsprechende Methode zur Anzeige von HTML-Elementen entsprechend Ihren eigenen Bedürfnissen um.

Verwandte Empfehlungen:

Eine elegante Möglichkeit, mit Laravel eine Gravatar-Avatar-Adresse zu generieren

<?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;;
  }

}

Detaillierte Erläuterung des Beispiels zum Zurücksetzen des Laravel-Passworts

Laravel-Schreib-APP-Schnittstelle (API)

Das obige ist der detaillierte Inhalt vonLaravel verwendet das Pagination-Plug-in, um benutzerdefinierte Paginierung zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn