J’ai un problème classique. Une table avec trois champs : le prénom, le nom d’usage (ex:femme mariée) et le nom de famille (ex:nom de naissance).
J’ai créé une balise, appelée dans une boucle, pour faire ressortir le nom pertinent, c’est à dire d’usage lorsqu’il existe, sinon du nom de famille.
J’ai deux rédactions, dans mon fichier mon_plugin_fonctions.php dont la seconde fonctionne, mais pas la première, et je ne comprends pas pourquoi.
Quelqu’un pourrait-il m’expliquer pourquoi la première rédaction - plus simple - ne donne pas satisfaction ?
Première rédaction dysfonctionnelle : Que le nom d’usage soit indiqué dans la table ou non, le nom est considéré comme existant.
function balise_LE_NOM ($p) {
// chopper les valeurs des champ sql dans la boucle
$_nom_usage = champ_sql(‘nom_usage’, $p) ;
$_nom_famille = champ_sql(‘nom_famille’, $p) ;
$_nom = “(strlen($_nom_usage))
? $_nom_usage
: $_nom_famille”;
$p->code = “$_nom”;
return $p;
}
Merci par avance pour vos lumières. Et accessoirement dois-je protéger l’écriture de sortie d’un nom qui serait avec une apostrophe ou un caractère spécial ou bien SPIP fait cela tout seul ?
En fait tu pourrais regarder en mode debug par exemple le code PHP que te génère cette balise ; ça t'aiderait à comprendre.
Ce qui ce passe c'est que $p->code génère un code valide PHP. La fonction "champ_sql()" retourne du code PHP (comment obtenir "nom_usage" dans la ligne de bdd). Pas la valeur elle-même dans la bdd, inconnue à ce stade.
Du coup, tester "champ_sql('X', $p)) ? A : B" comme ici retournera toujours A. car pour peu que le champ X existe, ça retourne du code PHP. Donc du contenu (true) ? A : B.
Ce que tu veux tester c'est le résultat de l'exécution de ce code PHP (dans $p->code), comme tu fais dans la seconde fonction.
Tu aurais pu écrire aussi (je n'ai pas testé là) :
Tu affectes (affecteras) le résultat (de l'éxécution du code php $_nom_usage) dans $a (sa vrai valeur en bdd pour le coup) ; s'il a du contenu, tu l'affiches, sinon tu utilises le nom de famille (en exécutant son code pour l'obtenir).
De la sorte l'instruction pour obtenir le nom d'usage n'est exécuté qu'une fois au lieu de deux.