Si un visiteur laisse un commentaire (message de forum), en indiquant l’URL d’un site, mais sans préciser le nom du site, la boucle suivante :
<BOUCLE0(FORUMS){id_forum}>
[<a href="(#URL_SITE)" class="spip_out">
(#NOM_SITE)
</a>]
</BOUCLE0>n’affiche rien, et le lien, bien que présent, n’est pas cliquable.
Avec la version 1.7, une solution consisterait à remplacer (#NOM_SITE) par (#NOM_SITE|sinon{"Voir le site..."}). Mais on peut faire mieux avec la 1.8.
Solution A : nouveau filtre
Depuis le 13 janvier 2005, on dispose d’un filtre "?" permettant précisément de tester si une balise est vide. La syntaxe est [(#BALISE|?{si_non_vide,si_vide})]. Notez que les deux alternatives sont séparées par une virgule ’,’ comme dans les filtres SPIP (et non par un deux-points ’ :’ comme dans l’opérateur ternaire PHP correspondant A ? B : C ).
<BOUCLE0(FORUMS){id_forum}>
[<a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|?{#NOM_SITE,#URL_SITE})]</a>]
</BOUCLE0>Solution B : surcharger la balise
Cette solution consiste à surcharger la balise #NOM_SITE pour qu’elle fournisse le nom du site si il a été donné par le visiteur, et sinon, à le fabriquer à partir de l’url du site. C’est plus compliqué mais permet au passage de metre en forme le texte de l’url.
Dans le fichier mes_fonctions.php3 (*** Vérifier si c’est pas mes_options.php3 SVP, Minh ***, oui je confirme que c’est bien mes_fonctions.php3 comme pour les filtres, YvesGrenier), il faut ajouter les deux fonctions suivantes qui permet de redéfinir la balise #NOM_SITE :
La première fonction (mon_calcul...) retourne le champ nom_site si il est non vide. Sinon, on récupère l’url en retirant les lettres "http://" si on les trouve au début, et en retirant un "/" final si nécessaire.
La seconde fonction est celle qui surcharge la balise. Les deux premières instructions récupèrent les deux champs nom_site et url_site. La troisième indiquera au compilateur la fonction qui sera utilisée pour choisir entre les deux champs.
(Minh) Questions : Pourquoi les _ devant nom_site et _url_site ? Pourquoi tu mets pas [/]$ dans la première expression régulière pour simplifier ? Tu voudrais raccourcir en calcul_nom_site ?
(YvesGrenier) Réponses : j’ai choisi des noms de variables proches de nom_site et url_site, mais différents, pour éviter la confusion avec le nom du champ (je ne sais pas si il y a un risque pour le compilateur, mais le risque est au moins pour le programmeur). Mettre un "_" devant est un moyen simple de le faire. Pour la deuxième question : je n’ai pas utilisé la première expression régulière pour éliminer aussi l’éventuel "/" de la fin d’url parce que j’arrivais à une ambiguité. Mettre simplement ’http://(.*)[/]$’ eliminerait les chaînes ne se terminant pas par "/". Il faudrait alors utiliser une expression régulière qui serait ’http://(.*)[/]?$’ où le point d’interrogation permettrait d’éliminer un ou zéro caractère "/", mais le résultat est ambigu, car une chaîne se terminant par "/" peut aussi bien être interprétée en mettant le "/" dans la sélection (.*) ou dans [/].

