8797 sujets

Développement web côté serveur, CMS

bonsoir...

je code actuellement un livre d'or xml/php, j'm'en sors relativement bien, sauf qu'en fait, j'ai un énorme problème d'encodage...

tout mes fichiers sont en ISO-8859-1, et tout marche parfaitement, sauf pour les accents.

on m'a conseillé d'utiliser une htmlentities pour coder mes entités, l'ennui, c'est que mon parser xml n'interprête pas les entités du style "ë", mais bien celles en "×"...

voici le livre d'or, avec un bouton pour remettre le xml à zéro quand ça foire, tant que j'ai pas trouvé la solution.

les codes:

1. la partie qui affiche les messages tirés du xml:

<?php
				// processeur xsl/xml				
				$filename = $path ."xml/styles.xsl";
				
				$xmldoc = domxml_open_file($path ."xml/messages.xml");
				
				$xsldoc = domxml_xslt_stylesheet_file($filename);
				$result =  $xsldoc->process($xmldoc);
				print $xsldoc->result_dump_mem($result);
			?>


2. la partie qui traite les données du formulaire:

<?php 
				if(empty($_POST['pseudo']) || empty($_POST['comment'])) {
						echo "<h2>ATTENTION !</h2>";
						echo "<p>Vous n'avez pas rempli tous les champs obligatoires pour poster votre message.<br />Veuillez <a href=\"javascript:history.back()\">réessayer</a>.</p>";
					}
					else {
						traitement();
						echo "<p>Votre message a bien été ajouté. Merci beaucoup.</p>";
						echo "<p><a href=\"book.php\">Voir votre message</a>.</p>";
					}
				
				function traitement() {
					
					// création de l'heure et de la date du post, et stockage dans deux variables.
					setlocale( LC_TIME, "fr_FR", "FRA");
					$date = strftime("%A %d %B %Y");
					$heure = "".strftime("%H")."h".strftime("%M")."";
					
					// récupération des variables passées au formulaire
					$pseudo = htmlentities($_POST['pseudo']);
					$message = htmlentities($_POST['comment']);
					if(empty($_POST['site'])) {
						$siteExist = false;
					}
					else {
						$siteExist = true;
						$site = htmlentities($_POST['site']);
					}
					
					// inclusion du script de calcul du path
					include("scripts/path.php");
					
					// création des balises xml du nouveau message.
					$xmldoc = domxml_open_file($path ."xml/messages.xml");
					
					$guestbookTag = $xmldoc->get_elements_by_tagname("guestbook");
					
						// balise message
						$messageTag = $xmldoc->create_element("message");
						$messageTag->set_attribute("date", $date);
						$messageTag->set_attribute("heure", $heure);
						
						// balise pseudo
						$pseudoTag = $xmldoc->create_element("pseudo");
						if ($siteExist == true) {
							$pseudoTag->set_attribute("site", $site);
						}
						$pseudoTag->set_content($pseudo);
							// ajout de la balise pseudo dans la balise message
							$messageTag->append_child($pseudoTag);
						
						// balise comment
						$commentTag = $xmldoc->create_element("comment");
						$commentTag->set_content($message);
							// ajout de la balise comment dans la balise message
							$messageTag->append_child($commentTag);
						
						$guestbookTag[0]->append_child($messageTag);
						
						$xmldoc->insert_before ($messageTag, $guestbookTag[0]->first_child());
						
						$xmlRoot = $xmldoc->dump_mem();
						
					//sauvegarde du fichier xml
					$xmlFile = fopen($pathNoFile ."xml/messages.xml", "w");
					fwrite($xmlFile, $xmlRoot);
					fclose($xmlFile);
				}
			?>


3. mon xsl:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	
	<xsl:output method="html" encoding="ISO-8859-1" />
	
	<xsl:template match="//message">
		<p class="message">
			<xsl:value-of select="./comment" /><br /><br />
			<small>
				par 
				<strong>
					<xsl:value-of select="./pseudo" />
				</strong>
				
				<xsl:if test="./pseudo/@site">
					(<a href="{./pseudo/@site}">site</a>)
				</xsl:if>,
				le <xsl:value-of select="@date" /> à <xsl:value-of select="@heure" />.
			</small>
		</p>
	</xsl:template>
	
	<xsl:template match="/guestbook">
		<xsl:if test="not(//message)">
			<p>Il n'y a pas encore de message dans ce livre d'or.</p>
			<p>Utilisez le formulaire en bas de page pour en ajouter un.</p>
		</xsl:if>
		
		<xsl:apply-templates />
	</xsl:template>
	
</xsl:stylesheet>


Je ne mets pas le code de mon xml, car il est totalement correct et ne change rien.

Donc voilà, merci bcp, le problème vient d'htmlentities à coup sûr, ou de mon parser, mais quand on rentre le message sans utiliser d'accent ou caractères "entitables", le livre d'or marche.

Merci.
Modifié par Lisarael (20 Apr 2005 - 23:07)
a écrit :
c'est que mon parser xml n'interprête pas les entités du style "&euml;", mais bien celles en "&#215;"...


&#xxx; c'est une référence de caractère, ce n'est pas une entité.

Si tu veux que le parser traite les entités, tu peux les lui déclarer dans la dtd :

<!ENTITY nom_de_l_entite "Contenu de l'entite">

:)
Salut,

Dans ton xml, tu peux ajouter un CDATA dans le node texte

<root>
<balise>[CDATA[Une balise xml avec un élegant CDATA ]]</balise>
</root>

FRed
d'accord, fred, mais comment ?

j'ai essayé et je n'arrive pas à insérer une balise <![CDATA[....]]> au milieu de mes trucs...

j'ai essayé par le php, j'y arrive pas, et je voudrai essayer par la xsl, mais je n'y arrive pas non plus...

tu saurais m'en dire plus ?