SPIP - Contrib

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



Accueil du site > Navigation > Tris Alphabétiques > Index alphabétique

Tri alphabétique tout en SPIP

lundi 9 avril 2007, par echo. Dernier ajout lundi 9 avril 2007


Vous êtes en SPIP 1.9.2 ou supérieur et en UTF8, vous avez une liste d’articles ou d’auteurs importante ? près de 1000 ? et vous souhaitez la voir s’afficher par ordre alphabétique ainsi A|B|C|D|E|F...

Pire, vous voulez la trier en ne prenant en compte que ce qui suit l’article du titre et donc exclure le la les ou l’

Quoi ! vous voudriez en plus qu’à la demande du visiteur les articles s’affichent suivant la lettre demandée comme ici pour A :
- animal(l’)
- animaleries(les)
- animaux(les)

Alors... suivez le guide !


On commence par la fonction qui permet d’extraire la première lettre. On met cette fonction dans le fichier squelettes/mes_fonctions.php qui est du pur php, et commençera donc par <?php pour finir par ?>

Vous pouvez déjà voir ce que ça donne dans une boucle ! [(#TITRE|onelettre)] devrait retourner A ou B ou Z

Utiliser #ARRAY

Avec SPIP 1.9.2 on va s’amuser sur la possibilité de stocker un array pour l’envoyer dans une boucle, on a donc deux boucles distinctes :

- BOUCLE_listalpha n’affiche qu’une seule fois la première lettre et grace à SET{beginby[(#TITRE|onelettre)]... stocke dans un tableau (array) la liste des articles de cette lettre, pour tester le tableau de la lettre B on fera [(#GET{beginbyB}|print_r)]
- BOUCLE_artlettre, la deuxième boucle, récupère ensuite le tableau ainsi crée, grace à #ENV et si il n’y a pas de lettre demandé on commence par A #GET{beginby#ENV{lettre,A}simple non ?

On colle donc le code suivant dans le squelette de son choix, par exemple dans rubrique-5.html qui pourrait correspondre à un catalogue ou chaque livre est un article.

Toujours plus loin !

Ah ! mais... il y a l’animal et les animaux qui se sont mis sous le L ! ça ne va pas du tout ! et peut être aussi les lettres ne sont pas l’ordre alphabétique...

On reprend mes_fonctions.php et après on va changer le critère de tri dans la première BOUCLE (merci hubombing)

On remplace donc le critère par titre de la première BOUCLE par parsansL

Les Hics

Quelques hics subsistent, les mots avec accents ou avec par exemple Œ, ne sont pas classés dans la base, ainsi L’Œuvre ou L’écureuil se retrouve en bas de page des A.

On commence donc par une boucle simple qui va seulement chercher chaque lettre de l’alphabet, évidemment il vous faut suffisamment d’articles !

Pour résoudre l’affichage des accents dans leur bonne lettre, sachant que les accents du genre éèô et le cher e dans l’o sont stockés dans le tableau array du A, il faut empêcher l’affichage des articles commençant par L’Œuvre et réinterroger le tableau A en mettant une 4em boucle doublons alphabet

Eh mais, en plus mes articles ne sont pas du tout rangés là !!? Psst, Il manque 3 fonctions encore !

Au final

Voici donc le code final, avec le nouveau critère de tri et les filtres ajoutés

Avec du style s’il vous plait !

Et voila le résultat

À l’épreuve du site Quilombo rubrique catalogue.

Vous pouvez adapter le même principe aux auteurs ou aux mots clefs.


Répondre à cet article

  • Tri alphabétique tout en SPIP

    13 août 2007 10:38, par tchouk

    Bonjour à tous !

    Excellente contribution !

    Jusque là tout fonctionnait bien sauf depuis que mon hebergeur est passé en PHP 5 (1and1) je me retrouve avec des erreurs pour lire ma liste alphabétique. J’ai systématiquement ce message :

    Warning : array_merge() [function.array-merge] : Argument #1 is not an array in /homepages/41/d140278309/htdocs/www/ecrire/public/composer.php(46) : eval()’d code on line 93

    J’ai essayé la solution donné par Marc mais rien n’y fait. Quelqu’un pourrait-il m’aider ? Merci

    Répondre à ce message

    Retour au début des forums

  • Adaptation aux signataires de pétition

    30 avril 2008 14:31, par jocelyne

    De mon côté, j’ai cherché à l’adapter aux signataires de pétition.

    Dans le fichier mes_fonctions.php, j’ai du remplacer (solution que je dois ici à une aide extérieure, merci Arnaud) :

    $pos = strrpos(trim($texte), " ") ; if ($pos === false) // pas trouvé -> 1er lettre $texte = $texte0 ; else $texte = $texte$pos+1 ;

    par simplement :

    $texte = $texte0 ;

    Pour les boucles :

    [(#SETbeginby[(#NOM|lastfirstletter)],[(#GETbeginby[(#NOM|lastfirstletter)]|array_merge5#ARRAY#COMPTEUR_BOUCLE,#ID_SIGNATURE)])] [(#NOM|lastfirstletter|unique) | ]

    [(#REM) Stockage des noms des signataires dans Arraylettre] [(#SETbeginby[(#NOM|lastfirstletter)],[(#GETbeginby[(#NOM|lastfirstletter)]|array_merge5#ARRAY#COMPTEUR_BOUCLE,#ID_SIGNATURE)])]

    [(#REM) Affichage des signataires stockés dans Arraylettre]

    #NOM - #NOM_SITE #URL_SITE

    Cependant, je ne trouve pas la solution pour intégrer également une pagination dans l’affichage des signataires stockés dans Arraylettre. Si quelqu’un a une idée...

    Répondre à ce message

    Retour au début des forums

  • si vous voulez vous débarasser des titres commencant par des chiffres
    ajouter cette ligne dans la fonction onelettre (avant le return)
    if (is_numeric($texte)) $texte = "";

    Répondre à ce message

    Retour au début des forums

  • Tri alphabétique tout en SPIP

    2 janvier 2008 02:45, par piercol

    Bonjour, Je développe sous SPIP un site d’histoire régionale dans lequel beaucoup de titres d’articles commencent par une année. par exemple : 1789 - Etats généraux

    Je recherche une méthode pour inclure dans le squelette des articles
    - une boucle qui permette d’afficher les titres des 3 (ou n) articles dont les titres ont un libellé < ou = à cette date,
    - et une boucle qui permette d’afficher les titres des 3 (ou n) articles dont les titres ont un libellé > ou égal à cette date

    Le but étant d’afficher la liste des titres de 6 (ou n) articles, comme dans l’exemple ci-dessous, pour faire apparaître les titres des articles les plus proches de l’article en cours.
    - 1785 - Titre Bla bla
    - 1787 - Titre Bla bla
    - 1788 - Titre Bla bla
    - 1789 - Etats généraux (l’article en cours d’affichage)
    - 1790 - Titre Bla bla
    - 1791 - Titre Bla bla
    - 1792 - Titre Bla bla

    Je pense que ça ne doit pas être très éloigné de ce que vous proposez dans cette page, mais je n’ai pas su trouver le truc.

    Auriez-vous une suggestion à me faire ?

    Cordialement

    Répondre à ce message

    • Tri alphabétique tout en SPIP 2 janvier 2008 04:40, par echo

      Dans ce cas, il me semble que de simples boucles feraient l’affaire, non testé le code :

      1.  
      2. <ul>
      3. <BOUCLE_larticle(ARTICLES){id_article}>
      4.  
      5. <BOUCLE_avant(ARTICLES){titre<#TITRE}{par titre}{0,3}>
      6. <li>#TITRE</li>
      7. </BOUCLE_avant>
      8.  
      9. <li style="color:red">#TITRE</li>
      10.  
      11. <BOUCLE_apres(ARTICLES){titre>#TITRE}{par titre}{0,3}>
      12. <li>#TITRE</li>
      13. </BOUCLE_apres>
      14.  
      15. </BOUCLE_larticle>
      16. </ul>
      17.  

      Répondre à ce message

    Retour au début des forums

  • Tri alphabétique tout en SPIP

    27 avril 2007 16:16, par P’tit Ben

    Bonjour,

    Juste au cas où quelqu’un aurait le même problème que celui dont j’ai souffert :

    Dans les titres, les apostrophes étaient des infos « ' » et non des typos « ’ », et spip 1.9.2 me les transformait en &8217;. Ça posait 2 problèmes. Le premier est que les apostrophes n’étaient pas traitées comme cela, et donc « l’ » se retrouvait dans la lettre L. Le second (après correction du premier problème) est que les apostrophes se retrouvaient classées entre elles après les autre titre (Ab, Am, As, Ac (l’), Ag (l’)).

    Donc, obligé de modifier le code php susindiqué pour que ça fonctionne :

    Dans la fonction sansle, ajout de :

    $pattern[7]  = "#^L&\#8217;?#"; //apostrophe typo

    Dans la fonction critere_parsansL transformation des " en ' et inversement et ajout de FROM TRIM(LEADING \"L\'\" :

    $boucle->order[] = '"TRIM(LEADING \"Le «\" FROM TRIM(LEADING \"le \"FROM TRIM(LEADING \"los \"  FROM TRIM(LEADING \"la \" FROM TRIM(LEADING \"l’ «\"  FROM TRIM(LEADING \"Le « \" FROM TRIM(LEADING \"L’\" FROM TRIM(LEADING \"L\'\" FROM TRIM(LEADING \"La « \" FROM TRIM(LEADING \"l’\" FROM TRIM(LEADING \"«\" FROM TRIM(LEADING \"&nbsp;\" FROM TRIM(LEADING \"les \" FROM LOWER(titre))))))))))))))"';

    Et après ça marche nickel.

    Sinon, a priori ça merde un peu avec la pagination : si l’on est sur la troisième page d’une lettre, les liens vers les autres lettres mènent toujours vers la troisième page de celle-ci... A priori ça viendrait de la balise #ENV. Quelqu’un à une idée pour résoudre ce problème. Merci.

    Répondre à ce message

    • Tri alphabétique tout en SPIP 27 avril 2007 16:23, par P’tit Ben

      Oups ! Parlé trop vite. Le second ne marche pas du tout. Quelqu’un pourrait-il éclairer ma lanterne ? Merci.

      Répondre à ce message

    • Tri alphabétique tout en SPIP 9 juillet 2007 21:12, par P’tit Ben

      Après avoir cherché (un peu), je n’ai pas trouvé grand chose sinon que si l’apostrophe n’est pas en typo ’ mais en info ' dans la base de donnée, alors elle ne s’affiche pas au bon endroit (à L plutôt qu’à A ou ailleurs).

      Ma tentative de correction ne donne rien de très bon : elle fait bien passer les apostrophe après le reste mais, en plus, me ramène d’autres livres ("L’École" dans les lettres A) mais sans en afficher le titre (mais l’auteur et le reste oui).

      Donc, seule solution à court terme : modifier tous les titres avec apostrophes pour qu’ils s’affichent correctement. Et là ça marche, tout est classé, exceptés les voyelles à majuscule qui se retrouvent à la fin. Mais là, tant pis...

      Autre chose : a priori, la quatrième boucle ne me sert à rien, les articles avec accents apparaissant bien avec seulement la troisième boucle. En bas de page, mais ils apparaissent. C’est grave docteur ?

      Répondre à ce message

      • Tri alphabétique tout en SPIP 9 juillet 2007 21:48, par P’tit Ben

        Bon, ben en fait ça merde toujours total si l’apostrophe est suivie d’une majuscule : direct en page des A et sans le titre. Seule solution trouvée : virer la maj. Snif !

        Si quelqu’un a un remède, je lui en serait infiniment redevable (d’au moins un demi dans un rade de l’est de Paris).

        resnif !

        Répondre à ce message

        • Tri alphabétique tout en SPIP 9 juillet 2007 21:55, par P’tit Ben

          Erratum humanum est Dans le post précédent, remplacez "majuscule" et "maj" par "lettre accentuée". Trop fatigué, je vais me coucher.

          Répondre à ce message

          • Tri alphabétique tout en SPIP 20 novembre 2007 13:33, par arriflex

            J’ai trouvé une solution moyennement convaincante mais qui marche : remplacer les du php par &acute; et faire de même dans les titres des articles.

            Dans le fichier PHP :

            remplacer
            FROM TRIM(LEADING \'l’\'
            par
            FROM TRIM(LEADING \'l&acute;\'

            et
            $pattern[1]  = "#^L’?#"; //apostrophe utf8

            par
            $pattern[1]  = "#^L&acute;?#"; //apostrophe utf8

            Ca pourra peut-être aider certains...

            Répondre à ce message

    Retour au début des forums

  • Chez moi le résultat est pas top...

    10 avril 2007 10:04, par Sam

    J’obtiens le message d’erreur :

    Warning : array_merge() [function.array-merge] : Argument #1 is not an array in /mnt/139/sdb/3/8/centrale.au.coeur/ecrire/public/composer.php(72) : eval()’d code on line 398

    J’ai fait le test sur une rubrique qui contient deux articles "La Newsletter" et "Statistiques du site", j’obtiens tout en haut le message d’erreur ci-dessus sur 9 lignes, puis ma rubrique affichée normalement et 4 lettres en dessous de "Index alphabétique des titres", qui sont A C L S. Le fait de cliquer sur l’une ou l’autre ne change rien. La rubrique est en accès restreint, mais les URLs pour accéder aux fichiers html et php sont : http://centrale.au.coeur.free.fr/squelettes/ http://centrale.au.coeur.free.fr/rubrique-16_test.html (j’ai renommé pour que le site fonctionne pour le moment)

    Si quelqu’un peut m’aider... j’avoue que ne maitrisant absolument pas le php, les boucles ça me passe un peu au dessus et j’ai fait que du copier coller. Je suis en spip 1.9.2 avec le squelette sarka spip.

    Merci pour cette contrib qui, si je parviens à la faire fonctionner, me sauvera la vie :-D

    — 
    S@m

    Voir en ligne : http://centrale.au.coeur.free.fr

    Répondre à ce message

    • Chez moi le résultat est pas top... 24 mai 2007 14:51, par Marc

      Salut,

      je pense que ton problème (comme le mien) tien au fait que tu est sous PHP5 et qu’en php 5 array_merge attend exclusivement des paramètres de type array, voir ici !

      Il y a plusieurs manières de s’en sortir, personnellement j’ai ajouté une fonction array_merge5 dans mes_fonctions.php qui corrige le pb (cette fonction ne doit fonctionner qu’en PHP 5 ) :

      function array_merge5 ($array1, $array2) {
      return array_merge ((array)$array1, (array)$array2);
      }

      ensuite l’il n’y a qu’à remplacer array_merge par array_merge5 dans ton squelette !

      A+

      PS : merci, pour cette super contrib.

      Répondre à ce message

    Retour au début des forums

  • Adapter à d’autres objets que les articles

    12 avril 2007 15:47, par Perline

    Avant de me lancer (et de me casser la figure...) j’imagine qu’il "suffit" de changer les deux boucles ARTICLES en boucles AUTEURS pour classer les auteurs de cette manière.

    Et, plus généralement, d’y mettre tous les critères possibles, dans ladite boucle, pour sélectionner ce qu’on veut voir classer ?

    Sinon, ça a l’air super pratique, pour ceux qui manient des listes de milliers de kilomètres....

    Répondre à ce message

    • Adapter à d’autres objets que les articles 14 avril 2007 23:53, par pchoteau

      Pour ma part, j’ai du supprimer le beginby pour que ça marche ????

      Voici le code pour la boucle d’affichage des auteurs :

      <BOUCLE_artlettre(AUTEURS){nom == #ENV{lettre,A}} {tout}>
      [<li>
      <a href="#URL_AUTEUR"><span>(#NOM)</span> #BIO</a>
      </li>]
      </BOUCLE_artlettre>

      J’avais aussi l’erreur array_merge en utilisant la première boucle....

      Je continue mes tests, ça prend forme, merci.....

      Répondre à ce message

      • Adapter à d’autres objets que les articles 16 avril 2007 14:06, par echo

        Avec les auteurs je pense que tu n’as plus à te préoccuper de créer un array nommé ici beginby qui est un tableau php regroupant des éléments (articles, auteurs..) en excluant le l’ ou les devant permettant par exemple que "les animaux" soit classé dans les A

        Pour simplifier ton developpement démarre avec seulement 2 boucles
        - une qui va fabriquer l’alphabet A|B|C...
        - l’autre qui affichera les auteurs en prenant en critère la lettre envoyée dans l’url comme avec par exemple &lettre=B

        Le array beginby (en français "commence par") est à mon avis inutile dans le cas des auteurs qui ont rarement de l’ ou le devant, (restent les éric ou éléonore... ainsi que tous accents ou e dans l’o que tu vas retrouver dans les A...)

        si tu as Anna Arendht et que tu demandes {nom==#ENV{lettre,A}} je pense que ça ne doit pas marcher car cela signifie afficher les noms égaux à la lettre demandée dans l’url

        essaye {nom==^[#ENV{lettre,A}]} qui signifie afficher les noms qui commencent par la lettre demandée dans l’url (non testé)

        Ensuite, tu peux modifier les filtres et les critères pour ajuster, et ensuite en faire profiter tout le monde ;)

        Voir en ligne : voir aussi article et forum Creer-un-index-classement

        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