• Aucun résultat trouvé

4.XML et PHP

4.2 Application impôts : version

4.2.2 L'application xmlsimulations

Nous créons un fichier xmlsimulations.html que nous mettons dans le répertoire de l'application impots. La page visualisée est la suivante :

Ce document HTML est un document statique. Son code est le suivant : <html>

<head>

<title>impots</title>

<script language="JavaScript" type="text/javascript"> function effacer(){ // raz du formulaire with(document.frmImpots){ optMarie[0].checked=false; optMarie[1].checked=true; txtEnfants.value=""; txtSalaire.value=""; txtImpots.value=""; }//with }//effacer function calculer(){

// vérification des paramètres avant de les envoyer au serveur with(document.frmImpots){

//nbre d'enfants

champs=/^\s*(\d+)\s*$/.exec(txtEnfants.value); if(champs==null){

// le modéle n'est pas vérifié

alert("Le nombre d'enfants n'a pas été donné ou est incorrect"); nbEnfants.focus(); return; }//if //salaire champs=/^\s*(\d+)\s*$/.exec(txtSalaire.value); if(champs==null){

alert("Le salaire n'a pas été donné ou est incorrect"); salaire.focus();

return; }//if

// c'est bon - on envoie submit(); }//with }//calculer </script> </head> <body background="/poly/impots/7/images/standard.jpg"> <center> Calcul d'impôts <hr>

<form name="frmImpots" action="/poly/impots/7/xmlsimulations.php" method="POST">

<table> <tr>

<td>Etes-vous marié(e)</td> <td>

<input type="radio" name="optMarie" value="oui">oui

<input type="radio" name="optMarie" value="non" checked>non </td>

</tr> <tr>

<td>Nombre d'enfants</td>

<td><input type="text" size="3" name="txtEnfants" value=""></td> </tr>

<tr>

<td>Salaire annuel</td>

<td><input type="text" size="10" name="txtSalaire" value=""></td> </tr>

<tr></tr> <tr>

<td><input type="button" value="Calculer" onclick="calculer()"></td> <td><input type="button" value="Effacer" onclick="effacer()"></td> </tr> </table> </form> </center> </body> </html>

On notera que les données du formulaire sont postées à l'URL /poly/impots/7/xmlsimulations.php. Le code de l'application

xmlsimulations.php est très analogue à celui de l'application impots.php. Le lecteur est invité à revoir celui-ci. Rappelons le code d'entrée

: <?php

// traite le formulaire des impôts // bibilothèques include "ImpotsDSN.php"; // démarrage session session_start(); // configuration de l'application ini_set("register_globals","off"); ini_set("display_errors","off"); $formulaireImpots="impots_form.php"; $erreursImpots="impots_erreurs.php"; $bdImpots=array(dsn=>"mysql-dbimpots",user=>admimpots,pwd=>mdpimpots, table=>impots,limites=>limites,coeffR=>coeffR,coeffN=>coeffN);

// on récupère les paramètres de la session $session=$_SESSION["session"];

// session valide ?

if(! isset($session) || ! isset($session[objImpots]) || ! isset($session[simulations])){ // on démarre une nouvelle session

$session=array(objImpots=>new ImpotsDSN($bdImpots),simulations=>array()); // des erreurs ?

if(count($session[objImpots]->erreurs)!=0){

$requête=array(erreurs=>$session[objImpots]->erreurs);

// affichage page d'erreurs include $erreursImpots; // fin $session=array(); terminerSession($session); }//if }//if

// on récupère les paramètres de l'échange en cours $requête[marié]=$_POST["optMarie"];

$requête[enfants]=$_POST["txtEnfants"]; $requête[salaire]=$_POST["txtSalaire"];

// a-t-on tous les paramètres ?

if(! isset($requête[marié]) || ! isset($requête[enfants]) || ! isset($requête[salaire])){

// affichage formulaire vide

$requête=array(chkoui=>"",chknon=>"checked",enfants=>"",salaire=>"",impots=>"", erreurs=>array(),simulations=>array()); include $formulaireImpots; // fin terminerSession($session); }//if // vérification paramètres $requête=vérifier($requête); // des erreurs ? if(count($requête[erreurs])!=0){ // affichage formulaire include "$formulaireImpots"; // fin terminerSession($session); }//if

// calcul de l'impôt à payer

$requête[impots]=$session[objImpots]->calculer(array(marié=>$requête[marié], enfants=>$requête[enfants],salaire=>$requête[salaire]));

// une simulation de plus

$session[simulations][]=array($requête[marié],$requête[enfants],$requête[salaire],$requête[impots]); $requête[simulations]=$session[simulations]; // affichage formulaire include "$formulaireImpots"; // fin terminerSession($session); ...

Les pages HTML étaient affichées par les lignes include "...". On veut ici générer du XML et non du HTML. Il suffit d'écrire deux nouvelles applications impots_erreurs.php et impots_simulations.php pour qu'elle génèrent du XML au lieu du HTML. Le reste de l'application ne change pas. Le code devient alors le suivant :

<?php

// traite le formulaire des impôts // bibilothèques include "ImpotsDSN.php"; // démarrage session session_start(); // configuration de l'application ini_set("register_globals","off"); ini_set("display_errors","off"); $formulaireImpots="xmlsimulations.html"; $erreursImpots="impots_erreurs.php"; $simulationsImpots="impots_simulations.php"; $bdImpots=array(dsn=>"mysql-dbimpots",user=>admimpots,pwd=>mdpimpots, table=>impots,limites=>limites,coeffR=>coeffR,coeffN=>coeffN);

// on récupère les paramètres de la session $session=$_SESSION["session"];

// session valide ?

if(! isset($session) || ! isset($session[objImpots]) || ! isset($session[simulations])){ // on démarre une nouvelle session

$session=array(objImpots=>new ImpotsDSN($bdImpots),simulations=>array()); // des erreurs ?

if(count($session[objImpots]->erreurs)!=0){

$requête=array(erreurs=>$session[objImpots]->erreurs);

// affichage page d'erreurs au format XML header("Content-type: text/xml"); include $erreursImpots; // fin $session=array(); terminerSession($session); }//if }//if

// on récupère les paramètres de l'échange en cours $requête[marié]=$_POST["optMarie"];

$requête[enfants]=$_POST["txtEnfants"]; $requête[salaire]=$_POST["txtSalaire"];

// a-t-on tous les paramètres ?

if(! isset($requête[marié]) || ! isset($requête[enfants]) || ! isset($requête[salaire])){

// affichage formulaire vide include $formulaireImpots; // fin terminerSession($session); }//if // vérification paramètres $requête=vérifier($requête); // des erreurs ? if(count($requête[erreurs])!=0){

// affichage erreurs au format XML header("Content-type: text/xml"); include "$erreursImpots"; // fin terminerSession($session); }//if

// calcul de l'impôt à payer

$requête[impots]=$session[objImpots]->calculer(array(marié=>$requête[marié], enfants=>$requête[enfants],salaire=>$requête[salaire]));

// une simulation de plus

$session[simulations][]=array($requête[marié],$requête[enfants],$requête[salaire],$requête[impots]); $requête[simulations]=$session[simulations];

// affichage simulations au format XML header("Content-type: text/xml"); include "$simulationsImpots";

// fin

terminerSession($session);

Nous avons précédemment présenté et étudié les deux types de réponse XML à fournir ainsi que les feuilles de style qui doivent les accompagner. Le code de l'application impots_simulations.php est le suivant :

<?php

// génère le code XML de la page de simulations de l'application impots

// qqs constantes

$xslSimulations="simulations.xsl"; // entêtes XML

echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";

echo "<?xml-stylesheet type=\"text/xsl\" href=\"$xslSimulations\" ?>\n"; // les simulations

echo "<simulations>\n";

for ($i=0;$i<count($requête[simulations]);$i++){ // simulation $i

echo "<simulation marie=\"".$requête[simulations][$i][0]."\" ". "enfants=\"".$requête[simulations][$i][1]."\" ". "salaire=\"".$requête[simulations][$i][2]."\" ". "impot=\"".$requête[simulations][$i][3]."\" />\n"; }//for echo "</simulations>\n"; ?>

Ce code permet à partir du dictionnaire $requête de générer du code XML analogue au suivant : <?xml version="1.0" encoding="ISO-8859-1" ?>

<?xml-stylesheet type="text/xsl" href="simulations.xsl" ?> <simulations>

<simulation marie="non" enfants="3" salaire="200000" impot="22504" /> <simulation marie="oui" enfants="3" salaire="200000" impot="16400" /> <simulation marie="oui" enfants="2" salaire="200000" impot="22504" /> </simulations>

La feuille de style simulations.xsl transformera ce code XML en code HTML. Le code de l'application impots_erreurs.php est le suivant :

<?php

// génère le code XML de la page d'erreurs de l'application impots

$xslErreurs="erreurs.xsl"; // entêtes XML

echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";

echo "<?xml-stylesheet type=\"text/xsl\" href=\"$xslErreurs\" ?>\n"; // les erreurs echo "<erreurs>\n"; for ($i=0;$i<count($requête[erreurs]);$i++){ // erreur $i echo "<erreur>".$requête[erreurs][$i]."</erreur>"; }//for echo "</erreurs>\n"; ?>

Ce code permet à partir du dictionnaire $requête de générer du code XML analogue au suivant : <?xml version="1.0" encoding="ISO-8859-1" ?>

<?xml-stylesheet type="text/xsl" href="erreurs.xsl" ?> <erreurs>

<erreur>Impossible d'ouvrir la base DSN [mysql-dbimpots] (S1000)</erreur> </erreurs>

La feuille de style erreurs.xsl transformera ce code XML en code HTML. Voyons un premier exemple :

Le SGBD MySQL n'est pas lancé. On reçoit alors la réponse suivante :

Si on regarde le code source reçu par le navigateur, on a la chose suivante : <?xml version="1.0" encoding="ISO-8859-1" ?>

<?xml-stylesheet type="text/xsl" href="erreurs.xsl" ?> <erreurs>

<erreur>Impossible d'ouvrir la base DSN [mysql-dbimpots] (S1000)</erreur> </erreurs>

Le code reçu par le navigateur est le suivant :

<?xml version="1.0" encoding="ISO-8859-1" ?>

<?xml-stylesheet type="text/xsl" href="simulations.xsl" ?> <simulations>

<simulation marie="oui" enfants="2" salaire="200000" impot="22504" /> <simulation marie="non" enfants="2" salaire="200000" impot="33388" /> <simulation marie="non" enfants="3" salaire="200000" impot="22504" /> <simulation marie="oui" enfants="3" salaire="200000" impot="16400" /> </simulations>

On remarquera que notre nouvelle application est plus simple à maintenir que la précédente. Une partie du travail a été transférée sur les feuilles de style XSL. L'intérêt de cette nouvelle répartition des tâches est qu'une fois le format XML des réponses a été fixé, le développement des feuilles de style est indépendant de celui de l'application.