SPIP - Contrib

[ar] [en] [es] [fr] [it]



Accueil du site > Navigation > Tris sur choix

Donner la possibilité aux visiteurs de choisir le critère de tri d’une liste

dimanche 9 octobre 2005, par cent20, François Schreuer. Dernier ajout mardi 5 décembre 2006


Nous présentons ici quelques boucles et astuces utiles pour permettre aux visiteurs d’un site web de modifier selon différents critères l’ordre de données présentées en liste. Plutôt qu’un produit fini à installer tel quel, nous proposons ici une boîte à outils dans laquelle il vous appartiendra de choisir ceux qui sont utiles et pertinents dans le cadre de votre projet.


Liminaire

Prérequis. Connaître le fonctionnement des boucles de SPIP et des critères de classement.

Compatibilité. La dernière version stable de SPIP (1.8.2.d) doit être installée : nous aurons en effet besoin du filtre parametre_url [1] introduit très récemment dans la distribution officielle (la version 1.8.2. ne suffit pas).

Objectif

Dans certains cas — assez rares [2] —, il est utile de permettre aux internautes de choisir eux-mêmes l’ordre d’affichage des données que vous leur proposez. L’exemple-type est celui des résultats d’une recherche interne au site où il est souvent intéressant de pouvoir trier les articles par pertinence, par date ou par date inverse. C’est cet exemple d’une page présentant les résultats d’une recherche que nous développons ici.

Pour le dire autrement — un petit dessin valant mieux qu’un long discours —, nous souhaitons arriver à quelque chose comme ceci : http://mag.spip.net/recherche.php?r... [3].

Le code

Venons-en tout de suite au fait. Voici le code que nous vous proposons d’ajouter dans votre squelette d’affichage des résultats d’une recherche. tel qu’écrit ci-dessous, ce code ne sera utilisable que dans ce cas bien précis (où un paramètre recherche est présent dans le contexte), mais il est facile de le modifier pour l’utiliser dans d’autres circonstances, ce qui pourra éventuellement faire l’objet d’un prolongement de cet article.

Quelques explications

- Un usage intensif est fait de la balise #ENV [4], qui nous permet de récupérer la valeur d’un paramètre passé en url et de générer le tri adéquat en fonction de ce paramètre. Pratiquement, nous utilisons deux paramètres : tri et ordre. Combinés, ces deux paramètres devraient théoriquement nous permettre de générer dix cas de figure différents (chacun des cinq critères de tri utilisés ici pouvant être classés par ordre normal ou par ordre inverse). Nous avons cependant volontairement réduit ces possibilités à six, en estimant que le seul cas où un classement par ordre croissant des valeurs est pertinents est l’ordre chronologique (il n’est pas intéressant de trier une liste en commençant par le moins populaire, le moins visité ou le moins pertinent). Ceci n’étant qu’un exemple, il vous sera facile d’adapter le concept à vos propres besoins.

- Nous utilisons abondamment les potentialités du filtres "?" , seule structure conditionnelle explicite du langage SPIP.

- Le passage d’un mode de tri à un autre s’effectue grâce à une ligne de javascript dans le menu de type select qui est mis en place. Il est possible de remplacer ce menu par des simples liens html en supprimant les balises <select> ... </select> et en remplaçant simpement par <option value="..."> par <a href="..."> (et </option> par </a>).

- Etant donné que nous utilisons la méthode « GET » pour transmettre les données de notre formulaire, une url différente est appelée pour chaque tri différent. Cela nous permet de ne pas avoir à nous soucier du cache de SPIP et au contraire d’en profiter pleinement. Un nouvel enregistrement dans le cache est en effet généré pour chaque url différent appelé.

- Le filtre parametre_url permet de modifier l’url courant (#SELF) pour en modifier un des paramètres. Ceci nous évite de perturber d’autres fonctionnalités du site qui peuvent dépendre d’autres paramètres de l’url. Nous devons donc éviter de perturber ces autres paramètres comme nous le ferions en nous contentants de regénérer une url à partir des seuls paramètres utilisés dans le présent cadre.

- Nous n’échappons pas à l’utilisation d’un peu de php, car il n’est actuellement pas possible de faire dépendre une boucle d’une structure conditionnelle et parce qu’il n’est pas encore possible de définir l’ordre du tri par une variable d’environnement. Des formules alambiquées utilisant des inclusions permettent dans certains cas de contourner le problème mais nous avons préféré privilégier la lisibilité du code.

- Notez, dans les boucles d’affichage de la liste, la structure {par #ENV{tri},points}, qui utilise deux critères de tri sucessifs, ce qui n’est pas spécialement la méthode la plus intuitive. Elle est cependant inévitable car si nous avions écrit {par #ENV{tri,points}}, qui trie par points si tri n’est pas défini dans l’environnement — ce qui est a priori plus logique —, nous aurions butté sur une limitation du compilateur (points n’étant pas une donnée directement issue de la base de données, mais une pseudo-colonne, calculée par SPIP).

- Pour l’affichage des informations relatives aux articles recherches (titre, introduction, métadonnées,...), nous faisons ici appel à un fichier inclus item.inc.php/html, ce qui évite de dupliquer ce morceau de code [5]. A toutes fins utiles, en voici le code :

Bien sûr, vous pouvez aisément remplacer cette inclusion par l’affichage des données normales attendues (#TITRE, #INTRODUCTION, #DATE,...)

Gestion des inclusions

Si vous jouez avec des inclusions [6] et surtout si le code proposé ici se trouve lui-même dans un fichier inclus, n’oubliez pas de faire passer les paramètres nécessaires aux squelettes inclus, de la façon suivante :

Concrètement, dans le cas présent, une inclusion prendra probablement la forme suivante :

Les paramètres transmis dans l’URL de la page seront alors passés dans le fichier inclus où ils pourront être utilisés.

Fichiers de langue

Avant de terminer, nous n’oublierons pas de compléter nos fichiers de langue [7] avec les chaînes utilisées, dont voici la version française :

Si votre site est monolingue et que vous ne souhaitez pas profiter de la centralisation des chaînes verbales qu’offre le module de gestion des langues, vous pouvez sans dommage vous passer de cette étape et remplacer les balises linguistique dans le code source que nous proposons par leur traduction.

Aller plus loin

- Concernant la gestion de tris avancés, vous consulterez utilement l’article Définir le type de tri d’une rubrique avec des mots-clés.

- L’article Trier les résultats d’une boucle par ordre alphabétique des auteurs examine le cas particulier (non pris en compte ici) du tri d’une liste d’articles par les noms des auteurs.

Notes

[1] Voir à ce sujet la page Le filtre parametre_url.

[2] On peut lourdement insister sur ce point : certains webmestres ont la fâcheuse tendance de vouloir transformer leur site en quelque chose qui ressemble plus à un cockpit d’avion qu’à l’interface légère, pertinente et ergonomique (votre sobre et dépouillée) qu’attend l’internaute normalement constitué.

[3] Le squelette de cette page se trouve à l’adresse http://mag.spip.net/layout/recherche.html.

[4] Voir à ce sujet la page http://www.spip.net/fr_article1902.html.

[5] Par ailleurs, dans l’exemple donné, celui de SPIP Mag’, ce squelette item.inc.html est utilisé dans d’autres squelettes (sommaire, rubriques,...), ce qui permet de centraliser en un seul point la gestion de l’affichage des descriptifs d’article.

[6] Commencez par relire la page de la documentation dédiée à la question.

[7] Lire à ce sujet la page de la documentation officielle consacrée à l’internationalisation des squelettes et plus particulièrement son paragraphe 1. Méthode des fichiers de langue.


Répondre à cet article

  • Salut, Lorsque je choisis "ordre chronologique" comme critère de tri et que j’ouvre à nouveau le menu déroulant, une ligne blanche figure dans celui-ci juste au-dessus de "ordre chronologique" et décale tout vers le bas. Est-ce que quelqu’un eu ce problème et l’a résolu ? Merci

    Répondre à ce message

    Retour au début des forums

  • Afficher les étoiles ac SPIP 1.9.2

    2 mai 2007 14:48, par Arno

    Bonjour à tous,

    Je souhaiterais savoir comment faire afficher ces fameuses petites étoiles lors du résultat d’une recherche avec SPIP 1.9.2. Faut-il créer un script additionnel ?

    Merci tout le monde !

    Répondre à ce message

    • Afficher les étoiles avec SPIP 1.9.2 20 mai 2007 00:22, par pchoteau

      J’avais trouvé ce filtre quelque part (et il fonctionne) :

      function etoiles($texte) {
              $point = $texte;
              $texte = "";
              $star="<img src=\"squelettes/images/etoile.png\">";
              if ($point > 2) {
                      $texte= $star;
              }
              if ($point > 6) {
                      $texte= $star."&nbsp;".$star ;
              }
              if ($point > 8) {
                      $texte= $star."&nbsp;".$star."&nbsp;".$star ;
              }
              if ($point > 12) {
                      $texte= $star."&nbsp;".$star."&nbsp;".$star."&nbsp;".$star ;
              }
              if ($point > 20) {
                      $texte= $star."&nbsp;".$star."&nbsp;".$star."&nbsp;".$star."&nbsp;".$star ;
              }

      return $texte;
      }

      avec [(#POINTS|etoiles)] dans le squelette....

      Répondre à ce message

    Retour au début des forums

  • Bonjour, et féllicitations pour cette contrib.

    Malheureusement je suis sonfronté à un probleme. Il me semble avoir fait tout ce qu’il fallait cependant j’ai cette erreur :

    Fatal error : Call to undefined function : auteur_et_auteur() in c :\program files\easyphp\www\beespip\inc-public.php3(20) : eval()’d code on line 6

    Que dois-je faire ? Merci

    Répondre à ce message

    • Bon je crois qu’en fait ca vient du code de item.inc j’ai donc viré cette ligne : $tous_auteurs = trim(auteur_et_auteur(’[(#NOM|prenom|texte_script) ][(#NOM|nom|texte_script)]’,’<:et :>’)) ;

      et cela semble marché ! meme si la disposition des étoiles et le texte en francais est assez étrange.

      Mais merci, je vais m’en sortir à présent !

      Répondre à ce message

      • Voici ce que j’ai trouvé incorrect chez moi : Il manque des mots a public-fr.php :
        - mise_a_jour
        - visiteurs_par_jour
        - total_visiteurs

        D’autre part la fonction pour afficher les étoiles n’avait pas les bonnes valeurs chez moi (je parle de celle donnée en commentaires) : voici ce que ca donne chez moi maintenant :

        // Affiche des jolies zetoiles dans le moteur de recherche
        // A appeler avec la balise #POINTS : [(#POINTS|etoiles)]
        function etoiles($points) {
               $retour = '5';
               if ($points < 2600) $retour = '4';
               if ($points < 1600) $retour = '3';

               if ($points < 800) $retour = '2';
               if ($points < 500) $retour = '1';

               if ($points < 200) $retour = '1';
               
        return '<img src="images-interface/stars/etoiles_'.$retour.'.png" border="0" alt="'.$points.'">';
        }

        images-interface/stars/ étant le répertoire dans lequel j’ai mis les zolies nimages :)

        En revanche, moi qui ne met jamais de Surtitre, les étoiles apparaissent au dessus du titre ! ca fait un peu bizarre. J’ai beau essayer je n’arrive pas a appeller le fonction "etoiles" avec les Points de la page item.inc.php ; donc impossible de mettre les étoiles a coté de Visiteurs par jour | Visiteurs total... Dommage. Si vous avez une astuce faite le moi savoir.

        Répondre à ce message

    Retour au début des forums

  • cette contrib est exactement ce que je cherche mais je n’ai pas le filtre "etoile"... peux tu y remédier...

    Merci d’avance...

    Répondre à ce message

    • Salut,

      Voici le filtre « étoiles » que j’utilise :

      Tu dois affecter la variable $GLOBALS['dossier_squelettes'] (par défaut, mets juste squelettes) et récupérer les 6 images nommées etoiles(0|1|2|3|4|5|6).png (par exemple ici), ou les créer toi-même puis les placer dans le répertoire qui va bien.

      Le résultat est assez joli.

      FS

      PS : Cette idée ne vient pas de moi ; je l’ai reprise (et adaptée) depuis une contrib ou un post sur une liste, mais je ne retrouve pas la source et je ne me rappelle plus du nom de l’auteur.

      Répondre à ce message

    Retour au début des forums

  • Trier des articles selon différents critères

    2 décembre 2005 20:48, par Vincent ROBERT

    Bon c’est une super contrib, visiblement elle ne plaît à personne, car pas un seul retour !

    Je l’utilise (enfin une version plus simplifié) sur mon blog, et pour le squelette BliP.

    Et elle marche très bien !!!

    FONCEZ !

    Voir en ligne : Un exemple en ligne, sans menu déroulant.

    Répondre à ce message

    Retour au début des forums



Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | Charte et vie SPIP-Contrib | SPIP | L'autre.net