Accueil du site > Carnet de prairies > Semences SPIP > Tri alphabétique simple

Tri alphabétique simple

jeudi 7 août 2008, par Matthieu Marcillaud

Comment faire rapidement un tri alphabétique sous SPIP ?

Prenons le fond titi.html

La pagination

Intégrons une première boucle qui va faire la pagination, seulement des premières lettres présentes dans les titres des articles, les affiche, et met un lien vers la page titi avec la lettre demandée :

Le critère fusion
Ce critère permet d’effectuer un group by, c’est à dire un groupement des résultats identiques selon un critère. Ici, on groupe par la première lettre du titre avec LEFT(titre,1). On aurait pu, si les titres ont des espaces, mettre un LTRIM pour les enlever : LEFT(LTRIM(titre),1)

L’affichage

On peut dans la même page afficher les articles :

L’opérateur == permet de sélectionner selon une expression régulière, ici suivant le debut du titre. ^Z cherchera tous les articles commençant par Z. Pour ne pas prendre en compte les premiers espaces des titres, une syntaxe doit pouvoir être appliquée, comme ^\s*Z qui indique qu’il peut y avoir 0 à n espace avant la lettre Z. On pourrait dont écrire le critère ainsi : {titre==^\s*(#ENV{lettre,A})}

Inclure cette page

En modifiant l’url, par exemple en remplaçant dans titi.html #URL_PAGE{titi} par #SELF, il devient possible d’appeler le squelette depuis un autre.

En modèle

Il n’est par contre pas possible de mettre cette structure dans un modèle. Pour explication, si nous avons un modèle modeles/titi.html et que nous l’appelons dans un article par <titi|lettre=P>, il va bien choisir les lettres commençant par P. Cependant, les liens de pagination ne seront pas valides car un modèle ne peut pas récupérer d’autres variables d’environnement que ce qu’on lui donne. En particulier, il ne pourra pas obtenir les &lettre=X présents dans l’url ainsi formée et affichera ainsi toujours la lettre P.

P.-S.

Avertissements

  • Ce tri va se faire en totale dépendance avec le système de gestion de base de donnée (mysql ou autre), en particulier, si le charset est UTF8 ou non, sensible à la casse ou non. D’autres méthodes gèrent a priori mieux ces petites différences : Voir : Tris alphabétiques de SPIP contrib
  • Ce tri n’enlève pas les numéros éventuels devant les titres des articles, ni ne prend pas en compte les balises <multi> de SPIP.

7 Messages de forum

  • Tri alphabétique simple Le 10 août 2008 à 22:11 , par Z

    Merci Marcimat pour cet article concis, clair !

    J’ai finalement réussi à me tirer de mon index alpha dans un modèle en procédant ainsi : je construis d’abord l’index A | B | C...(ta 1ère boucle) chaque lettre cliquable, puis, une 2e boucle va dresser la liste entière, avec affichage de la 1ère lettre sur un titre avec |unique. Et plutôt que de sélectionner la lettre dans l’index et la passer par l’URL puis récupérer avec ENV, je me suis servi des ancres. Ansi, plus besoin de ENV, je passe un #A, #B, etc... et chaque lettre unique sert de point d’ancrage.

    Et là, ça marche nickel dans un modèle.

    C’est pas clair ? Voilà le travail : http://www.minga.net/spip.php?rubrique48

    Je peux te montrer le squelette à l’occas., ce sera plus parlant. En tout cas, merci de ton aide et bravo encore !

    Répondre à ce message

  • Tri alphabétique simple Le 11 août 2008 à 21:47 , par Z

    Ouppsss, je vois que l’URL n’est pas apparue, je te la remets :

    http://www.minga.net/spip.php?rubrique48

    Répondre à ce message

  • Tri alphabétique simple Le 28 octobre 2008 à 21:39 , par .Gilles

    Attention c’est super gourmand en ressource ce type de boucle [donc il faut bien utiliser le cache ou alors on risque de faire ramer le site] :

    en effet l’expression régulière est obligée de parcourir plusieurs fois la totalité de la base. Pour s’en apercevoir, il suffit de rajouter un EXPLAIN devant les requêtes qui s’affichent en ?var_mode=profile

    Répondre à ce message

  • Tri alphabétique simple Le 8 mars 2009 à 14:54 , par marjorie

    j’ai adapté la boucle pour une liste d’auteurs (j’en ai plus de 3000....)
    ça marche très bien (test ici : http://www.radiohead.fr/spip.php?page=membres), à quelques soucis près :
    - j’ai quelques noms qui commencent par des lettres, voire des signes comme ( ... et là ça coince.
    - certaines lettres apparaissent en majuscules, d’autres en minuscules...

    Est-il possible de changer ça ?

    marjorie

    Répondre à ce message

  • Tri alphabétique simple Le 12 avril 2010 à 18:01

    Bonjour,

    J’ai enfin trouvé la pépite que je cherchais pour présenter mes articles autrement que dans un menu à rallonge ! merci, merci

    Par contre une question de style : comment mettre en évidence la lettre du contexte dans la css ? Je suis trèes en retard sur le #ENV et <#EXPOSE{span,a href="#URL_ARTICLE"}>#TITRE</#EXPOSE{span,a}> ne fonctionne pas.

    merci
    dd

    Répondre à ce message

    • Tri alphabétique simple Le 15 août 2010 à 20:42 , par Cédric

      il faut utiliser le filtre lien_ou_expose, disponible dans SPIP 2.1 et dans spip-bonux sinon, avec la syntaxe :

      Répondre à ce message

  • Tri alphabétique simple Le 13 août 2010 à 12:16 , par Paulbe

    Hello,

    J’ai un bug dans cette boucle si j’utilise AUTEURS

    Soit les 2 boucles suivantes :

    <h2>...  d'un thème </h2>
    <div class="alphabetique">
    <B_alpha2>
     <p class="pagination">
    <BOUCLE_alpha2(MOTS) {id_groupe=1}{par titre} {fusion LEFT(titre,1)}>
     <a href='[(#URL_PAGE{recherche_me}|parametre_url{lettre2, [(#TITRE|substr{0,1})]})]'>[(#TITRE|substr{0,1}) ]</a>|
    </BOUCLE_alpha2>                       
     </p>
    </B_alpha2>
    <br/>

    <B_lettre2><BOUCLE_lettre2(MOTS){id_groupe=1}{par titre}{titre==^(#ENV{lettre2,A})}><a href="#URL_MOT">#TITRE</a>&bull;</BOUCLE_lettre2></B_lettre2>
    </div>
    -----    
    <br /><br />
       
    <h2> ...  d'un nom </h2>
    <div class="alphabetique">
    <B_alpha3>
     <p class="pagination">
    <BOUCLE_alpha3(AUTEURS) {par nom} {fusion LEFT(nom,1)}>
     <a href='[(#URL_PAGE{recherche_me}|parametre_url{lettre3, [(#NOM|substr{0,1})]})]'>[(#NOM|substr{0,1}) ]</a>|
    </BOUCLE_alpha3>                       
     </p>
    </B_alpha3>
    <br/>

    <B_lettre3><BOUCLE_lettre3(AUTEURS) {par nom} {nom==^(#ENV{lettre3,A})}><a href="#URL_AUTEUR">#NOM</a>&bull;</BOUCLE_lettre3></B_lettre3>
    </div>

    Si pour les articles cela fonctionne super bien pour les auteurs il ne m’affiche pas |A|B|D|... mais bien A|A|A|B|B|D|... si j’ai 3 auteurs qui commencent par A puis 2 par B, pas en C et un en D ...

    J’ai été voir la solution de Marjorie mais elle n’est pas correcte car elle récupère les Initiales des articles pour filtrer les auteurs ... c’est sur que cela fonctionne mais c’est pas correct...

    J’ai mis le code ici => http://spip.pastebin.fr/8788

    Merci d’avance

    Paulbe

    Répondre à ce message

Répondre à cet article


Site réalisé avec SPIP • © 2001-2012 marcimat. Ma Graine .Net • ArchivesRSS 2.0