Maison  >  Article  >  développement back-end  >  Laravel utilise le plug-in Pagination pour implémenter une pagination personnalisée

Laravel utilise le plug-in Pagination pour implémenter une pagination personnalisée

*文
*文original
2018-01-02 10:03:202010parcourir

Comment Laravel utilise-t-il le plug-in Pagination pour implémenter une pagination personnalisée ? Cet article présente principalement les informations pertinentes sur la pagination du plug-in PHP Laravel5.1 pour implémenter une pagination personnalisée. Les amis dans le besoin peuvent s'y référer. J'espère que cela aide tout le monde.

La pagination de Laravel est très pratique, et elle est en fait assez facile à étendre. Prenons un exemple ci-dessous et étendons les méthodes paginate() et simplePaginate() pour implémenter notre style de pagination personnalisé, comme l'affichage de "Up". Une page" et "Page suivante" au lieu de """ et """. Bien sûr, si vous maîtrisez la méthode d'expansion, vous pouvez développer une page de votre choix sans contrainte, par exemple passer à une certaine page et afficher la page. Combien d'enregistrements y a-t-il au total, la plage d'enregistrements actuellement affichés, etc. . .

5.1 et 5.2 devraient être la même méthode. J'utilise ici la version 5.2. La documentation nous indique que Paginator correspond au générateur de requêtes et à la méthode simplePaginate d'Eloquent, tandis que lengthAwarePaginator est équivalent à la méthode paginate. Jetons ensuite un coup d'œil au code source. Plus précisément, comment paginate implémente render() ? Ce qui est transmis est une instance de Presenter, et la méthode render de cette instanciation est appelée pour réaliser l'affichage de la pagination. Sinon, appelez render() dans BootstrapThreePresenter pour voir ce que fait BootstrapThreePresenter

Illuminate/Pagination/BootstrapThreePresenter.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();
  }
......
}

Vous pouvez le voir ici BootstrapThreePresenter implémente le interface de PresenterContract. render() est la véritable implémentation de l'affichage de pagination. Le premier paramètre PaginatorContract dans la méthode de construction est en fait un Paginator. Continuons à examiner PresenterContract, qui est les méthodes définies dans l'interface Presenter et qui doivent être implémentées.

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

Il définit les méthodes render et hasPages qui doivent être implémentées

D'accord, maintenant nous sommes très clairs. Si nous voulons personnaliser l'affichage de la pagination, nous devons écrire notre propre Presenter pour implémenter render() et hasPages() dans l'interface.


Tout d'abord, implémentons simplement une paginate() pour afficher la "page précédente" et la "page suivante", avec un exemple de numéros de pagination au milieu.

<?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();
}
Le nouveau fichier est le suivant (habitude personnelle)

app/Foundations/Pagination/CustomerPresenter.php

C'est aussi simple que cela, l'essentiel est la méthode render (), si vous devez modifier le style de pagination ou ajouter des sauts de pagination dans le projet, il vous suffit de réécrire les éléments html dans les méthodes affichées. Elle est très flexible et doit être modifiée dans le blade. template. , par exemple, notre Paginator s'appelle $users, et l'affichage de pagination par défaut est comme ceci :

{!! $users->render() !!} modifié en notre affichage de pagination personnalisé :

<?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 AppFoundationsPaginationCustomerPresenter($categories))->render() !!}

D'accord, vous devriez pouvoir voir le lien de pagination sur la page Contient le style de « page précédente » et « page suivante » ainsi que des chiffres.

Et si vous étendiez simplePaginate ? C'est en fait très simple. Il vous suffit d'hériter de CustomerPresenter tout à l'heure et d'implémenter hasPages et de le rendre. Quant à savoir pourquoi, vous pouvez simplement le regarder comme j'ai vu le code source. ci-dessus. Par exemple, nous le modifions en "Article précédent" " et "Article suivant"

New AppFoundationsPaginationCustomerSimplePresenter.php

Affichage de la pagination :

{!! with(new AppFoundationsPaginationCustomerSimplePresenter($categories))->render() !!}
<?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;;
  }

}

La méthode est cette méthode spécifiquement modifiée. et réécrivez la méthode correspondante d'affichage des éléments HTML en fonction de vos propres besoins.

Recommandations associées :

Une façon élégante de générer l'adresse de l'avatar Gravatar à l'aide de Laravel

Explication détaillée de l'exemple de réinitialisation de mot de passe Laravel

Interface d'application d'écriture Laravel (API)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn