Les composants de pagination affichent les contenus paginés et les liens de pagination correspondants.
Le composant de pagination est un composant d'UI, ce qui signifie qu'il va être attaché à un noeud du DOM.
Il possède un autre composant d'UI pour l'affichage des liens de pagination, et la méthode attr()->pagination()
permet de définir dans les templates l'endoit où ils seront affichés.
<div class="row">
<!-- Pagination content component -->
<div class="col-md-12" <?php
echo attr()->bind(rq(PageComponent::class)) ?>>
</div>
<!-- Pagination links component -->
<div class="col-md-12" <?php
echo attr()->pagination(rq(PageComponent::class)) ?>>
</div>
</div>
Note: le contenu du composant des liens est affiché uniquement si le nombre de pages est supérieur à 1.
Affichage de la pagination
Les composants de pagination héritent de la classe Jaxon\App\PageComponent
, qui, comme les composants d'UI, les oblige a implémenter une fonction public function html(): string|Stringable
.
La nouvelle méthode currentPage()
renvoie le numéro de la page courante.
public function html(): string
{
return '<div>Showing page number ' . $this->currentPage() . '</div>';
}
La classe Jaxon\App\PageComponent
impose aussi l'implémentation des méthodes protected function limit(): int
et protected function count(): int
, qui doivent respectivement renvoyer le nombre maximal d'items par page, et le nombre d'items à paginer.
Enfin, la fonction qui affiche le contenu paginé peut être mise en place.
public function showPage(int $pageNumber)
{
// Get the paginator. This will also set the final page number value.
$paginator = $this->paginator($pageNumber);
// Render the page content.
$this->render();
// Render the pagination component.
$paginator->render($this->rq()->showPage());
}
Utilisation d'un data bag
Le trait Jaxon\App\PageDatabagTrait
peut être utilisé pour conserver les paramètres de pagination dans un data bag.
Cela permet par exemple lorsque l'utilisateur quitte et revient sur la page, de le repositionner sur le dernier numéro de page visité.
Le trait Jaxon\App\PageDatabagTrait
impose l'implémentation des méthodes protected function bagName(): string
et protected function bagAttr(): string
, qui doivent respectivement renvoyer le nom du data bag
, et la clé qui va stocker le numéro de page.
/**
* @databag content
*/
class PageContent extends \Jaxon\App\PageComponent
{
use PageDatabagTrait;
/**
* @inheritDoc
*/
protected function bagName(): string
{
return 'content';
}
/**
* @inheritDoc
*/
protected function bagAttr(): string
{
return 'page.number';
}
/**
* @inheritDoc
*/
protected function limit(): int
{
return 10;
}
/**
* @inheritDoc
*/
protected function count(): int
{
return 150;
}
public function html(): string
{
return '<div>Showing page number ' . $this->currentPage() . '</div>';
}
public function showPage(int $pageNumber)
{
// Get the paginator. This will also set the final page number value.
$paginator = $this->paginator($pageNumber);
// Render the page content.
$this->render();
// Render the pagination component.
$paginator->render($this->rq()->showPage(pm()->page()));
}
}