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.
Discussions par date d’activité
18 discussions
Salut,
J’utilise parfaitement cette contribution et je suis ravi du résultat. Merci pour ce travail !
Cependant j’aimerais pouvoir classer chaque mots du titre par ordre alphabétique
CAD :
pour un article ayant pour titre : Adaptation Tiller pour montage et entretien des planches
J’aimerais pouvoir le retrouver dans ’A’ pour Adaptation, mais aussi dans ’T’ pour Tiller et aussi dans ’M’ pour montage etc ...
Une idée là dessus ?
Bonjour,
merci de tes remerciements, à mon avis la boucle DATA est plus simple à mettre en œuvre.
Pour ton problème, tu pourrais construire un array pour chaque titre avec un explode sur l’espace vide, où chaque valeur sera un mot.
http://www.spip.net/fr_article5671.html
Sauf que tu devras constituer un array pour retirer les mots comme pour,de,avec,quoi,qui,donc,etc …
Pour faire simple, à moins que tu aies envie de te décarcasser en php, je suppose (car je ne sais pas ce que tu souhaites faire exactement) qu’un système de mots clefs serait plus adapté.
++
Merci pour ta réponse rapide
Je débute totalement avec spip et son environnement et encore plus avec Php ... Je ne suis pas très à l’aise avec tout ça.
J’ai pensé à utiliser les mots clés au départ mais les articles sont générés depuis un site syndiqué et j’ai plus d’un millier d’articles à traiter, jouer avec les mots clés me prendrait un temps fou
La solution Tri alphabétique tout en spip me va bien du coup mais il me manque la partie énoncée plus haut.
Un petit coup de main là dessus ne serait pas de refus.
Merci d’avance
Hello,
Voici une solution. Ça reprend le même principe que l’article de Touti, à savoir stocker les lettres utiisées et les identifiants des articles correspondants, afficher un menu alphabet, et enfin afficher les articles de la lettre sélectionnée, mais avec quelques différences formelles.
L’affichage est minimaliste, c’est à adapter bien sûr.
Dans le squelette :
Dans mes_fonctions.php :
C’est carrément ce qu’il fallait, quelques retouches pour faire ça beau prop’ et c’est nickel !
Merci beaucoup
Salut,
Merci pour le coup de patte, j’ai effectué quelques corrections sur la fonction :
Il ne me manque plus que de pouvoir surligner ou souligner le mot retenu pour la lettre selectionnée.
Tiens, les envois de notification de ce forum sont très aléatoires je n’ai pas reçu les 2 derniers messages.
Tu peux aussi constituer et ajouter un tableau des mots interdits
Génial tout ça !!
Par contre une idée pour surligner les mots de la liste associés à ceux de la lettre en cours ?
En tous cas Merci beaucoup !!
Salut,
Finalement le tri ne fonctionnait pas tout à fait comme il faut dans le sens ou je me suis retrouvé avec des tris un peu bizarre.
J’ai bien fait le ménage dans ce que je voulais et ajouté quelques bricoles pour que ça tourne. Cette fois j’arrive à un beau résultat.
à la seule exception c’est qu’il me colle les doubles point dans le classement de la lettre N ?!
J’ai tourné le truc dans tous les sens mais rien y fait. Je n’arrive pas à me débarrasser de ce fichu double point.
Je ne sais vraiment pas quoi faire
Voici la fonction que j’ai adapté :
aussi je reviens à la charge avec mon surlignage, j’aimerais bien que les mots ou la première lettre des mots listés pour la lettre selectionnée soient surlignés. Une idée ?
Merci d’avance :)
Bonsoir,
je ne vois pas bien pour les deux points de la lettre N …
Concernant le surlignage, un javascript serait surement mieux, voici une fonction créée pour l’occasion en php / SPIP qui est le moins gourmande possible.
Pour récupérer la lettre appelée dans l’url, il te faut vérifier que
#ENV{lettre}
fonctionne bien, à partir de là, il te faut tester la première lettre de chaque mot avec[(#TITRE|detect_lettrine{#ENV{lettre}})]
Merci pour cette réponse, mais je n’arrive pas à implémenter cette solution ...
y’aurait il possibilité de m’envoyer un exemple dans une boucle ?
Merci d’avance
Ah erratum, j’ai reussi à le faire fonctionner mais il ne me fait la selection que sur le premier mot de la chaine alors qu’il serait plus pertinent de faire le surlignement sur tous les mots de la chaine qui commencent par la lettre, je continue à creuser ...
En tous cas merci ça se présente plutot bien :) :) :)
Qu’est-ce que tu n’arrives pas à faire ?
Quelle est la balise qui affiche ta liste des items dans ton squelette ? si je suppose que c’est un #TITRE tu mets
[(#TITRE|detect_lettrine{#ENV{lettre}})]
si c’est le #CHAPO tu mets
[(#CHAPO|detect_lettrine{#ENV{lettre}})]
Dans l’url tu ajoutes le parametre lettre=a (ou lettre=b …)
et sur la liste des titres, chaque titre commençant par a comme « Ah que la vie est belle » ou « Anticipation planétaire » verra sa première lettre mise en gras.
Tu peux aussi jouer sur la class CSS
.lettrine{color:red}
pour colorer cette première lettre trouvée.++
comme dit plus haut j’ai réussi à le faire fonctionner, j’ai remplacé strtolower par strtoupper et ça marche. par contre, toujours comme dit plus haut c’est à chaque mots qui commencent par la lettre selectionnée qu’il serait souhaitable de surligner.
Je me demande si intégrer la partie surlignement
ne serait pas plus pratique.
Avec la fonction « premiere_lettres » utilisée plus haut j’obtiens un array :
Pour un titre : Semis • Canne à semer ou Semis et semer devraient êtres surlignés.
[mode boulet]
Oui, tu dois adapter le code, mais il n’aurait pas été aussi lisible, il faut récupérer les mots du titre dans un array $mots et faire un
Je m’enmele les crayons là dessus ... je surligne ARRAY et mon tableau ne s’affiche plus ...
Help
Bon bon bon,
c’est à la fin, je suppose que c’est bien au moment de l’affichage des titres qu’il faut la fonction detect_lettrine ?
Je disais que tu peux modifier cette fonction avec à son début la construction d’un array des mots de la chaine de manière à ce que chaque mot soit testé (donc avec un foreach) avant d’être retourné modifié ou pas, enfin, si j’ai bien compris ce que tu veux faire.
Peux-tu mettre une URL de test pour que l’on puisse voir ce que tu veux faire ?
Pas de soucis pour la mise en place, dans le squelette, ça ça roule.
C’est justement l’array que je n’arrive pas à construire et à tester.
Je bosse en local, du coup pas possible de mettre une URL de test :/
J’aimerais pouvoir surligner chaque lettre dans chaque titre comme sur le l’image jointe.
Merci pour le coup de main !
Je crois que je suis bon pour une cure d’aspirine et surtout de PHP ...
Je n’arrive résolument pas à reconstituer la chaine de caractères après l’avoir passée dans un tableau ...
J’ai tenté un array sur la fonction detect_lettrine mais je n’arrive résolument pas à reconstituer la chaine à partir de cet array.
Exemple :
J’ai aussi tenté une adaptation de la fonction premiere_lettre indiquée pour l’affichage du menu alphabet mais là encore je n’arrive pas à reconstituer la chaine.
Exemple :
Bref, dans les deux cas j’arrive à selectionner les bonnes lettres et les surligner c’est une bonne chose, mais impossible de reconstituer la chaine proprement.
C’est vraiment la dernière partie fonctionnelle qu’il me manque avant de pouvoir lacher le kraken !
Si quelqu’un à une idée j’en serais très reconnaissant :)
Merci d’avance
Répondre à ce message
Bonjour,
Est-ce que le tri alphabétique tout en Spip fonctionne avec SPIP 3 ?
Si oui, y a-t-il des particularités dans la mise en place ?
Bien cordialement,
Guillaume.
Répondre à ce message
Le nouveau critère de boucle
{collecte}
à partir de SPIP 2 permet de se faciliter la vie pour trier proprement avec des caractères un peu exotiques comme l’E dans l’O.http://www.spip.net/fr_article4028.html
Je l’ai utilisé avec utf8_swedish_ci et ça marche impec, les articles commençant par un Œ se retrouvent après ceux commençant par un O, au lieu de finir tristement après le Z...
Pour un affichage avec l’initiale, pour un sommaire par lettre par exemple, il faut jouer avec la translittération pour récupérer un O et pas un Œ :
Sinon on se retrouve avec :
O
Occidental
Œ
Œuvre
Oriental
P
...
Répondre à ce message
Pas certain d’avoir une réponse vu que le tuto date un peu, je tente quand même. Super guide en tout cas que ce tri tout en SPIP.
Je l’ai adapté à une revue en ligne utilisant le squelette RevueLigne. Ca marche nickel. Mais...
J’aimerais aller plus loin. Imaginons que j’aie deux auteurs, chacun apparaissant dans ma table articles sous les champs auteur1 et auteur2, quelqu’un a-t-il une piste pour adapter ce tri à cette exigence ? Me faut-il règler le problème des deux champs dans une fonction PHP ?
Merci par avance :-)
Répondre à ce message
Bonjour,
j’utilise le code suivant :
Tout marche super bien seulement je souhaiterais afficher les lettres (inactives) pour lesquelles il n’y a pas d’article. Comment faire ?
Merci d’avance,
Mathieu.
Déjà il y a plus simple pour extraire la première lettre avec le filtre php
|substr{0,1}
mieux vaut d’ailleurs se référer à l’article de marcimat sur son site voir http://marcimat.magraine.net/Tri-al...Mais dans ton cas, si tu veux toutes les lettres de l’alphabet, il faudrait écrire en dur les lettres que tu souhaites, quelque chose du style
Enfin, c’est ce qui me semble le plus simple.
Répondre à ce message
merci c’est excellent !! bon ca maffiche 0-9 dans le menu même sil ny a rien.
Autrement question concernant la reécriture d’url. Actuellement ca sort ainsi /glossaire.html&lettre=a , comment faire pour que les urls sortent propres du style : /glossaire-a.html ??
Répondre à ce message
Bonjour,
je ne me sers pas de tout (simplement des deux premières étapes) et ça marche du feu de dieu pour l’instant.
Un grand merci !
Répondre à ce message
Bonjour,
quelqu’un utilise cette contrib sous spip 2.1 ?
si oui quelles modifications sont nécessaires pour que ça marche ?
Les squelettes sont dispo sur le site de Quilombo voir le pied de page.
Si tu suis l’inclure ça te donne le squelette : http://www.librairie-quilombo.org/squelettes/inc-catalogue.html
La boucle CONDITIONS est faite grace au plugin spip_bonux.
Pour les filtres, je pense qu’il faudra adapter.
ça marche super bien !
merci !
Répondre à ce message
Attention, ce plugin ne fonctionne pas en 2.0.10. En 2.0.07, no problem.
En 2.0.10, j’ai des erreurs sur array_merge() [function.array-merge] : Argument #1 is not an array in composer.php(51) : eval()’d code on line 190. A suivre...
si ca fonctionne en 2.0.10 (avec PHP5), il suffit de rajouter ce qu’a dit marc dans un commentaire précédent dans mes_fonctions.php
pour mémoire sa solution
un exemple qui marche http://reflexes.samizdat.net/spip.php?rubrique16
Répondre à ce message
finalement cela fonctionne t’il avec spip 2 ?
ou existe t’il un plugin quelque part ?
merci
Répondre à ce message
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
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
Personne ne rencontre le même problème ?
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
petite erreur dans le code de base
version corrigée :
[(#SETbeginby(#TITRE,[(#ARRAY#GETbeginby(#TITRE|array_merge#ARRAY#COMPTEUR_BOUCLE,#ID_ARTICLE)])][(#TITRE})]" [(#TITRE|onelettre|=={[(#ENV{lettre,A})]}|?{class='expose'})]>(#TITRE|onelettre|unique)|]
Répondre à ce message
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,[(#GETbeginby(#NOM|array_merge5#ARRAY#COMPTEUR_BOUCLE,#ID_SIGNATURE)])]
[(#NOM})]" [(#NOM|lastfirstletter|=={[(#ENV{lettre,A})]}|?{class='on'})]>(#NOM|lastfirstletter|unique) | ]
[(#REM) Stockage des noms des signataires dans Arraylettre]
[(#SETbeginby(#NOM,[(#GETbeginby(#NOM|array_merge5#ARRAY#COMPTEUR_BOUCLE,#ID_SIGNATURE)])]
[(#REM) Affichage des signataires stockés dans Arraylettre]
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
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
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
Dans ce cas, il me semble que de simples boucles feraient l’affaire, non testé le code :
Répondre à ce message
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 deFROM 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 \" \" 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.Oups !
Parlé trop vite. Le second ne marche pas du tout.
Quelqu’un pourrait-il éclairer ma lanterne ?
Merci.
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 ?
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 !
Erratum humanum est
Dans le post précédent, remplacez « majuscule » et « maj » par « lettre accentuée ».
Trop fatigué, je vais me coucher.
J’ai trouvé une solution moyennement convaincante mais qui marche :
remplacer les ’ du php par
´
et faire de même dans les titres des articles.Dans le fichier PHP :
Ca pourra peut-être aider certains...
Répondre à ce message
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
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 ) :
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
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....
Pour ma part, j’ai du supprimer le beginby pour que ça marche ????
Voici le code pour la boucle d’affichage des auteurs :
J’avais aussi l’erreur array_merge en utilisant la première boucle....
Je continue mes tests, ça prend forme, merci.....
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’urlessaye
{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 ;)
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 :
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 : |