Version haut débit de: Forum du site Lebrikabrak
Aide - Rechercher - Membres

Problème si URL dans le titre article et ajout ID article...

ZebulonT (25 Avril 2008, 13:12)
Bonjour,

J'ai constaté le problème suivant :

:fsb2_arrow: Je crée un article en tant qu'admin et le met du code html dans le titre
<a href="chemin/relatif/vers/mon/fichier.php">Le titre de mon article...</a>

:fsb2_arrow: Je donne le contrà´le sur l'article (à un rédacteur) en le sélectionnant dans le menu select de l'otion "Ajouter un (ou plusieurs) article ( id )" du menu "Modifier l'enregistrement d'un Rédacteur" (du rédacteur)...

:fsb2_arrow: Lorsque le rédacteur édite l'article, le champ titre contient juste <a href= et la suite chemin/relatif/vers/mon/fichier.php apparait à l'extérieur du champ (dans la page) ce qui fait qu'il ne sait plus modifier le titre...

Le problème vient du "croisement" entre les guillemets doubles (") et les guillemets simple (') en PHP... Pour éviter le problème, il faut utiliser le code suivant :
<a href='chemin/relatif/vers/mon/fichier.php'>Le titre de mon article...</a>
o๠l'on utilise des guillemets simple ! Mais je pense que cela engendre du code HTML non valide XHTML 1.0 ?

Voilà pour l'info. :wink:

A+
jchouix (25 Avril 2008, 14:40)
salut ZebulonT,
Citation
Le problème vient du "croisement" entre les guillemets doubles (") et les guillemets simple (') en PHP...
Pas tout à fait. Le problème vient en fait de l'interprétation html du navigateur. Il ne fait pas la différence entre les guillemets doubles qui entoure l'attribut value du champ texte <input> et les guillemets doubles de l'attribut href de la balise <a>. La conséquence est qu'il s'arràªte au deuxième guillemet double qu'il rencontre (i.e : le premier guillemet double de la balise <a>) pour donner la valeur du champ texte <input>.
Mais il y a un moyen simple d'éviter ce problème en encodant les guillemets doubles de la balise <a> en entités html lors de leur affichage dans le champ texte <input>.
Citation
o๠l'on utilise des guillemets simple ! Mais je pense que cela engendre du code HTML non valide XHTML 1.0 ?
Non, cette écriture est tout à fait valide et permet de contourner le problème évoqué plus haut car le navigateur fait bien la différence entre les guillemets doubles et les guillemets simples.
A+
ZebulonT (25 Avril 2008, 15:38)
Salut jchouix, :wink:

Citation
Mais il y a un moyen simple d'éviter ce problème en encodant les guillemets doubles de la balise <a> en entités html lors de leur affichage dans le champ texte <input>.
Tu veux dire de remplacer le " par &quot; ?

Oui, effectivement... Mais cela ne fonctionne qu'une seule fois !
Si le rédacteur édite à nouveau l'article, le titre apparait alors avec des guillemets doubles et si il l'enregistre à nouveau, le problème se repose ensuite...

Mais comme effectivement, vérification faite, l'utilisation du guillemet simple est parfaitement valide XHTML 1.0 :fsb2_oui: il est beaucoup plus simple de les utiliser ! D'autant que dans ce cas, il n'y a jamais aucun problème avec les éditions successives par les rédacteurs...

Cela dit, pourquoi ce problème se pose-t-il uniquement lors de l'édition/création d'un article par un rédacteur ?
Car l'admin lui peut directement utiliser les guillemets doubles sans aucun problème ! Màªme avec des éditions/enregistrements successifs...
C'est là que je pense qu'il y a un "croisement" quelque part dans le code PHP qui gère les pages d'édition des articles puisque le problème se pose dans un cas et pas dans l'autre...
Mais je me trompe peut-àªtre encore ?... :oups:

A+
jchouix (25 Avril 2008, 21:34)
bonsoir ZebulonT,
Citation
Oui, effectivement... Mais cela ne fonctionne qu'une seule fois !
Si le rédacteur édite à nouveau l'article, le titre apparait alors avec des guillemets doubles et si il l'enregistre à nouveau, le problème se repose ensuite...
C'est normal car lorsque tu enregistres c'est le guillemets double que tu enregistres et pas l'entité html.
Il te faut mettre un parser du style str_replace() ou htmlspecialchars() dans l'attribut value de l'input pour que cela affiche toujours l'entité html à la place du guillemet double.
Je te donne un exemple :
echo '<input type="text" name="cat" value="'.htmlspecialchars($mon_texte).'" />';
Avec ce code, tu es à l'abri de tous les problèmes.
A+
ZebulonT (26 Avril 2008, 9:55)
Bonjour jchouix,

Comme toujours, merci beaucoup pour tes explications claires et précises ! :fsb2_smyle:

A+
ZebulonT (26 Avril 2008, 21:42)
Bonsoir jchouix,

Comme je le disais plus haut :
Citation
Cela dit, pourquoi ce problème se pose-t-il uniquement lors de l'édition/création d'un article par un rédacteur ?
Car l'admin lui peut directement utiliser les guillemets doubles sans aucun problème ! Màªme avec des éditions/enregistrements successifs...

J'ai donc cherché à corriger le problème et voici la solution que j'ai trouvée (grà¢ce à tes précieux conseils :wink: ) :

:fsb2_arrow: Modifications apportées dans le fichier plugins\adm_redacteurs\inc\admin.inc

(Code ci-dessous à partir de la ligne 1536 pour Adm_redacteurs Version : 5.5b5 (2007/09/29))
	//Titre du document écrit
 	if ($btitre >= 1 && ($qtype != TYP_FORUM || ($qtype == TYP_FORUM && $fielda2 == "0"))) {
		//Ajout de ZebulonT
		$fieldb1 = str_replace('"','&#34;',$fieldb1);
		//Fin ajout de ZebulonT
		echo '<div style="text-align:center; padding-top: 15px;">'.$qtitre.'</div>';
		echo '<div style="text-align:center; padding-top: 5px;"><img border="0" src="'.$flag1.'" width="24" height="16" style="vertical-align:middle; margin-right:10px;" alt="'.$lang[0].'" title="'.$lang[0].'" /><input class="texte" type="text" name="titre1" size="55" value="'.$fieldb1.'" style="vertical-align:middle;" /></div>';
 		if ($lang[1] != "") {
		//Ajout de ZebulonT
		$fieldb1 = str_replace('"','&#34;',$fieldb1);
		//Fin ajout de ZebulonT
		echo '<div style="text-align:center; padding-top: 5px;"><img border="0" src="'.$flag2.'" width="24" height="16" style="vertical-align:middle; margin-right:10px;" alt="'.$lang[1].'" title="'.$lang[1].'" /><input class="texte" type="text" name="titre2" size="55" value="'.$fieldb2.'" style="vertical-align:middle;" /></div>';
   		}
  	}

Il n'y a ainsi, pour les rédacteurs, plus aucun souci avec l'utilisation des guillemets doubles dans le titre d'un article. :fsb2_oui:

A+
jchouix (26 Avril 2008, 23:13)
bonsoir ZebulonT,
merci pour ton aide.
Il y a néanmoins un petit couic dans ton code.
Je te laisse le soin de le trouver et le corriger. :wink:

Sinon, pour améliorer ton code, on pourrait aussi rajouter dans ton parser la correction du problème avec les caractères < et > qui ne seront pas valides XHTML 1.0 s'ils apparaissent non encodés dans le texte de la catégorie ou du titre.
Tu peux les rajouter sous cette forme :
$mon_texte = str_replace(array('"', '<', '>'), array('&#34;', '&lt;', '&gt;') , $mon_texte);
A+
ZebulonT (26 Avril 2008, 23:26)
Bonsoir,
Il y a néanmoins un petit couic dans ton code.
Je te laisse le soin de le trouver et le corriger. :wink:

Je suppose que le couic concerne le 2ème ajout que je corrige comme ceci :
//Ajout de ZebulonT
$fieldb2 = str_replace('"','&#34;',$fieldb2);
//Fin ajout de ZebulonT
avec la bonne variable $fieldb2 ?...

Et c'est OK pour la correction concernant les caractères < et >.

Bonne soirée. :wink:
ZebulonT (27 Avril 2008, 9:53)
Bonjour jchouix,

J'ai un peu retravaillé sur la question et voici le code que j'ai finalement adopté :

:fsb2_arrow: Modifications apportées dans le fichier plugins\adm_redacteurs\inc\admin.inc

(Code ci-dessous à partir de la ligne 1536 pour Adm_redacteurs Version : 5.5b5 (2007/09/29))
	//Titre du document écrit
 	if ($btitre >= 1 && ($qtype != TYP_FORUM || ($qtype == TYP_FORUM && $fielda2 == "0"))) {
		//Ajout de ZebulonT
		$fieldb1 = htmlspecialchars($fieldb1, ENT_QUOTES);
		//Fin ajout de ZebulonT
		echo '<div style="text-align:center; padding-top: 15px;">'.$qtitre.'</div>';
		echo '<div style="text-align:center; padding-top: 5px;"><img border="0" src="'.$flag1.'" width="24" height="16" style="vertical-align:middle; margin-right:10px;" alt="'.$lang[0].'" title="'.$lang[0].'" /><input class="texte" type="text" name="titre1" size="55" value="'.$fieldb1.'" style="vertical-align:middle;" /></div>';
 		if ($lang[1] != "") {
		//Ajout de Zebulon
		$fieldb2 = htmlspecialchars($fieldb2, ENT_QUOTES);
		//Fin ajout de ZebulonT
		echo '<div style="text-align:center; padding-top: 5px;"><img border="0" src="'.$flag2.'" width="24" height="16" style="vertical-align:middle; margin-right:10px;" alt="'.$lang[1].'" title="'.$lang[1].'" /><input class="texte" type="text" name="titre2" size="55" value="'.$fieldb2.'" style="vertical-align:middle;" /></div>';
   		}
  	}

Je le préfère a un code du style :
$fieldb1 = str_replace(array('"', '&', '<', '>'), array('&quot;', '&amp;', '&lt;', '&gt;')
car c'est effectivement plus élégant...

Et que le code :
echo '<input type="text" name="cat" value="'.htmlspecialchars($mon_texte).'" />';
car dans ce cas, lorsqu'on ré-édite l'article, les ", <, > et & étant stockées en entités HTML dans le fichier data/docID.inc, le titre de l'article s'affiche sous la forme &quot;Texte&quot; qui risque de désemparer un peu les rédacteurs...

Et d'après les tests que j'ai fait, tout semble fonctionner correctement... Et produire du code valide XHTML...

Quel est ton avis sur la question ?

Edit :

Pour rester cohérent (et sauf erreur de ma part :oups: ), je propose également de modifier les fichiers suivants :

:fsb2_arrow: Modifications apportées dans le fichier admin\plugins\adm_redacteurs\inc\redac_filemod.inc

Code idem ci-dessus à partir de la ligne 367 pour Adm_redacteurs Version : 5.5 (2007/06/06)

:fsb2_arrow: Modifications apportées dans le fichier plugins\adm_redacteurs\plugins\adm_redacteurs\inc\redac_filemod..inc

Code idem ci-dessus à partir de la ligne 392 pour Adm_redacteurs Version : 5.5 (2007/06/06)


A+ :wink:
jchouix (27 Avril 2008, 20:33)
bonsoir ZebulonT,
Citation
Quel est ton avis sur la question ?
Tu n'a pas besoin d'utiliser la constante ENT_QUOTES car tu n'as pas besoin d'encoder les guillemets simples.
Par contre, il te faut rajouter la déclaration du charset pour nos amis étrangers comme ceci :
$text = htmlspecialchars($text, ENT_COMPAT, $charset);

A+
ZebulonT (28 Avril 2008, 22:51)
Bonsoir jchouix,

Merci pour tes conseils.
Citation (jchouix)
Par contre, il te faut rajouter la déclaration du charset pour nos amis étrangers
Juste une petite question à propos du charset : si comme je l'ai bien compris, comme le jeu de caractères par défaut de la fonction htmlspecialchars() pour la conversion est l'ISO-8859-1 et que GuppY utilise aussi l'ISO-8859-1 dans son entàªte, est-il nécessaire spécifier le charset ?

A+
jchouix (29 Avril 2008, 8:35)
salut,
Citation
GuppY utilise aussi l'ISO-8859-1 dans son entàªte, est-il nécessaire spécifier le charset ?
Le charset déclaré par guppy dépend de la langue choisie donc il est nécessaire de spécifier le charset sinon nos amis russes par exemple vont avoir des problèmes d'encodage et d'affichage de leurs caractères cyrilliques.
A+
ZebulonT (29 Avril 2008, 22:51)
Bonsoir jchouix,

salut,
Citation (ZebulonT)
GuppY utilise aussi l'ISO-8859-1 dans son entàªte, est-il nécessaire spécifier le charset ?
Le charset déclaré par guppy dépend de la langue choisie donc il est nécessaire de spécifier le charset sinon nos amis russes par exemple vont avoir des problèmes d'encodage et d'affichage de leurs caractères cyrilliques.
A+

Donc, en toute logique, il faut récupérer le charset de GuppY dans une variable et l'introduire comme argument de la fonction htmlspecialchars()...
Toi qui connais bien GuppY :wink: , sais-tu si on peu récupérer directement le charset utilisé par GuppY et si oui, dans quelle variable ?

A+
jchouix (30 Avril 2008, 13:52)
bonsour ZebulonT,
Citation
Toi qui connais bien GuppY :wink: , sais-tu si on peu récupérer directement le charset utilisé par GuppY et si oui, dans quelle variable ?
Le nom de la variable dans guppy qui contient le charset n'est pas très original car c'est $charset :fsb2_smyle:
A+
ZebulonT (30 Avril 2008, 14:09)
Salut jchouix,

Comme tu le dit, ce n'est pas très original... :fsb2_smyle:
Je teste l'affaire dès que possible...

A+