Skip to content
Gérits Aurélien edited this page Feb 19, 2026 · 3 revisions

Le PaginationTool est un utilitaire conçu pour automatiser la pagination des résultats de recherche. Il travaille en étroite collaboration avec le QueryBuilder pour extraire les données tout en calculant intelligemment le nombre total de pages disponibles.

Namespace : Magepattern\Component\Tool\PaginationTool

Fonctionnement

Le Tool utilise le clonage d'objet pour réaliser deux actions en une seule passe :

Comptage optimisé : Il clone le QueryBuilder, nettoie les colonnes, les tris (ORDER BY) et les limites pour exécuter un COUNT(*) ultra-rapide.

Découpage des données : Il injecte les clauses LIMIT et OFFSET appropriées dans votre QueryBuilder original.

Utilisation Standard

Voici comment intégrer la pagination dans une méthode de récupération de données (Layer ou Model) :

use Magepattern\Component\Database\QueryBuilder;
use Magepattern\Component\Database\Layer;
use Magepattern\Component\Tool\PaginationTool;

public function getProducts(int $page = 1, int $limit = 20): array
{
    // 1. Définir la requête de base (sans limites)
    $qb = (new QueryBuilder())
        ->select(['p.id_product', 'p.price_p', 'pc.name_p'])
        ->from('mc_catalog_product', 'p')
        ->join('mc_catalog_product_content', 'pc', 'p.id_product = pc.id_product')
        ->where('pc.published_p = 1')
        ->orderBy('p.id_product', 'DESC');

    // 2. Initialiser le PaginationTool
    $pager = new PaginationTool($limit, $page);
    
    // 3. Appliquer la pagination (Modifie $qb par référence et retourne les métadonnées)
    $pagination = $pager->paginate($qb);

    // 4. Récupérer les données
    $data = Layer::getInstance()->fetchAll($qb->getSql(), $qb->getParams());

    return [
        'items'      => $data ?: [],
        'pagination' => $pagination
    ];
}

Exemple simple :

// 1. Initialisation
$qb = (new QueryBuilder())->select('*')->from('mc_cms_page');

// 2. Filtrage via DateTool
$date = DateTool::toSql('19/02/2026');
$qb->where('date_register LIKE :d', ['d' => "%$date%"]);

// 3. Pagination & Fetch
$meta = (new PaginationTool(10, 1))->paginate($qb);
$data = Layer::getInstance()->fetchAll($qb->getSql(), $qb->getParams());

Structure des métadonnées retournées

La méthode paginate() retourne un tableau associatif indispensable pour construire votre interface (UI) :

Clé Type Description
total_items int Nombre total d'enregistrements en base (ex: 450).
total_pages int Nombre total de pages calculé (ex: 23).
current_page int La page actuellement consultée.
items_per_page int La limite définie (par défaut 20).
offset int L'index de départ calculé pour SQL.

Bonnes pratiques

Clonage automatique : Vous n'avez pas besoin de cloner votre QueryBuilder manuellement, le Tool le fait déjà en interne pour la requête de comptage.

Performance : Grâce à l'utilisation de clearSelect() et clearOrderBy(), la requête de comptage est optimisée pour ne pas solliciter inutilement les index de tri du serveur SQL.

Sécurité : L'offset et la limite sont castés en entiers pour éviter toute faille.

Clone this wiki locally