BaliseNomSite

All contributions published for previous SPIP versions

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:

function mon_calcul_balise_nom_site($nom_site, $url_site) {
	if (strlen($nom_site) == 0) {
		if (ereg('http://(.*)',$url_site,$regs)) {
			$nom_site = $regs[1];
			if (ereg('/$',$nom_site))
				$nom_site = substr($nom_site,0,strlen($nom_site)-1);
		}
		else
			$nom_site =$url_site;
	}
	return $nom_site;
}

function balise_NOM_SITE($p) {
	$_nom_site = champ_sql('nom_site', $p);
	$_url_site = champ_sql('url_site', $p);
	$p->code = "mon_calcul_balise_nom_site($_nom_site, $_url_site)";
	$p->statut = 'html';
	return $p;
}

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 [/].

updated on 7 March 2007

Discussion

Aucune discussion

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom