À propos de la méthode de pagination du plug-in Laravel du framework PHP pour implémenter une pagination personnalisée

不言
Libérer: 2023-04-01 06:16:01
original
2250 Les gens l'ont consulté

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

La pagination de Laravel est très pratique, et elle est en fait assez. facile à développer. Prenons un exemple et étendons les méthodes paginate() et simplePaginate() pour implémenter notre style de pagination personnalisé, comme afficher la "page précédente" et la "page suivante" au lieu de "《" et "》 Bien sûr". , une fois que vous maîtrisez la méthode d'expansion, vous pouvez sans scrupules développer une pagination souhaitée, par exemple accéder à une certaine page, afficher le nombre total d'enregistrements dans la pagination, 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 dans render() est une instance de Presenter et la méthode de rendu instanciée. est appelé 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();
  }
......
}
Copier après la connexion


Ici, vous pouvez voir que BootstrapThreePresenter implémente l'interface de PresenterContract. render() est la véritable implémentation de l'affichage de pagination. Le premier paramètre PaginatorContract dans la méthode constructeur est en fait un Paginator. Ensuite, PresenterContract correspond aux méthodes définies dans l'interface Presenter 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;;
  }
......
}
Copier après la connexion

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 présentateur peut 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();
}
Copier après la connexion

Le nouveau fichier est le suivant (habitude personnelle)

app/Foundations/Pagination/CustomerPresenter.php

C'est aussi simple que cela, principalement la méthode render() Si vous devez modifier le style de pagination ou ajouter des sauts de pagination dans le projet, réécrivez simplement les éléments html dans chaque méthode d'affichage, très flexible. doit également être modifié dans le modèle de lame. Par exemple, notre Paginator s'appelle $users, et l'affichage de pagination par défaut est comme ceci :

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

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

}
Copier après la connexion
Modifié vers notre affichage de pagination personnalisé :

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

D'accord, vous devriez maintenant pouvoir voir sur la page que les liens de pagination contiennent le style « page précédente » et « page suivante » plus 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 :

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

}
Copier après la connexion
{!! with(new AppFoundationsPaginationCustomerSimplePresenter($categories))->render() !!}

La méthode est cette méthode, Pour des modifications spécifiques, réécrivez simplement la méthode correspondante d'affichage des éléments html en fonction de vos propres besoins.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Validation des pages et des formulaires dans Laravel 4

Comment résoudre le problème de l'échec du middleware d'accélérateur de Laravel

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!