Bonjour,
les remarques à la fin
Le 9 juil. 08 à 11:44, Rue des boulets a écrit :
Bonjour,
J'ai proposé à la publication sur spip contrib cette contribution.
N'hésitez à la commenter en vous connectant sur
http://www.spip-contrib.net/ecrire/?exec=articles&id_article=2771
Cordialement,
BS
Objectif
Vous désirez classer vos auteurs par ordre alphabétique, vous avez une bibliothèque et vous utilisez les mots clés pour indexer les auteurs, ce filtre est pour vous.
En effet, jusqu’à présent, pour classer des auteurs par ordre alphabétique, nous n’avions qu’un moyen. Dans les champs #NOM de la table auteur et #TITRE de la table mot clé, il fallait saisir les noms ainsi : NOM, PRENOM si on voulait ensuite les classer par ordre alphabétique. Ex la boucle
|<BOUCLE_nom(AUTEURS){par nom}>
#NOM
</BOUCLE_nom>|
affichait les auteurs ainsi : Abasolo, José Javier
Abbey, Edward
Abbott, Jeff
C’était un beau classement sauf que le sens de lecture normal est prénom nom et que les internautes saisissent ainsi leur requête sur google.
*Confronté à ce problème, j’ai demandé à mon prof de php, le génial CM, de m’aider à écrire une petite fonction qui permette de transformer lors de l’affichage Abbot, Jeff en Jeff Abbot.*
Cette contrib comprend la fonction à copier dans votre fichier mes_fonctions.php et deux exemples de boucle.
Code à copier dans le fichier mes_fonctions.php
|function swap($texte){
$pieces=explode(",",$texte);
if(count($pieces)==2){
$return=$pieces[1]." ".$pieces[0];
}
else $return=$texte;
return $return;
}|
exemples de boucle
Dans le champ #NOM vous saisissez NOM, PRENOM. La virgule permettra au filtre d’inverser l’affichage du champ en PRENOM NOM
Pour trier les auteurs de votre site
|<BOUCLE_nom(AUTEURS){par nom}>
[(#NOM|swap)]
</BOUCLE_nom>|
Pour trier des mots clés qui seraient des auteurs de roman
|<BOUCLE_mot(MOTS){id_groupe=2}{par titre}>
[(#TITRE|swap)]
</BOUCLE_mot>|
Amusez-vous bien !
Spip-contrib faisant des siennes, je répond ici.
J'y connais rien non plus en PHP mais j'ai regardé d'autres filtres et bidouillé ta contribution : http://www.spip-contrib.net/Filtre-swap (l'article 2771)
J'ai rajouté une ligne pour permettre de passer de "Assonville d', Robert" à "Robert d'Assonville" sans espace après l'apostrophe [je n'ai pas encore d'exemple sur le site où je teste mais il y le le cas dans les 6'000 noms restants à saisir].
Par contre, vu le traitement des apostrophes dans propre (' devient ’ [à peu près] soit ’
je suis contraint d'écrire avec l'astérisque (étoile) pour désactiver "propre" avant traitement puis de remettre à le fin le filtre |propre :
[(#TITRE*|swap1|propre)]
J'ai pas trouvé mieux, il doit y avoir moyen de traiter ce ’ quelque part sans passer l'étoile
// prise en compte supplementaire de l'apostrophe dans le nom
function swap1($texte){
$pieces=explode(",",$texte);
if(count($pieces)==2){
$return=$pieces[1]." ".$pieces[0];
}
else $return=$texte;
// ligne rajoutee (array est surement inutile pour un seul remplacement comme syntaxe)
// mettre plutot $return=eregi_replace('\' ','\'',$return); ?
$return=strtr($return, array("' "=>"'"));
return $return;
}
Du coup, j'ai bidouillé à la truelle encore un peu plus pour passer de "Titre (Article)" à "Article Titre". Les difficultés à surmonter :
1/ écrire "L'Action" et non "L' Action", donc la modification se fait comme en swap1 mais finalement j'ai écrit différemment
==> $return=eregi_replace('\' ','\'',$return);
2/ des chaines de caractères -- comme des (SIGLE) -- entre parenthèses et souvent en finale du titre
==> une liste fermée des La, Le, Les... et pour limiter l'explode à cette liste, "(" est remplacé par la chaine "yzy" qui ne se retrouve nulle part ailleurs (manque d'imagination, là)
3/ des articles entre parenthèses qui se promènent ailleurs qu'en fin de titre (ex http://bianco.ficedl.info/spip.php?article2015 où j'ai aussi du triché en rajoutant une espace en fin de titre ; celà ne concerne que 2-3 articles sur 2'000)
==> une autre liste fermée pour précéder la précédente 
les mêmes chaines avec une espace après sont considérés comme non finales
4/ idem que swap1 par rapport à "propre"
==> [(#TITRE*|swap2|propre)]
résultat : Zisly, Henri - Bianco : presse anarchiste
// permet : "Article Titre" pour saisie "Titre (Article)"
// mais reste ")"
function swap2($texte){
$texte=strtr($texte, array("(La) "=>"(La) ", "(Le) "=>"(Le) ", "(Les) "=>"(les) ", "(L') "=>"(L') '", "(Il) "=>"(Il) ", "(Une) "=>"(Une) ", "(Un) "=>"(Un) ", "(D') "=>"(D') ", "(Des) "=>"(Des) ", "(La)"=>"yzyLa", "(Le)"=>"yzyLe", "(Les)"=>"yzyLes", "(L')"=>"yzyL'", "(Il)"=>"yzyIl", "(Une)"=>"yzyUne", "(Un)"=>"yzyUn", "(D')"=>"yzyD'", "(Des)"=>"yzyDe"));
$pieces=explode("yzy",$texte);
if(count($pieces)==2){
$return=$pieces[1]." ".$pieces[0];
}
else $return=$texte;
$return=eregi_replace('\' ','\'',$return);
return $return;
}
Il doit y avoir plein d'aberrations dans la syntaxe mais ça fonctionne quasi bien. Il y a des améliorations à proposer, n'hésitez pas !
Claude