SPIP - Contrib

SPIP - Contrib

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

57 visiteurs en ce moment

fontsizeup fontsizedown
[20 commentaires]

Tri alphabétique tout en SPIP

lundi 9 avril 2007, par echo

0 vote

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.

Retour en haut de la page

20 Messages de forum

Voir toute la discussion

Pages 1 | 2

  • Répondre à ce message

    20 octobre 2008 12:18 , par christophe

    bonjour, Je n’arrive pas à faire fonctionner cette contribution avec spip 2. Est-ce que vous confirmez ?

    J’ai fait quelques essais pour tenter de corriger, mais je tourne en rond. Avez-vous l’intention de mettre à jour cette contribution pour spip 2 ?

    De plus, sur le site donné en exemple (librairie Quilombo), les pages restent vides, seul l’abécédaire apparaît. C’est justement ce que j’obtiens avec spip 2.

  • Répondre à ce message

    30 avril 2008 18:12 , par PROWEBSERVER

    petite erreur dans le code de base

    version corrigée :

    [(#SETbeginby[(#TITRE|onelettre)],[(#ARRAY#GETbeginby[(#TITRE|onelettre)]|array_merge#ARRAY#COMPTEUR_BOUCLE,#ID_ARTICLE)])][(#TITRE|onelettre|unique)|]

  • Répondre à ce message

    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

    18 mars 2008 11:19 , par joz

    Bonjour,

    j’ai le même problème Warning: array_merge() [function.array-merge]: Argument #1 is not an array in ...

    la proposition de Marc pour php5 ne change rien chez moi :-(

    Comment vous faites pour que ça fonctionne chez vous ???

    joz

  • Répondre à ce message

    24 janvier 2008 12:01 , par erational

    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

    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. <ul>
    2. <BOUCLE_larticle(ARTICLES){id_article}>
    3. <BOUCLE_avant(ARTICLES){titre<#TITRE}{par titre}{0,3}>
    4. <li>#TITRE</li>
    5. </BOUCLE_avant>
    6. <li style="color:red">#TITRE</li>
    7. <BOUCLE_apres(ARTICLES){titre>#TITRE}{par titre}{0,3}>
    8. <li>#TITRE</li>
    9. </BOUCLE_apres>
    10. </BOUCLE_larticle>
    11. </ul>
  • Répondre à ce message

    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

    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

    25 août 2007 19:46 , par tchouk

    Personne ne rencontre le même problème ?

  • Répondre à ce message

    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

Pages 1 | 2

Répondre à cet article

Retour en haut de la page

Ça discute par ici