Dans une application Web utilisant XUL et PHP, on priviligiera une architecture client-serveur "légère" comme il est expliqué dans ApplisWeb/Architecture. Donc on utilisera des fichiers XUL statiques accompagnés de scripts javascript faisant appels à des webservices pour dialoguer avec le serveur, et éventuellement de sources de données en RDF qui, elles, peuvent être générées dynamiquement. Voir un exemple de génération de RDF en PHP dans ApplisWeb/ExemplePhpRdf
Cependant, il peut être nécessaire de générer dynamiquement un fichier XUL, même dans le cas d'une architecture client-serveur "legère".
On peut vouloir par exemple inclure ou non des menus, des boutons ou autres widgets en fonction des droits de l'utilisateur. Certes, on peut faire un fichier XUL statique et regler ces problèmes d'affichage coté client en javascript, mais le faire coté serveur apporte un peu plus de sécurité, et simplifie le code javascript coté client.
Imaginons un objet $user en PHP qui contient une méthode canModify(), indiquant si l'utilisateur peut modifier ou non quelque chose. On veut donc afficher un bouton XUL "modifier" et inclure sa commande associée uniquement si il a droit de modifier :
<window id="sample_win"
xmlns="[[http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"]]>
....
<commands id="commandes-generales">
...
<?php if($user->canModify()){ ?>
<command id="cmd_modify" oncommand="doEnregistrer()" />
<?php } ?>
...
</commands>
...
<hbox id="boutons">
<?php if($user->canModify()){ ?>
<button label="modifier" command="cmd_modify" />
<?php } ?>
</hbox>
...
</window>
Mieux encore, on peut utiliser les overlays, et n'activer que les overlays correspondants aux droits, évitant donc d'avoir des tests PHP partout dans le code source XUL. (pour plus d'infos sur les overlays, voir le chapitre correspondant dans le tutoriel : http://xulfr.org/xulplanet/xultu/overlay(..) )
<?php if($user->canModify()){
echo '<?xul-overlay href="overlay-modify.xul"?>';
} ?>
<window id="sample_win"
xmlns="[[http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"]]>
....
<commands id="commandes-generales">
...
</commands>
...
<hbox id="boutons"> ... </hbox>
...
</window>
avec le fichier overlay-modify.xul, qui est un overlay comme tout overlay, ajoutant donc la commande et le bouton modifier dans le fichier XUL principal, ainsi que le script associé
<?xml version="1.0"?>
<overlay id="toverlay"
xmlns="[[http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"]]>
<script type="application/x-javascript" src="fonctions-modifier.js" />
<commands id="commandes-generales">
<command id="cmd_modify" oncommand="doEnregistrer()" />
</commands>
<hbox id="boutons">
<button label="modifier" command="cmd_modify" />
</hbox>
</overlay>
Bien entendu, on peut aussi imaginer des overlays générés dynamiquement en PHP :-)
Malheureusement, on ne peut pas utiliser le mécanisme de DTD dans une applis web pour localiser une interface, comme on peut le faire dans une extension (voir le tutoriel : http://xulfr.org/xulplanet/xultu/locale.(..)). Là encore, le php peut nous être d'une grande aide. Imaginons que tous les labels de nos boutons soient dans un tableau PHP $labels dont le contenu dépend de la langue utilisée dans l'application :
<window id="sample_win"
xmlns="[[http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"]]>
....
<button label="<?php echo $labels['modify']?>" command="cmd_modify" />
...
</window>
Par défaut, une page HTTP indique au client web, au navigateur, que le contenu est du HTML, en envoyant le type mime text/html.
<?php
header('Content-type: application/vnd.mozilla.xul+xml');
if($user->canModify()){
echo '<?xul-overlay href="overlay-modify.xul"?>';
}
?>
<window id="sample_win"
xmlns="[[http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"]]>
...
Vous aurez également remarqué que le '<?xul-overlay...?>' est affiché par un echo, et n'est pas en dehors des balises PHP. En effet, sur la majeure partie des serveurs PHP, ils sont configurés de manière à interpreter toutes les balises commençant pas <?. Mettre donc '<?xul-overlay ..?>' en dehors des balises PHP provoquerait une erreur de syntaxe PHP. Idem donc pour toutes les autres "processing instructions" XML :
<?php
header('Content-type: application/vnd.mozilla.xul+xml');
echo '<?xml version="1.0"?>' , "\n";
echo '<?xml-stylesheet href="[[chrome://global/skin/]]" type="text/css"?>' , "\n";
if($user->canModify()){
echo '<?xul-overlay href="overlay-modify.xul"?>';
}
?>
<window id="sample_win"
...
Vous pouvez configurer le moteur PHP pour qu'il n'interprete que les balises <?php..?> et donc ne pas à avoir de faire des échos des processing instructions. Il faut pour cela modifier dans le php.ini (ou htaccess d'apache), le parametre short_open_tag, en le mettant à off :
short_open_tag = Off
Vous serez obliger d'utiliser "<?php" pour tout votre code php, et ne plus utiliser simplement "<?". Mais en contre partie, vous pouvez écrire les autres balises plus facilement :
<?php header('Content-type: application/vnd.mozilla.xul+xml'); ?>
<?xml version="1.0"?>
<?xml-stylesheet href="[[chrome://global/skin/]]" type="text/css"?>
<?php if($user->canModify()){ ?>
<?xul-overlay href="overlay-modify.xul"?>
<?php } ?>
<window id="sample_win"
...
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.