Actif
Messages : 174
Inscription :
Bonjour,
J'ai constaté le problème suivant :
Je crée un article en tant qu'admin et le met du code html dans le titre
Code (Sélectionner le code)<a href="chemin/relatif/vers/mon/fichier.php">Le titre de mon article...</a>
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)...
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 :o๠l'on utilise des guillemets simple ! Mais je pense que cela engendre du code HTML non valide XHTML 1.0 ?Code (Sélectionner le code)<a href='chemin/relatif/vers/mon/fichier.php'>Le titre de mon article...</a>
Voilà pour l'info.
A+
Réponses
Administrateur
Messages : 1390
Inscription :
salut ZebulonT,
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>.CitationLe problème vient du "croisement" entre les guillemets doubles (") et les guillemets simple (') en PHP...
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>.
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.Citationo๠l'on utilise des guillemets simple ! Mais je pense que cela engendre du code HTML non valide XHTML 1.0 ?
A+
Actif
Messages : 174
Inscription :
Salut jchouix,
Tu veux dire de remplacer le " par " ?CitationMais 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>.
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 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 ?...
A+
Administrateur
Messages : 1390
Inscription :
bonsoir ZebulonT,
C'est normal car lorsque tu enregistres c'est le guillemets double que tu enregistres et pas l'entité html.CitationOui, 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...
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 :
Avec ce code, tu es à l'abri de tous les problèmes.Code (Sélectionner le code)echo '<input type="text" name="cat" value="'.htmlspecialchars($mon_texte).'" />';
A+
Actif
Messages : 174
Inscription :
Bonsoir jchouix,
Comme je le disais plus haut :
CitationCela 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 ) :
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))
Code (Sélectionner le code)//Titre du document écrit if ($btitre >= 1 && ($qtype != TYP_FORUM || ($qtype == TYP_FORUM && $fielda2 == "0"))) { //Ajout de ZebulonT $fieldb1 = str_replace('"','"',$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('"','"',$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.
A+
Administrateur
Messages : 1390
Inscription :
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.
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 :
A+Code (Sélectionner le code)$mon_texte = str_replace(array('"', '<', '>'), array('"', '<', '>') , $mon_texte);
Actif
Messages : 174
Inscription :
Bonsoir,
Citation (jchouix, 26 Avril 2008, 23:13)Il y a néanmoins un petit couic dans ton code.
Je te laisse le soin de le trouver et le corriger.
Je suppose que le couic concerne le 2ème ajout que je corrige comme ceci :
avec la bonne variable $fieldb2 ?...Code (Sélectionner le code)//Ajout de ZebulonT $fieldb2 = str_replace('"','"',$fieldb2); //Fin ajout de ZebulonT
Et c'est OK pour la correction concernant les caractères < et >.
Bonne soirée.
Actif
Messages : 174
Inscription :
Bonjour jchouix,
J'ai un peu retravaillé sur la question et voici le code que j'ai finalement adopté :
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))
Code (Sélectionner le code)//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 :
car c'est effectivement plus élégant...Code (Sélectionner le code)$fieldb1 = str_replace(array('"', '&', '<', '>'), array('"', '&', '<', '>')
Et que le code :
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 "Texte" qui risque de désemparer un peu les rédacteurs...Code (Sélectionner le code)echo '<input type="text" name="cat" value="'.htmlspecialchars($mon_texte).'" />';
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 ), je propose également de modifier les fichiers suivants :
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)
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+
Administrateur
Messages : 1390
Inscription :
bonsoir ZebulonT,
Tu n'a pas besoin d'utiliser la constante ENT_QUOTES car tu n'as pas besoin d'encoder les guillemets simples.CitationQuel est ton avis sur la question ?
Par contre, il te faut rajouter la déclaration du charset pour nos amis étrangers comme ceci :
Code (Sélectionner le code)$text = htmlspecialchars($text, ENT_COMPAT, $charset);
A+
Actif
Messages : 174
Inscription :
Bonsoir jchouix,
Merci pour tes conseils.
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 ?Citation (jchouix)Par contre, il te faut rajouter la déclaration du charset pour nos amis étrangers
A+
Administrateur
Messages : 1390
Inscription :
salut,
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.CitationGuppY utilise aussi l'ISO-8859-1 dans son entàªte, est-il nécessaire spécifier le charset ?
A+
Actif
Messages : 174
Inscription :
Bonsoir jchouix,
Citation (jchouix, 29 Avril 2008, 8:35)salut,
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.Citation (ZebulonT)GuppY utilise aussi l'ISO-8859-1 dans son entàªte, est-il nécessaire spécifier le charset ?
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 , sais-tu si on peu récupérer directement le charset utilisé par GuppY et si oui, dans quelle variable ?
A+
Administrateur
Messages : 1390
Inscription :
bonsour ZebulonT,
Le nom de la variable dans guppy qui contient le charset n'est pas très original car c'est $charsetCitationToi qui connais bien GuppY , sais-tu si on peu récupérer directement le charset utilisé par GuppY et si oui, dans quelle variable ?
A+