JeuWeb - Crée ton jeu par navigateur
Vos utilisations de XML - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Vos utilisations de XML (/showthread.php?tid=956)

Pages : 1 2 3


RE: Vos utilisations de XML - Roworll - 23-03-2007

Citation :Ca m'a l'air très intéressant. Peux-tu développer un peu s'il te plaît ?
Bien sur.
Le système de traduction est composé de trois éléments:

1 - Le fichier XML qui contient les chaines à traduire

J'ai un fichier par page et par langue.
Ces fichiers n'ont pas de headers XML car ils sont destinés à être inclus dans le XML renvoyé par PHP

Voici par exemple le fichier welcome-fr.xml
Code PHP :
<?php 
<labels>
<
label name="name">Pseudo</label>
<
label name="pass">Mot de Passe</label>
<
label name="enter">Entrer</label>
<
label name="lost">Codes Oubliés ?</label>
<
label name="remem">Se Rappeler</label>
<
label name="browsers">Accostez avec</label>
<
label name="access">Accéder à la Station</label>
</
labels>
Le fichier welcome-en.xml
Code PHP :
<?php 
<labels>
<
label name="log">Login</label>
<
label name="pass">Password</label>
<
label name="enter">Enter</label>
<
label name="lost">Password Lost?</label>
<
label name="remem">Remember me</label>
<
label name="browsers">Dock with</label>
<
label name="access">Enter the Station</label>
</
labels>

2 - Le fichier PHP qui va créer le XML

L'application traine une variable de session qui contient le nom de la langue en cours (fr, en, etc)
Code PHP :
<?php 
$_xml
='<?xml version="1.0" encoding="UTF-8"?>';
$_xml.='<?xml-stylesheet type="text/xsl" href="./xsl/welcome.xsl"?>';
$_xml.='<page xml:lang="'.$_SESSION['ST_Lng'].'" theme="'.$_SESSION['ST_Theme'].'" pgname="welcome">';
$_xml.=$_SESSION['ST_Menu'];
$_xml.=$_SESSION['ST_ThemeParam'];
$_xml.='<elem>welcome</elem>';
$rsN=db_query('SELECT news_id, news_title, news_text, news_date, news_img, news_lng, player_id, player_name FROM news LEFT JOIN players ON news_player_id = player_id WHERE news_lng=\''.$_SESSION['ST_Lng'].'\' ORDER BY news_date DESC limit 0,10');
$_xml.='<news>';
while(
$lnN=mysql_fetch_array($rsN)){
$_xml.='
<new>
<id>'
.$lnN['news_id'].'</id>
<title>'
.$lnN['news_title'].'</title>
<text>'
.nl2br($lnN['news_text']).'</text>
<date>'
.strftime('%Y-%m-%d',$lnN['news_date']).'</date>
<img>'
.$lnN['news_img'].'</img>
<lng>'
.$lnN['news_lng'].'</lng>
<player id="'
.$lnN['player_id'].'">'.$lnN['player_name'].'</player>
</new>'
;
}
$_xml.='</news>';
//C'est ici que je rajoute mon fichier XML de traduction
$_xml.=file_get_contents('xml/welcome-'.$_SESSION['ST_Lng'].'.xml');
$_xml.='</page>';

header ('content-type: text/xml');
echo
$_xml;

3 - Le fichier XSL qui va transformer la page

C'est lui qui va mettre en place toutes les informations.

Voici le morceau de code ou on affiche les zones de saisie login/password
Code PHP :
<?php 
<!-- Le Login-->
<
xsl:value-of select="/page/labels/label[@name='log']" /> <input type="text" maxlength="30" size="10" name="login_name" /><br />
<!--
Le Mot de Passe-->
<
xsl:value-of select="/page/labels/label[@name='pass']" /> <input type="password" maxlength="30" size="10" name="login_password" /><br />
<!--
Le Bouton de validation-->
<
input type="submit" class="button" value="{/page/labels/label[@name='enter']}" />

Au final, si ma variable de session contient 'fr', j'aurai à l'écran
Pseudo [ ]
Mot de Passe [ ]
[Entrer]

Si ma variable de session contient 'en', j'aurai
Login [ ]
Password [ ]
[Enter]

Gros avantage encore une fois, cette transformation est faite sur le client.
PHP se limite à envoyer du XML, ce qui limite grandement la charge.

---------------------------------------------------------

Citation :Tu es obligé de passer par une bibliothèque pour lire les attributs et les noeuds enfants, non ?
Uniquement lorsque j'ai besoin d'exploiter le XML dans PhP.
Vu que 95% du temps je ne fais que créer du XML pour l'envoyer brut vers le client, je me contente de faire une grosse chaine de caractére.
Par exemple :
Code PHP :
<?php 
$_xml
='<?xml version="1.0" encoding="UTF-8"?>';
$_xml.='<?xml-stylesheet type="text/xsl" href="./xsl/stats.xsl"?>';
$_xml.='<page xml:lang="fr" title="Statistiques">';
$_xml.=getGuilds();
$_xml.='<statcls>';
$rsC=db_query("SELECT count(*) as tot, char_class FROM characters, guilds WHERE char_hide=0 AND char_guild_id=guild_id and guild_game='vg' GROUP BY char_class");
while(
$lnC=mysql_fetch_assoc($rsC)){
$_xml.='<stat total="'.$lnC['tot'].'">'.$lnC['char_class'].'</stat>';
}
$_xml.='</statcls>';
$_xml.='<statart>';
$rsC=db_query("SELECT count(*) as tot, char_art FROM characters, guilds WHERE char_hide=0 AND char_guild_id=guild_id and guild_game='vg' GROUP BY char_art");
while(
$lnC=mysql_fetch_assoc($rsC)){
$_xml.='<stat total="'.$lnC['tot'].'">'.$lnC['char_art'].'</stat>';
}
$_xml.='</page>';

disconnect();
header ('content-type: text/xml');
echo
$_xml;
Pas besoin d'utiliser SimpleXML pour créer le XML que je vais envoyer au client.
Une simple concaténation de chaine est aussi efficace et moins gourmande en ressources / temps.

Par contre, si j'ai besoin à l'intérieur d'un module PHP de lire un élément du fichier XML ou de modifier un XML existant, SimpleXML s'impose.


RE: Vos utilisations de XML - denisc - 23-03-2007

C'est plus long que d'envoyer la page avec les textes en dur dans la bonne langue tout ça, non?
Ca donne plus de trafic dans les tuyaux : 2 fichiers au lieu d'un seul !
D'autant que si c'est regénéré à chaque fois que l'utilisateur appelle la page, l'intérêt me semble très limité sur cet exemple !


RE: Vos utilisations de XML - Roworll - 23-03-2007

Le XSL se met en cache sur le client (à l'instar des css).
Les 2 fichiers ne sont envoyés que la 1ere fois.
La seule partie dynamique est le XML qui est régénéré par PHP à chaque fois

Supposes que tu appelles la même page 10 fois.
Avec un moteur de template tu auras 10 fois le process de traduction / remplacement effectué sur le serveur d'ou augmentation de la charge.

Par XML/XSL, tu n'envoies que les données et c'est le client qui mettra 10 fois la traduction en place.

Gain de performance du serveur.


RE: Vos utilisations de XML - denisc - 23-03-2007

Va falloir que je trouve une formation pour ça... XSLT, je connais pas plus que XML Tongue


RE: Vos utilisations de XML - Roworll - 23-03-2007

Un autre exemple un peu plus parlant.
Regarde sur cette page http://vanguard.steel-titans.net/roster.php5

Le fichier source est en XML (pas mis en forme... trop feignasse et ca prends plus de bande passante de coller des retour à la ligne et des tabulations partout).
Aved le XSL approprié, à partir d'une source unique, j'affiche 5 présentations différentes !

J'ai un fichier source de 32Ko, un fichier XSL de 33 Ko et la version HTML finale fait 518Ko !!!

Imagine si c'est PHP qui doit créer ce monstre et tout envoyer à partir du serveur !
Pour info, le temps de traitement PhP avoisine les 0.015s.


RE: Vos utilisations de XML - denisc - 23-03-2007

Peux-tu poster ou envoyer par mail les deux fichiers sources de cette page stp?


RE: Vos utilisations de XML - Roworll - 29-03-2007




RE: Vos utilisations de XML - Harparine - 29-03-2007

Merci de ce code, c'est intéressant à voir. Moi aussi, j'utilisais le xml pour des données de type map (surtout que couplé à du Flash, c'est idéal), par contre, je n'ai jamais envisagé d'utiliser XML pour stocker le contenu textuel d'une page web (je n'avais jamais regardé le XLS) mais j'y songe de plus en plus (surtout que j'ai un site pour une association de jumelage à faire en multilingue)...

J'aurais juste quelques questions, par contre Wink : je vois que ton fichier XLS assemble tes balises html et ton contenu xml, mais peux-tu en plus lier une feuille de style CSS dans ton code ?

De plus, j'imagine que tous tes liens pointent vers le fichier php. Mais tout est bien compilé sur l'ordi client ?

Si c'est bien le cas, c'est vrai que c'est sans doute plus long à coder, mais pour séparer forme et contenu, on ne fait pas mieux et c'est très adapté aux sites multilingues... Smile


RE: Vos utilisations de XML - Roworll - 29-03-2007

Citation :e vois que ton fichier XLS assemble tes balises html et ton contenu xml, mais peux-tu en plus lier une feuille de style CSS dans ton code ?
Bien sur.
XSL est juste un moteur de transformation de XML.
Tu peux renvoyer ce que tu veux avec, du XHTML, du XML ou même du texte.

Dans mon code, au début, j'appelle un template
Code PHP :
<?php 
<xsl:call-template name="header"><xsl:with-param name="title" select="/page/@title"/></xsl:call-template>
Ce template est contenu dans un fichier externe importé en début de page
Code PHP :
<?php 
<xsl:import href="com-xsl.xsl" />
Voici le code de mon template
Code PHP :
<?php 
<xsl:template name="header">
<
xsl:param name="title" />
<
title><xsl:value-of select="$title" /></title>
<
link href="css/site.css" rel="stylesheet" type="text/css" />
<
script type="text/javascript" src="scripts/site.js"></script>

<
xsl:if test="system-property('xsl:vendor')='Microsoft'">
<
xsl:comment><xsl:text>[if IE]>&lt;![if lte IE 6]>&lt;![endif]</xsl:text></xsl:comment>
<
style type="text/css">
div.menu{
position: absolute;
top:expression(documentElement.scrollTop+body.scrollTop+5);
}
body { background: url(null) fixed ; /* évite le sautillement */
</style>
<
xsl:comment><xsl:text>[if IE]>&lt;![endif]>&lt;![endif]</xsl:text></xsl:comment>
</
xsl:if>

</
xsl:template>

On y voit d'ailleurs l'inclusion d'un CSS, d'un fichier de script mais aussi d'un code conditionnel pour un tweak IE6.

C'est un peu compliqué et c'est pour ça que je ne l'ai pas inclu dans les sources d'origine.

Il faut voir XSL un peu comme un interpréteur sur le poste client.
Le XSL est le code source, le XML est la base de données.

En XSL permet de faire sur les données XML
- des requêtes
- des boucles
- des tests
- des tris

Il permet en plus de faire
- des inclusions de fichiers externes
- des "fonctions" (template)

et bien d'autres choses encore.


RE: Vos utilisations de XML - Harparine - 29-03-2007

Merci de tous ces renseignements. Ca m'intéresse vachement. Je pense que je vais aller acheter un bouquin sur XML+XLS sans tarder ! Wink