Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Blog] Pagination avec Turbo #504

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

maximecolin
Copy link
Member

No description provided.

@maximecolin maximecolin self-assigned this Dec 1, 2022
@maximecolin maximecolin marked this pull request as draft December 1, 2022 13:01
github-actions bot pushed a commit that referenced this pull request Dec 1, 2022
@ogizanagi ogizanagi added the blog Article de blog label Dec 1, 2022
Copy link
Member

@ogizanagi ogizanagi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🙏🏻

authors: ["mcolin"]
---

La pagination avec scroll infin est le fait de chargé automatiquement les pages suivante d'une pagination au fur et à mesure du scroll. C'est un artifice qui fait en général son effet et qui peut s'avérer une bonne pratique UX dans certains cas.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
La pagination avec scroll infin est le fait de chargé automatiquement les pages suivante d'une pagination au fur et à mesure du scroll. C'est un artifice qui fait en général son effet et qui peut s'avérer une bonne pratique UX dans certains cas.
La pagination avec scroll infini est le fait de charger automatiquement les pages suivantes d'une pagination au fur et à mesure du scroll. C'est un artifice qui fait en général son effet et qui peut s'avérer une bonne pratique UX dans certains cas.


Nous allons voir dans cet article comment réaliser cet effet grâce à [Hotwired Turbo](https://turbo.hotwired.dev/) sans coder la moindre ligne de Javascript.

Je vais pour cela partir d'une base Symfony qui dispose déjà du Turbo installé et configuré grâce au bundle [Symfony UX Turbo](https://symfony.com/bundles/ux-turbo/current/index.html), mais les principes décrits ici sont utilisable dans n'importe quel autre environnement utilisant Turbo.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Je vais pour cela partir d'une base Symfony qui dispose déjà du Turbo installé et configuré grâce au bundle [Symfony UX Turbo](https://symfony.com/bundles/ux-turbo/current/index.html), mais les principes décrits ici sont utilisable dans n'importe quel autre environnement utilisant Turbo.
Je vais pour cela partir d'une base Symfony qui dispose déjà de Turbo installé et configuré grâce au bundle [Symfony UX Turbo](https://symfony.com/bundles/ux-turbo/current/index.html), mais les principes décrits ici sont utilisable dans n'importe quel autre environnement utilisant Turbo.


Nous allons commencer par quelques petits rappels sur le fonctionnement de Turbo.

Le principe de cette librairie est de prendre la main sur les liens et les formulaires de votre page html afin de remplacer les requêtes que ferait votre navigateur par des rêquêtes asyncrhones (`fetch`) réalisé en javascript. La librairie va ensuite mettre à jour le DOM de votre page avec le HTML retourner par le serveur, l'idée étant ainsi de faire de éconnomie de requête en ne rechargeant pas toute la page comme avec une requête navigateur classique.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Le principe de cette librairie est de prendre la main sur les liens et les formulaires de votre page html afin de remplacer les requêtes que ferait votre navigateur par des rêquêtes asyncrhones (`fetch`) réalisé en javascript. La librairie va ensuite mettre à jour le DOM de votre page avec le HTML retourner par le serveur, l'idée étant ainsi de faire de éconnomie de requête en ne rechargeant pas toute la page comme avec une requête navigateur classique.
Le principe de cette librairie est de prendre la main sur les liens et les formulaires de votre page html afin de remplacer les requêtes que ferait votre navigateur par des requêtes asynchrones (`fetch`) réalisées en javascript. La librairie va ensuite mettre à jour le DOM de votre page avec le HTML retourné par le serveur. L'idée étant ainsi de faire des économies de requête en ne rechargeant pas toute la page contrairement à une requête navigateur classique.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Peut-être mentionner qu'il s'agit là de Turbo Drive (et donc différent de Turbo Frame utilisé en complément pour la pagination)


Turbo propose également deux fonctionnalités qui font de paire avec ce principe :

- Les `<turbo-frame>` qui permettent de décomposer votre page en portions indépendantes qui pourront être rechargée ou modifiée indépendamment de la page.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Les `<turbo-frame>` qui permettent de décomposer votre page en portions indépendantes qui pourront être rechargée ou modifiée indépendamment de la page.
- Les `<turbo-frame>` qui permettent de décomposer votre page en portions indépendantes qui pourront être rechargées ou modifiées indépendamment de la page.

3. Lorsque l'on arrive à nouveau en base de liste, on ajoute les n éléments suivants à la liste
4. Et ainsi de suite jusqu'au dernier élément disponible

##
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Titre manquant ? 😄


Pour la suite je vais prendre comme hypothèque que nous avons une pagination par page fonctionnelle. Mais que vous utilisiez une pagination par page ou par curseur, le principe est le même.

Je prend donc pour hypothèse que vous disposez d'une classe `ItemPaginator` proposant une méthode `paginate(int $page): Pagination` retournant un objet `Pagination` contenant les éléments de la page demandée ainsi que différentes méthodes : `getCurrentPage(): int` permetant de connaitre la page courante, `getNextPage(): int` retournant la page suivante et `isLastPage(): bool` indiquant si la page courante est la dernière.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Je prend donc pour hypothèse que vous disposez d'une classe `ItemPaginator` proposant une méthode `paginate(int $page): Pagination` retournant un objet `Pagination` contenant les éléments de la page demandée ainsi que différentes méthodes : `getCurrentPage(): int` permetant de connaitre la page courante, `getNextPage(): int` retournant la page suivante et `isLastPage(): bool` indiquant si la page courante est la dernière.
Je prends donc pour hypothèse que vous disposez d'une classe `ItemPaginator` proposant une méthode `paginate(int $page): Pagination` retournant un objet `Pagination` contenant les éléments de la page demandée ainsi que différentes méthodes :
- `getCurrentPage(): int` permettant de connaitre la page courante
- `getNextPage(): int` retournant la page suivante
- `isLastPage(): bool` indiquant si la page courante est la dernière


### Etape 1 - Afficher la première page

Ici rien de sorcier, comme dans une pagination classique on utilise une boucle pour afficher les élément de la première page.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Ici rien de sorcier, comme dans une pagination classique on utilise une boucle pour afficher les élément de la première page.
Ici, rien de sorcier, comme dans une pagination classique on utilise une boucle pour afficher les éléments de la première page.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
blog Article de blog
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants