VarianteContribCreer-un-index-classement

All contributions published for previous SPIP versions

Variante n°1 | Variante n°2

Variante n°1 de “Créer un index : classement alphabétique de mots-clés (articles, etc.)” à partir de Spip 1.8

Avec le filtre |unique de Spip 1.8, on pourrait théoriquement créer un index avec une seule boucle:

<BOUCLE_mots(MOTS) {par titre}>
	[<br /><b>(#TITRE|substr{0,1}|unique)</b>]
	<br />#TITRE
</BOUCLE_mots>

Le filtre |substr{0,1} correspond à une fonction php qui retourne 1 caractère à partir du caractère 0 de la chaîne #TITRE, soit la première lettre du titre. Le filtre |unique fait que cette lettre ne s’affiche qu’une fois, elle n’est donc pas répétée pour les autres mots commençant par la même lettre.

[Erreur...7]Dans mes_fonctions.php3

<?php

function lettre1($texte) {
	$texte = $texte{0}; // première lettre
	// remplacement des caractères accentués
	// exemple trouvé là: 
	// http://be.php.net/manual/fr/function.strtr.php#52098
	$texte = strtr($texte, "\xA1\xAA\xBA\xBF\xC0\xC1\xC2\xC3\xC5\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD\xE0\xE1\xE2\xE3\xE5\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8\xF9\xFA\xFB\xFD\xFF", "!ao?AAAAACEEEEIIIIDNOOOOOUUUYaaaaaceeeeiiiidnooooouuuyy");
	$texte = strtr($texte, array("\xC4"=>"Ae", "\xC6"=>"AE", "\xD6"=>"Oe", "\xDC"=>"Ue", "\xDE"=>"TH", "\xDF"=>"ss", "\xE4"=>"ae", "\xE6"=>"ae", "\xF6"=>"oe", "\xFC"=>"ue", "\xFE"=>"th"));
	$texte = strtoupper($texte); // tout en majuscules
	return $texte;
}

?>

Dans mon squelette:

<BOUCLE_mots(MOTS) {par titre}>
	[<br /><b>(#TITRE|lettre1|unique)</b>]
	<br />#TITRE
</BOUCLE_mots>

Et pour faire plus joli, on ajoute le menu alphabétique et les ancres nommées...

<a name="index"> </a>
<BOUCLE_lettres(MOTS){par titre}{" "}>
[<a href="#[(#TITRE|lettre1)]">(#TITRE|lettre1|unique{lettres})</a>]
</BOUCLE_lettres>
<br />

[Erreur...15]Il faut sans doute investiguer un peu plus loin le remplacement des caractères accentués, mais je n’y connais rien... Ça marche en tout cas sur mon site qui utilise le jeu de caractères iso-8859-1 (voir Configuration > Gestion des langues), mais je ne sais pas ce que ça donnerait dans un site en uft-8 par exemple.

[Erreur...17]Ok, bon. Alors voici une autre solution, mais en php... Aurélie (21/02/2007)


Variante n°2 de “Créer un index : classement alphabétique de mots-clés (articles, etc.)” avec du php

Cette variante a été testée avec un Spip 1.9.1 qui utilise le codage de caractères UTF-8.

Le php permet de contourner un problème assez insoluble: j’ai beau m’escrimer à nettoyer les premières lettres de chaque mot du glossaire pour que les a, à, ä, á aillent ensemble, reste que le tri des mots se fait dans la boucle elle-même. Or Spip (ou MySQL?) ne le fais pas (encore?) tout à fait bien (cf. explication de Claude ci-dessus).

D’abord le nettoyage:

[Erreur...23]?>

[Erreur...25][Erreur...26]Puis la question du tri:

Dans le squelette où doit apparaître le glossaire:

<a name="index"> </a>
<?php
	$glossaire = array(); // on cree un tableau
?>
<BOUCLE_glossaire(MOTS)> <!-- Ici on peut ajouter les criteres qu'on veut -->
<?php
	$lettre1 = "[(#TITRE|lettre1)]";
	$mot = "[(#TITRE|supprimer_numero|texte_script)]";
	$glossaire[$lettre1][$mot] = "<dt><a href=\"#index\">".$mot.":</a></dt><dd>[(#DESCRIPTIF|sinon{#TEXTE}|texte_script)]&nbsp;</dd>"; // on ajoute des valeurs au tableau
?>
</BOUCLE_glossaire>
<?php
	ksort($glossaire); // tri
	foreach ($glossaire as $lettre => $items) {
		echo "<a href=\"#".$lettre."\">".$lettre."</a>&nbsp;"; // affiche l'index des lettres
	}
?>
<dl>
<?php
	foreach ($glossaire as $lettre => $items) {
		echo "<a name=\"".$lettre."\">&nbsp;</a>";
		ksort($items); //tri
		foreach ($items as $num => $titre) {
			echo $titre; // affiche ici le code defini à la ligne: $glossaire[$lettre1][$compteur]
		}
	}
?>
</dl>
[Erreur...29]<dl>
	<a name="A">&nbsp;</a>
	<dt><a href="#index">Mot:</a></dt>
	<dd>Définition&nbsp;</dd>
	(...)
	<a name="Z">&nbsp;</a>
	<dt><a href="#index">Mot:</a></dt>
	<dd>Définition&nbsp;</dd>
	<dt><a href="#index">Mot:</a></dt>
	<dd>Définition&nbsp;</dd>
</dl>

Explications (je n’explique pas l’html):

[Erreur...32]Pour chaque mot retourné par la boucle, on va créer une ligne du tableau:

$glossaire[$lettre1][$mot] = "<dt><a href=\"#index\">[(#TITRE|supprimer_numero|texte_script)]:</a></dt><dd>[(#DESCRIPTIF|sinon{#TEXTE}|texte_script)]&nbsp;</dd>";

[Erreur...35]Chaque enregistrement donne donc quelque chose comme ça: $glossaire[T][Titre] = "<dt><a href=\"#index\">Titre:</a></dt><dd>Descriptif&nbsp;</dd>";

[Erreur...37]Au sortir de la boucle, on trie notre tableau $glossaire: ksort() trie le tableau suivant les clés [chez nous: A, B, C...], en maintenant la correspondance entre les clés et les valeurs”.

[Erreur...39][Erreur...40]N’hésitez pas à raconter vos tests et améliorations ci-dessous.


J’ai mis une contrib qui fait un index alphabétique avec #ARRAY
Tri alphabétique tout en SPIP
2 boucles simples et des fonctions reprises d"’ici même

Index alphabetique des titres
<div class="alphabetique">

<BOUCLE_listalpha(ARTICLES){id_secteur}{par titre}>[(#SET{beginby[(#TITRE|onelettre)],[(#GET{beginby[(#TITRE|onelettre)]}|array_merge{#ARRAY{#COMPTEUR_BOUCLE,#ID_ARTICLE}})]})][<a href="[(#SELF|parametre_url{lettre,[(#TITRE|onelettre)]})]" [(#TITRE|onelettre|=={[(#ENV{lettre,A})]}|?{class='expose'})]>(#TITRE|onelettre|unique)</a>|]</BOUCLE_listalpha> 

<ul class="laliste"> 
<BOUCLE_artlettre(ARTICLES){id_article IN #GET{beginby#ENV{lettre,A}} }{id_secteur}>
<li><a href="#URL_ARTICLE"><span>[(#TITRE)][ ((#TITRE))]</span> </a></li> 
</BOUCLE_artlettre>
</ul>

</div>

ça marche bien en spip 1.9.2+
echo

updated on 28 July 2007

Discussion

Aucune discussion

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom