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 ?>
//squelettes/mes_fonctions.php
//extrait la première lettre et la passe en majuscules
function onelettre($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
//if($texte!='&')
return $texte;
}
Vous pouvez déjà voir ce que ça donne dans une boucle !
[(#TITRE|onelettre)]
devrait retourner A ou B ou Z
Ajout du 4 septembre 2011
Essayez la solution de marcimat avec le code php |substr{0,1}
<B_alpha>
<p class="pagination">
<BOUCLE_alpha(ARTICLES) {par titre} {fusion LEFT(titre,1)}>
<a href='[(#URL_PAGE{titi}|parametre_url{lettre, [(#TITRE|substr{0,1})]})]'>
[(#TITRE|substr{0,1})]
</a>
</BOUCLE_alpha>
</p>
</B_alpha>
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.
Index alphabetique des titres<br />
<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>
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 changer le critère de tri dans la première BOUCLE (merci hubombing)
function critere_parsansL($idb, &$boucles, $crit) { // retire el " le los l' la le les the et tri après FROM TRIM(LEADING \'l’ «\' FROM TRIM(LEADING \'Le « \' FROM TRIM(LEADING \' \' FROM TRIM(LEADING \'&\'
$not = $crit->not;
$boucle = &$boucles[$idb];
$id = $boucle->primary;
$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 \'La « \' FROM TRIM(LEADING \'l’\' FROM TRIM(LEADING \'«\' FROM TRIM(LEADING \' \' FROM TRIM(LEADING \'les \' FROM LOWER(titre))))))))))))'";
}
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. Ajout du 4 septembre 2011 [1]
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 !
//squelettes/mes_fonctions.php
/* on retire les le la etc */
function sansle($texte) {
$pattern[0] = "#^Les |La |Le |Lo |The[[:space:]]?#";
$pattern[1] = "#^L’?#"; //apostrophe utf8
$pattern[3] = "#^&\#171;?#"; //guillemet
$pattern[5] = "#^&?#"; //&
$pattern[2] = "#^ ?#"; //espace
$pattern[6] = "#^[[:space:]]?#"; //&
$pattern[4] = "#«#"; //guillemet La «
$texte = preg_replace($pattern, '', $texte);
return $texte;
}
/* on ne garde que le la l'*/
function quele($texte){
$txtsanse=sansle(trim($texte));
if ($txtsanse!=trim($texte))
$texte= str_replace("$txtsanse","","$texte");
else $texte='';
return trim($texte);
}
function onelettrebis($chaine) {
$chaine=sansle($chaine);
$chaine=filtrer_entites($chaine); // si il y a des fois des accents en dur qui trainent
$chaine = unicode2charset(utf_8_to_unicode($chaine), 'iso-8859-1'); // on code en html ISO
$a = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
$b = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
$chaine=strtr($chaine, $a, $b); // on retire les accents
$chaine=strtoupper($chaine); // on passe en majuscules
/// si débute par le fameux Œ ou œ
$pattern = "^(Œ|œ)";
if (eregi($pattern,$chaine,$regs))
$chaine='O';//$chaine= $regs[0]; //on va renvoyer la lettre O
else
$chaine = $chaine{0};
return $chaine ;
}
Au final
Voici donc le code final, avec le nouveau critère de tri et les filtres ajoutés
<div id="alphabetique">
<h3>Index alphabétique des titres</h3>
[(#REM) <!-- on met dans un tableau les articles qui commencent par la même lettre -->]
<div class="alpha">
[<!--(#REM)La première boucle affiche seulement chaque lettre de l'alphabet avec son lien-->]
<BOUCLE_listalphaone(ARTICLES){id_secteur}{par titre}>[<a href="[(#SELF|parametre_url{lettre,[(#TITRE|onelettre)]})]" [(#TITRE|onelettre|=={[(#ENV{lettre,A})]}|?{id='expose'})]>(#TITRE|onelettre|unique)</a>]</BOUCLE_listalphaone>
[<!--(#REM)La deuxième boucle stocke dans chaque Arraylettre les titres des articles +ou- alphabétiquement sans le l' la les..-->]
<BOUCLE_listalphadeux(ARTICLES){id_secteur}{parsansL}>[(#SET{beginby[(#TITRE|sansle|onelettre)],[(#GET{beginby[(#TITRE|sansle|onelettre)]}|array_merge{#ARRAY{#COMPTEUR_BOUCLE,#ID_ARTICLE}})]})]</BOUCLE_listalphadeux>
<br class="nettoyeur" />
</div>
[<h1>(#ENV{lettre,A})</h1>]
<ul class="laliste">
[(#REM) test du tableau faire [(#GET{beginbyB}|print_r)]]
[(#REM)<!--La troisième boucle affiche les articles stockés dans Arraylettre si seulement ils correspondent bien à la lettre-->]
<BOUCLE_artlettre(ARTICLES){id_article IN #GET{beginby#ENV{lettre,A}} }{id_secteur}{doublons alphabet}>
[<li>
(#TITRE|onelettrebis|=={#ENV{lettre,A}}|?{' ',''})
<a href="#URL_ARTICLE"><span>[(#TITRE|sansle)][ ((#TITRE|quele))]</span> #SOUSTITRE</a>
</li>]
</BOUCLE_artlettre>
[(#REM)<!--La quatrième boucle réinterroge les articles stockés de ArrayA dans lequel il y a les accents, ils correspondent bien à la lettre-->]
<BOUCLE_artlettreb(ARTICLES){id_article IN #GET{beginbyA} }{id_secteur}{doublons alphabet}>
[<li>
(#TITRE|onelettrebis|=={#ENV{lettre,A}}|?{' ',''})
<a href="#URL_ARTICLE"><span>[(#TITRE|sansle)][ ((#TITRE|quele))]</span> #SOUSTITRE</a>
</li>]
</BOUCLE_artlettreb>
</ul>
</div>
Avec du style s’il vous plait !
<style>
#alphabetique{ font-size:0.7em; color:#555}
#expose{text-decoration:none; background-color:#FFCC00}
.laliste a{color:#555;}
.laliste a span{color:#000;}
</style>
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.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |