August & Debouzy
[ janvier 2002 ]Un design très sobre et institutionnel pour ce cabinet d’avocats derrière lequel se cache un moteur SPIP...
http://www.august-debouzy.com
Le plus grand challenge technique de ce site est constitué par l’annuaire car SPIP ne se prête pas tout à fait à ce genre d’usage.
En effet, un annuaire implique que l’on puisse passer un paramètre à un critère de boucle :
Voici la boucle de la lettre A :
<BOUCLE_a(ARTICLES) {id_rubrique} {titre == (^a)} {par titre}>
<?php $array = array("[(#TITRE|ad_name)]","#ID_RUBRIQUE","#ID_ARTICLE");?>
<BOUCLE_a_mot(MOTS) {id_article}>
<?php $array[] = "#TITRE"; ?>
</BOUCLE_a_mot>
<?php echo toto($array);?>
</BOUCLE_a>
On comprend vite qu’il serait bon de pouvoir n’écrire cette boucle qu’une seule fois dans le squelette pour ensuite modifier {titre == (^a)} à la volée. Seulement voilà, ce n’est pas possible...
Une première solution a donc consisté à créer 26 boucles dans le même squelette, ce qui est à l’origine de la fonction toto. Avec toutes ces boucles, chaque modification du code html généré devenait un calvaire. La boucle se contente donc de placer les infos dans un tableau $array qui est ensuite passé à cette fonction qui génère le code html :
function toto($array) {
return "<div class=\"annuaire-liste\"><p class=\"titre-annuaire\">
<a href=\"".$PHP_SELF."?id_rubrique=".$array[1]
."&id_article=".$array[2]."\">"
.htmlentities($array[0])."</a></p>
<div class=\"annuaire-mot\">".$array[3]."</div>
</div>";
}
Cette solution avait pour énorme inconvénient de générer des pages de cache assez lourdes, ce qui avait un impact certain sur le temps de réponse du site. La solution a donc consisté à faire 26 squelettes contenant chacun une seule boucle annuaire. Le choix du fond se fait dans la page php en fontion des paramètres qui lui sont passés.
Restait la question du tri des articles devant s’effectuer sur le nom. Par conséquent le titre d’un article annuaire est sous la forme "Nom Prénom" ce qui permet d’utiliser le critère {par titre}. Ce titre est ensuite remis en forme via le filtre ad_nom :
function ad_name($str){
$match = explode(" ",$str);
$ct = count($match);
$out = $match[$ct-1]." ";
for($x = 0;$x < $ct-1;$x++)
$out.= $match[$x]." ";
return $out;
}