Créer un index alphabétique (bis)

Une nouvelle version d’une boucle qui permet de publier un index de résultats, trié par ordre alphabétique, dans un site en charset=iso-8859-1.

Cette contribution propose une boucle qui permet de faire une page de listant vos articles par ordre alphabétique, avec un bloc par lettre.

Afin d’alléger le code que j’utilise pour mes tris alphabétiques, j’ai repris à la base ma contribution sur le tri alphabétique que j’ai panaché avec celle sur affectation automatique d’articles à une brève.

L’astuce, est de créer une série de brèves nommées A, B, C, etc. Dans le corps du texte je mets mes variantes diacritiqes et majuscules/minuscules.

Pour que cette contribution marche, il faut créer les brèves suivantes :

TITRE TEXTE
A aAæÆâÂäÄ
B bB
C cCçÇ
D dD
E eEéÉèÈêÊëË
F fF
G gG
H hH
I iIïÏîÎ
J jJ
K kK
L lL
M mM
N nNñÑ
O oOôÔöÖ
P pP
Q qQ
R rR
S sS
T tT
U uUûÛüÜ
V vV
W wW
X xX
Y yYÿ
Z zZ

Le titre des brèves sera utilisé comme titre de chaque section dans le tri des articles. Le texte contient la liste des lettres qui doivent être la première lettre du titre des articles a afficher dans cette section. Vous pouvons donc changer les sections et les tris en fonction de vos besoin en modifiant ces brèves.

Je peux mettre ma série de brèves dans une rubrique « Tris » ad hoc — ici la rubrique n° 14, si vous utilisez une autre rubrique, pensez bien à changer l’id_rubrique dans le code proposé — et leur garder un statut « brève proposée » pour que la rubrique ne s’affiche pas dans l’espace public. Cette base de brèves me permet d’appeler mon tri depuis n’importe où (rubrique, mot, article, site, etc.) et de l’utiliser plusieurs fois dans un même site.

<!-- Bloc de tri  -->
<div align="justify">

<div align="center">
		    <BOUCLE_lettre_alpha(BREVES) {id_rubrique=14} {statut=prop} {", "}>
		    <a href="#anchor-[(#TITRE)]">#TITRE</a></BOUCLE_lettre_alpha>.</div>
			<hr>
   
		<div>    <BOUCLE_titre_alpha(BREVES) {id_rubrique=14} {statut=prop} {par titre} {"<br>"}>

 <B_article_alpha><strong>[<a name="anchor-(#_titre_alpha:TITRE)"></a>]#_titre_alpha:TITRE</strong><br>
                        <div><BOUCLE_article_alpha(ARTICLES){id_rubrique=1}{titre==^[#_titre_alpha:TEXTE]} {par titre} {" -"}>
                        <a href="#URL_ARTICLE">#TITRE</a>
                        </BOUCLE_article_alpha></div>
                </B_article_alpha>
                
                			</BOUCLE_titre_alpha>
</div>

Il n’y a pas photo, pour le même résultat : un exemple visible était ici [1].

Notes

[1/ !\ attention !, ce site est depuis passé en utf-8 ce qui rend la contrib caduque. Elle ne fonctionne, en effet, qu’avec un charset iso-8859-1.

Je rappelle la remarque de la première contrib sur les tris alphabétiques :

Attention, si votre site est en utf-8, les lettres accentuées vont se placer entre le aA et le bB (sauf œ, Œ et « Y tréma » qui se placent à la suite de l’alphabet). Les majuscules puis les minuscules. Il n’est donc pas recommandé d’utiliser cette boucle sur ce paramètre sauf à supprimer les signes diacritiques en initiale. Celà ne présage pas d’autres surprises pontuelles pour les 2e-3e... lettres suivantes aussi utilisées pour le tri.

Discussion

7 discussions

  • 1

    Bonjour

    Voici ma boucle, j’ai un phénomène assez étrange avec ce script,
    a savoir tout les articles de la rubrique 22 commençant par P ou p
    se retrouve dans tout les résultats.

    A
    -  Anatole
    -  Patrick
    -  Patricia

    B
    -  Patrick
    -  Patricia

    C
    -  Patrick
    -  Patricia

    D
    -  Dominique
    -  Daniel
    -  Patrick
    -  Patricia

    Voici mon script :

    <div>
    <BOUCLE_titre_alpha(BREVES) {id_rubrique=1} {statut=prop} {par titre} >
    <B_article_alpha>
    <strong>#_titre_alpha:TITRE</strong>
    <ul>
    <BOUCLE_article_alpha(ARTICLES){id_rubrique=22}
    {titre==^[#_titre_alpha:TEXTE]} {par titre} >
    <li><a href="#URL_ARTICLE">#TITRE</a></li>
    </BOUCLE_article_alpha>
    </ul>
    </B_article_alpha>    
    </BOUCLE_titre_alpha>
    </div>		  	
    • bonjour,

      je viens d’essayer ton code. Je n’ai pas ce problème chez moi. Peux-tu vérifier le contenu des champs de tes brèves, s’il n’y a pas un copié-collé qui est resté à parasiter un champ.

    Répondre à ce message

  • Merci d’engager la discussion.

    Je vais me faire plus précis sur la conception du site : dans les rubriques « notions » et « citations », les articles sont (seront) classés par sous rubriques, chacune reprenant un thème du programme (cf colonne de gauche). Mais je souhaiterais un article dans chacune de ces rubriques dans lequel soient classés par ordre alphabétique tous les articles qui y sont publiés (cf colonne de droite).

    Je souhaiterais aussi classer par ordre alphabétiques les auteurs (article colonne de droite), par ailleurs classés par disciplines dans la rubrique « auteurs » (colonne de gauche)

    Mais un site vaut mieux qu’un de long disours :

    http://dico.fbses.webou.net/

    (sur la page d’accueil apparaissent les 15 derniers articles, toutes rubriques confondues)

    Il y aurait donc trois classements alphabétiques : pour les notions, les citations et les auteurs.

    Je n’ai pas compris ds quel fichier (spip ? ou celui de mon squelette EGT ?) insérer votre boucle pour faire apparaître ces classements alphabétiques. D’ailleurs, puis-je bien les faire apparaître dans un article ?

    Merci de votre réponse

    FBSES

    Répondre à ce message

  • 1

    Bonjour,

    je suis nul de chez nul... malgré un site fourni :

    http://fbses.webou.net/

    J’aimerais maintenant créer un index de notions à l’adresse suivante : http://dico.fbses.webou.net/

    Mais ... dans quel fichier copier votre boucle ?

    Merci

    • bonjour,

      je ne comprend pas exactement la question. S’agit-il de trier les titres sur la page de sommaire ?

    Répondre à ce message

  • Bonjour, je voudrais faire la même chose mais avec les surtitres. Est-ce possible ?
    Merci d’avance.

    Répondre à ce message

  • 1
    spipopup

    j’ai un probleme avec l’expression reguliere :

    titre==^[#_titre_alpha:TEXTE]

    le debug me donne :

    SELECT articles.id_article, articles.descriptif, articles.soustitre, articles.titre, articles.lang

    FROM spip_articles AS articles

    WHERE (articles.id_rubrique = ’19’)

    AND (articles.titre REGEXP ’Z’) ...AU LIEU DE REGEXP ’^Z’

    AND articles.statut=’publie’

    ORDER BY articles.titre

    ni ^ (qui prend le 1er caractere d’un mot) ni d’ailleurs [ ] (qui séparent les caracteres) ne sont pris en consideration

    je suis sur spip 1.8.1 (les expressions regulieres sont utilisable avec 1.8)

    je ne comprends pas. une idée ? merci

    • Je n’ai plus de version en 1.8 pour vérifier

      peux-tu envoyer une adresse de la page, voir s’il n’y a pas autre chose qui parasite ?

      Claude

    Répondre à ce message

  • 5

    Bonjour,

    D’abord bravo pour cette ingéniosité.
    J’aime beaucoup cette contribution. Cependant, je me demande s’il est possible de faire en sotre que la rubrique ne soit pas définie dans la ligne (ici rubrique 1) et que ce système puisse s’adapter à un fichier rubrique.html.
    merci d’avance.

    Jolinard

    • bonjour,

      il est possible de na pas définir la rubrique. Dans l’exemple, la rubrique 1 est celle dont je veux trier les articles. Je peux vouloir trier dans une ou d’autres ou toutes les rubriques ou la rubrique courante ou suivant d’autres critères (mots-clés etc.)

      La contrib de départ est pour un site où il y a une rubrique plante une oiseaux, une mollusques, une papillons ... et d’autres à venir. Donc un tri rubrique plantes, un tri rubrique autres etc. avec la même série de brèves. Dans les faits d’autres rubriques ont d’autres systèmes de tri pour des raisons diverses. De plus, dans ce site, les tris ne sont pas forcément dans la rubrique de saisie des notices puisque les mêmes articles de la rubrique 1 sont affichées selon plusieurs critères dans au moins 4 rubriques différentes (elles-mêmes vides de tout article :)).

      Dans ta demande, tu souhaiterais que la boucle de tri soit présente dans toutes les rubriques. C’est possible, bien sur, si c’est pertinent pour ton site. En principe, tu devrais remplacer {id_rubrique=1} par {id_rubrique}, en principe !

      claude

    • Bonjour,
      merci de cette réponse. cependant c’est bien ce qui m’est venu à l’esprit dès le début mais du coup j’ai une page blanche. Mais je vais refaire des tests... Qui sait si j’ai fais une autre erreur...
      Merci beaucoup
      Jolinard

    • bonjour,

      il faudrait au moins la boucle pour voir

      claude

    • Fair enough...

      la voilà :

      <h1><BOUCLE_titre_rubrique(RUBRIQUES) {id_rubrique} > [(#TITRE|supprimer_numero)] </BOUCLE_titre_rubrique>
      			</h1>
      		    <BOUCLE_lettre_alpha(BREVES) {id_rubrique=22} {statut=prop} {", "}>
      		    <a href="#anchor-[(#TITRE)]">#TITRE</a></BOUCLE_lettre_alpha>.</div>
      			<hr>
         
      		<div>    <BOUCLE_titre_alpha(BREVES) {id_rubrique=22} {statut=prop} {par titre} {"
      		   <br>
      	      "}>
                  <B_article_alpha>
                    <h3>[<a name="anchor-(#_titre_alpha:TITRE)"></a>]#_titre_alpha:TITRE</h3><br>
                    
                </B_article_alpha>
      	      <B_article_alpha>
      	      </B_article_alpha><B_article_alpha><div><BOUCLE_article_alpha(ARTICLES) {id_rubrique=2} {titre==^[#_titre_alpha:TEXTE]} {par titre}>
                             <li> <a href="#URL_ARTICLE">#TITRE</a><br /> </li>
                              </BOUCLE_article_alpha></div>
                </B_article_alpha>
                      
                      			</BOUCLE_titre_alpha>

      La boucle est exactement la même si ce n’est que les breves sont en rubrique 22. Sinon, la partie qui pose problème est

      <BOUCLE_article_alpha(ARTICLES) {id_rubrique=2} {titre==^[#_titre_alpha:TEXTE]} {par titre}>

      qui ne fonctonctionne pas si je la remplace par id_rubrique.

      J’espère que cela peut vous aider.

      Merci encore et désolé pour mon manque d’attention.

      Bien à vous.

      Jolinard

    • héhé,

      il y a un pataquès dans le nommage des boucles :

       <B_article_alpha>
                   <h3>[<a name="anchor-(#_titre_alpha:TITRE)"></a>]#_titre_alpha:TITRE</h3><br>
                   
               </B_article_alpha>
                    <B_article_alpha>
                    </B_article_alpha><B_article_alpha>

      il y a un peu trop de B_article_alpha ; ça ressemble à des copiés-collés où le renommage n’est pas été terminé :)

      ça ne va pas dire qu’il n’y aura plus de pb hein !

      claude

    Répondre à ce message

  • 2

    Bonjour

    J’ai bien regardé votre exemple, il m’intéresse beaucoup mais il m’inquiète :

    1) un mot de l’index doit-il renvoyer à un article et un seul ?
    2) le contenu de l’index est-il modifiable ? ou automatique ? Peut-on ajouter des mots ou en retrancher ?
    3) comment faire pour qu’un mot de l’index renvoie à plusieurs articles, comme dans un livre où, à la fin, un mot de l’index renvoie à plusieurs pages. Par exemple, dans mon site, j’ai l’expression « plateforme de services » et j’aimerais que cela renvoie à tous les articles où j’en ai parlé. Même chose pour le mot « bowling », etc.

    Est-ce trop compliqué ? Merci d’avance

    B.Poiraud - http://www.journal-la-mee.info

    • Bonjour,

      c’est la question qui est compliquée.

      il y a deux choses.

      cette contrib qui permet, avec un jeu de 26 brèves de se crer plusieurs index de classement dans un site. J’ai écrit une autre contrib de ce genre où l’on classe donc soit par ordre alpha sur une page soit avec une page par lettre. Il y a aussi une très bonne variante (ici), beaucoup plus simple à écrire et à modifier mais avec les mêmes restrictions en utf8.

      la seconde chose c’est créer un index d’expressions prises dans un texte. Il y a la possibilité de rajouter des mots-clés chaque fois qu’un article cite les mots ou expressions voulues. Ceci à chaque création d’article mais bonjour les modifications. Il existe aussi une contribution pour créer un glossaire :

      un autre solution si tu veux un système automatique : créer un groupe de mots-clés par exemple (ou de brèves, d’aricles). Tu y ajoute chaque mot ou expression en titre. Dans un squelette tu mets une boucle (à modifier, détourner et déformer) du genre :

      <B_oiseau_rubrique>
      	<div class="menu">
      	<div class="rubriques"><div class="menu-titre">Oiseaux visiteurs</div>
      		<ul>
      	<BOUCLE_oiseau_rubrique(ARTICLES) {id_rubrique=16} {texte==#_article_principal:TITRE} {par titre}>
      <li>[<a href="#URL_ARTICLE">(#TITRE)</a>]
      		</li>
      	</BOUCLE_oiseau_rubrique>
      			</ul>
      	</div>
      	</div></B_oiseau_rubrique>

      cette boucle me liste l’ensemble des articles d’une autre rubrique où le titre de mon article (ici c’est un article.html, mais ce pourrait être un mot.html ou brève.html) apparait — tel quel — dans la zone texte. Ainsi, si mon article se nomme « plateforme de services », alors il va lister tous les articles de la rubrique 16 où est saisi cette expression. Qu’il y ait des majuscules, des minuscules ou des mélanges, il reconnait l’expression. Celà est d’ailleurs un problème pour moi. AInsi si je cherche « Aurinia », il me ressort aussi « Pseudaurinia » alors que si je pouvais différencier majuscules et minuscules ce problème n’apparaitrait plus. J’aurais toutefois « aurinia » qui trouverait les articles avec « Pseudaurinia ».

      On a là, la limitation habituelle de l’indexation automatique (ou robotisés) par rapport à l’indexation humaine avec des mots-clés, plus longue mais plus efficace dans beaucoup de recherches (pas toutes, hein !). Tu devrais pouvoir tricher en entourant tes expressions par des astériques (ou plutôt un autre caractère qui ne pas perturber les critères entre accolades). Mais, c’est pareil, c’est surtout utile à la saisie pas rétrospectivement sur un fonds important d’articles.

      Il doit y avoir d’autres astuces.

      bon courage d’abord pour éclaircir ma prose

      Claude

    • Merci, je vais essayer de comprendre ... mais il me faut beaucoup de temps.
      Quand j’aurai trouvé, je le dirai.

      Merci d’avoir répondu de façon détaillée.

      B.Poiraud

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom