Recherche rapide : Avancée

 

Vous êtes ici : Accueil > Articles > Pagination des résultats d'une recherche

Pagination des résultats d'une recherche

Lorsque l'on développe par exemple une extension dont le but est d'afficher des informations issues de la base de données suite à une requête d'un utilisateur, on termine généralement par l'implémentation d'une pagination pour l'affichage des résultats. Les raisons sont simples : on évite à l'utilisateur de scroller avec la molette de sa souris pour parcourir une page de 3 kms de long et aussi pour soulager la base de données. En effet, on implémente une limite dans la requête SQL pour n'afficher qu'une partie des résultats. Vous vous doutez certainement où je souhaite en venir. En effet, comment implémenter facilement dans TYPO3 une pagination pour afficher les résultats d'une recherche ?

Simple is beautiful

Si vous êtes comme moi et que vous avez un peu la flemme de redévelopper quelque chose à partir de rien, vous pouvez jeter un oeil au TER, le système qui recense les extensions existantes de TYPO3. Si vous êtes un utilisateur averti, vous penserez peut-être à Dmitry Dulepov, un talentueux Développeur de la Core Team TYPO3. Il administre d'ailleurs son propre Blog  que je vous invite à visiter. Personnellement, j'y vais régulièrement car j'y trouve de bonnes infos, surtout dans la pratique de la programmation d'extensions ou bien pour des snippets typoscript. Dmitry, c'est une bonne source d'inspiration :) Alors, pourquoi ne pas utiliser directement son extension pagebrowse ?

L'extension pagebrowse

Selon son auteur, le but de cette extension est de proposer une pagination universelle pour d'autres extensions et afficher ainsi proprement des résultats sur plusieurs pages. Le plugin frontend permet de créer directement les liens entre les pages avec un cHash. Pagebrowse utilise un template html et une css associée pour son affichage. Voici un aperçu rapide de ce qu'elle propose :

- lien vers la première page (en option)
- lien vers la page précédente (en option)
- indique qu'il y a des pages précédentes
- nombre configurable de liens vers les précédentes pages
- lien vers la page suivante (en option)
- etc

Voici d'ailleurs les constantes et le setup de l'extension. Vous pouvez soit inclure le setup par défaut dans votre template principal ou bien rajouter
un gabarit étendu avec vos propres valeurs et l'appeler ensuite dans votre template.

Constantes :

plugin.tx_pagebrowse_pi1 {

    # cat=plugin.tx_pagebrowse_pi1; type=string; label=Template file

    templateFile = fileadmin/templates/extensions/pagebrowse/template.html

}

Setup :

# Feel free to change the plugin to be USER_INT if necessary!

plugin.tx_pagebrowse_pi1 = USER

plugin.tx_pagebrowse_pi1 {

    # USER_INT support

    includeLibs = EXT:pagebrowse/pi1/class.tx_pagebrowse_pi1.php

    userFunc = tx_pagebrowse_pi1->main


    # Template file

    templateFile = {$plugin.tx_pagebrowse_pi1.templateFile}


    # Extra parameters to the query string. Must start with & if not empty

    extraQueryString =

    # Number of page links to show before the current page

    pagesBefore = 3


    # Number of page links to show before the current page

    pagesAfter = 3

    # GET variable name for page pointer.
    #Examples: "page" or "tx_exykey_pi1|page".
    #Notice that array separator is pipe (one level only!)

    pageParamName = tx_pagebrowse_pi1|page

    # Enables section for "more" pages. This section is shown after links to next pages,
    # normally like three dots (1 2 3 ...). Notice that you can also hide
    #it by emptying corresponding template section.

    enableMorePages = 1

    # Enables section for "less" pages. This section is shown after links to next pages,
    # normally like three dots (1 2 3 ...) Notice that you can also hide it by emptying
    #corresponding template section.

    enableLessPages = 1
}

Implémenter la pagination

Dans votre gabarit HTML de votre extension (je suppose que vous ne mettez pas du HTML dans votre code PHP ;-) ) pour afficher les résultats, placez simplement un marqueur où apparaitra la pagination.
Exemple : ###PAGE_BROWSER###

Ensuite, dans votre extension, rajoutez la méthode suivante :

protected function getListGetPageBrowser($numberOfPages) {

        // Get default configuration
        $conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_pagebrowse_pi1.'];

        // Modify this configuration
        $conf += array(

        'pageParameterName' => $this->prefixId . '|page',

        'numberOfPages' => $numberOfPages,

        );

        // Get page browser
        $cObj = t3lib_div::makeInstance('tslib_cObj');

        /* @var $cObj tslib_cObj */
        $cObj->start(array(), '');

        return $cObj->cObjGetSingle('USER', $conf);

}

Ensuite, dans votre fonction chargée de compléter le marqueur (###PAGE_BROWSER### dans notre exemple), appelez la méthode getListGetPageBrowser :

$markers['###PAGE_BROWSER###'] = $this->getListGetPageBrowser($nb_pages);

// [...]

// Substitute markers in template
$content = $this->cObj->substituteMarkerArray($template, $markers);

// [...]

$nb_pages est une valeur que je passe à la fonction et qui représente le nombre de résultats trouvés.
Si vous avez traduit le fichier locallang.xml, voici ce que vous aurez :

Aperçu de la pagination

Notez que la css qui est ajoutée automatiquement dans l'extension est configurée depuis le template HTML depuis la méthode addHeaderParts de pagebrowse.

<!-- ###HEADER_ADDITIONS### begin -->
<link rel="stylesheet" type="text/css" href="###SITE_REL_PATH###res/styles.css" />
<!-- ###HEADER_ADDITIONS### end -->

Conclusion

Nous avons vu comment rajouter rapidement et proprement une pagination dans un plugin pour TYPO3. Je vous encourage à utiliser cette extension dans vos projets. Si vous avez des remarques, un point de vue, une expérience à partager, n'hésitez pas à m'écrire !

Les derniers articles à consulter :