Valid XHTML     Valid CSS2    

Listing du fichier l2xml_6_tp5.php

 

00001     <?php
00002     #   # (gH)   -_-  l2xml_6_tp5.php  ;  TimeStamp (unix) : 16 Novembre 2017 vers 17:44
00003     include(
"std.php") ;
00004     include("l2xml_6_inc.php"
) ;
00005     
00006     $HTML  
s_span("HTML" ,"grouge") ;
00007     $XHTML 
s_span("XHTML","grouge") ;
00008     $XML   
s_span("XML"  ,"grouge") ;
00009     $XSL   
s_span("XSL"  ,"grouge") ;
00010     $XPATH 
s_span("XPATH","grouge") ;
00011     $DTD   
s_span("DTD"  ,"grouge") ;
00012     $XSD   
s_span("XSD"  ,"grouge") ;
00013     $CSS   
s_span("CSS"  ,"grouge") ;
00014     $CSV   
s_span("CSV"  ,"grouge") ;
00015     $AJAX  
s_span("AJAX" ,"grouge") ;
00016     $Excel      
s_span("Excel"       ,"grouge") ;
00017     $Javascript 
s_span("JavaScript"  ,"grouge") ;
00018     $R          
s_span("R"           ,"grouge") ;
00019     $PHP        
s_span("PHP"         ,"grouge") ;
00020     
00021     $numSerie 
;
00022     
00023     if (!isset($_GET
["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00024     
00025     debutSection
() ;
00026     h1
("$XML en L2, universit&eacute; d'Angers ") ;
00027     h2
(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00028     pvide
() ;
00029     h2
(s_span("T.P. num&eacute;ro $numSerie","gbleu")."&nbsp;:&nbsp;Programmation") ;
00030     pvide
() ;
00031     
00032     ###########################################################################################
00033     
00034     $tableauDesRubriques 
= array() ;
00035     $idr 
;
00036     $idr
++; $tableauDesRubriques[$idr] = "Programmation en $PHP (1) : lecture" ;
00037     $idr
++; $tableauDesRubriques[$idr] = "Programmation en $PHP (2) : génération" ;
00038     $idr
++; $tableauDesRubriques[$idr] = "Programmation en $PHP (3) : recherche" ;
00039     $idr
++; $tableauDesRubriques[$idr] = "Programmation en $PHP (4) : transformation" ;
00040     $idr
++; $tableauDesRubriques[$idr] = "Programmation en $Javascript (1) : lecture " ;
00041     $idr
++; $tableauDesRubriques[$idr] = "Programmation en $Javascript (2) : génération " ;
00042     $tdmCRLM 
= new tdm($tableauDesRubriques) ;
00043     $tdmCRLM
->titre() ;
00044     $tdmCRLM
->menu("oui","oui","nou") ;
00045     
00046     pvide
() ;
00047     $numExo   
;
00048     $numSerie 
;
00049     direAfficherSolutions
($numSerie) ;
00050     pvide
() ;
00051     
00052     p
("texte") ;
00053     echo b
("Attention &nbsp;:")." tout code $PHP qui doit produire du $XHTML doit &ecirc;tre écrit via du " ;
00054     echo href
("http://www.info.univ-angers.fr/~gh/internet/php_conceptuel.php","$PHP conceptuel").", donc sans marqueur " ;
00055     echo ghVert
("&lt;")." ou ".ghvert("&gt;").". ";
00056     finp
() ;
00057     
00058     p
("texte") ;
00059     echo " On pourra consulter le " 
;
00060     echo href
("montresource.php?nomfic=l2xml_6_tp5.php","code-source php de cette page","orange_stim nou")." à titre d'exemple." ;
00061     finp
() ;
00062     
00063     p
("texte") ;
00064     echo "Un rappel sur les fonctions et méthodes 
$PHP pour traiter du $XML se trouve à la page " ;
00065     echo href
("xmlphp.php","xmlphp")."." ;
00066     finp
() ;
00067     
00068     ## -------------------------------------------------------------------------------------------
00069     
00070     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # "Programmation en PHP (1) : lecture"
00071     
00072     ## -------------------------------------------------------------------------------------------
00073     
00074     blockquote
() ;
00075     
00076     p
("texte") ;
00077     echo "Comment fait-on pour lire des fichiers en 
$XML&nbsp;?" ;
00078     finp
() ;
00079     
00080     p
("texte") ;
00081     echo "Essayer par exemple d'afficher, en ligne de commandes, " 
;
00082     echo " pour le fichier "
.href("films2.xml").", " ;
00083     echo " tous les titres de films avec leur numéro, comme ci-dessous&nbsp;:" 
;
00084     finp
() ;
00085     
00086     pre_fichier
("titresEnPhp.txt","cadrejaune") ;
00087     
00088     p
("texte") ;
00089     echo "On pourra utiliser "
.href("http://php.net/manual/fr/simplexml.examples-basic.php","SimpleXML").". " ;
00090     finp
() ;
00091     
00092     solution
($numExo,$numSerie) ;
00093     
00094     p
("texte") ;
00095     echo "Comme le montre "
.href("http://php.net/manual/fr/book.xml.php","la page de manuel de $PHP consacrée à XML").", " ;
00096     echo " on dispose de nombreuses fonctions et de plusieurs modules pour traiter du 
$XML en $PHP. " ;
00097     echo " Avec "
.href("http://php.net/manual/fr/simplexml.examples-basic.php","SimpleXML")." la lecture d'un fichier $XML se fait via la fonction " ;
00098     echo href
("http://php.net/manual/fr/function.simplexml-load-file.php","simplexml_load_file()") ;
00099     echo " et produit un objet de classe 
$XML. Ensuite la méthode " ;
00100     echo href
("http://php.net/manual/fr/simplexmlelement.xpath.php","xpath()") ;
00101     echo " renvoie un tableau d'éléments pour lequel l'itération via "
.href("http://php.net/manual/fr/control-structures.foreach.php","foreach") ;
00102     echo " est possible. Le script demandé se réduit donc, hors commandes d'affichages avec "
.b("echo").", " ;
00103     echo " à une lecture et à une itération." 
;
00104     finp
() ;
00105     
00106     p
() ;
00107     echo b
("Fichier ".href("montresource.php?nomfic=titresL2.php","titresL2.php")) ;
00108     finp
() ;
00109     
00110     pre_fichier
("titresL2.php","cadre") ;
00111     
00112     finsolution
() ;
00113     
00114     finblockquote
() ;
00115     
00116     ## -------------------------------------------------------------------------------------------
00117     
00118     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # "Programmation en PHP (2) : génération"
00119     
00120     ## -------------------------------------------------------------------------------------------
00121     
00122     blockquote
() ;
00123     
00124     p
("texte") ;
00125     echo "Essayez d'écrire le programme 
$PHP correspondant à l'action du formulaire ".href("genere_f.php")." de façon à ce que le navigateur " ;
00126     echo " ouvre le fichier 
$XML résultat dès qu'il est généré. " ;
00127     echo " Ici, on utilisera "
.href("http://php.net/manual/fr/book.dom.php","DOM")."." ;
00128     finp
() ;
00129     
00130     p
("texte") ;
00131     echo "Au passage, quelle serait la &laquo;"
.em("meilleure")."&raquo; structuration du fichier résultat&nbsp;?" ;
00132     finp
() ;
00133     
00134     solution
($numExo,$numSerie) ;
00135     
00136     
00137     p
("texte") ;
00138     echo "Il est certainement \"rassurant\" de commencer par vérifier qu'on est bien capable d'appeler le programme défini " 
;
00139     echo " par l'attribut "
.b("action")." de l'élément ".b("&lt;form ...&gt;").". " ;
00140     echo " Pour cela, on peut se contenter du code suivant&nbsp;:" 
;
00141     finp
() ;
00142     
00143     pre_fichier
("generer1.php","cadrebleu") ;
00144     
00145     p
("texte") ;
00146     echo "Vous pouvez vérifier "
.href("generer1.php","ici")." ce qu'il affiche." ;
00147     finp
() ;
00148     
00149     p
("texte") ;
00150     echo " Pour que le script 
$PHP soit correct, il faut utiliser en début de script le bon " ;
00151     echo href
("http://php.net/manual/fr/function.header.php","header()").". "  ;
00152     echo " Le début du code doit donc ressembler à&nbsp;:" 
;
00153     finp
() ;
00154     
00155     pre_fichier
("generer2.php","cadrebleu") ;
00156     
00157     p
("texte") ;
00158     echo "Vous pouvez voir "
.href("generer2.php","là")." le rendu associé à ce programme ".b("PHP") ;
00159     echo " et constater que le navigateur affiche bien le contenu en "
.b("mode XML")."." ;
00160     finp
() ;
00161     
00162     p
("texte") ;
00163     echo "Le formulaire utilise la méthode "
.b("GET")." donc la gestion des paramètres peut se faire simplement " ;
00164     echo" avec des tests "
.b("if&nbsp;(isset(\$_GET[...").". " ;
00165     finp
() ;
00166     
00167     p
("texte") ;
00168     echo "Si on utilise  "
.href("http://php.net/manual/fr/book.dom.php","DOM").", " ;
00169     echo " les fonctions et méthodes ont des noms déja connus via l'API de 
$Javascript. "  ;
00170     echo " Ainsi, pour créer un élément on utilise " 
;
00171     echo " la méthode "
.href("http://php.net/manual/fr/domdocument.createelement.php","createElement()").", ";
00172     echo " pour ajouter un fils on utilise " 
;
00173     echo " la méthode "
.href("http://php.net/manual/fr/domnode.appendchild.php","appendChild()").", " ;
00174     echo " pour créer ou définir un attribut, on utilise " 
;
00175     echo " la méthode "
.href("http://php.net/manual/fr/domelement.setattribute.php","setAttribute()").". " ;
00176     echo " La création d'un objet 
$XML se fait via " ;
00177     echo href
("http://php.net/manual/fr/domdocument.construct.php","DOMDocument()") ;
00178     echo " et l'affichage par la méthode " 
;
00179     echo href
("http://php.net/manual/fr/domdocument.savexml.php","saveXML()").". " ;
00180     finp
() ;
00181     
00182     p
("texte") ;
00183     echo " Voici donc le code 
$PHP complet nommé ".href("genereXml.php") ;
00184     echo " qui produit le fichier 
$XML en fonction du choix dans le formulaire " ;
00185     finp
() ;
00186     
00187     p
("texte") ;
00188     echo b
("Fichier ".href("montresource.php?nomfic=genereXml.php","genereXml.php")) ;
00189     finp
() ;
00190     
00191     pre_fichier
("genereXml.php","cadre") ;
00192     
00193     p
("texte") ;
00194     echo "Le fichier inclus cité, soit "
.href("montresource.php?nomfic=genereXml-inc2.php","genereXml-inc.php").", " ;
00195     echo " contient juste du code pour le contenu des protéines&nbsp;:" 
;
00196     finp
() ;
00197     
00198     pre_fichier
("genereXml-inc2.php","cadre") ;
00199     
00200     p
("texte") ;
00201     echo "La \"meilleure\" structuration est celle qui met les identifiants et les séquences en éléments, avec " 
;
00202     echo " les classes et les longueurs en attributs, car ces deux dernières informations peuvent sans doute &ecirc;tre  "
;
00203     echo " considérées comme moins importantes. " 
;
00204     echo " Un lien possible avec ces choix, qui utilise la solution programmée précédente est " 
;
00205     echo href
("genereXml.php?i=e&amp;s=e&amp;c=a&amp;l=a","ici").". " ;
00206     finp
() ;
00207     
00208     p
("texte") ;
00209     echo "Une des difficultés pour programmer du "
.b("XML")." en PHP "  ;
00210     echo " qu'il n'est pas possible d'utiliser des \"echo ...\" pour afficher ce qui se passe. " 
;
00211     echo " On passe donc par des commentaires au sens de XML comme " 
;
00212     echo href
("genereXmlCmt.php?i=e&amp;s=e&amp;c=a&amp;l=a","ici").". " ;
00213     echo " Le détail du code source associé est "
.href("montresource.php?nomfic=genereXmlCmt.php","là").". " ;
00214     finp
() ;
00215     
00216     finsolution
() ;
00217     
00218     finblockquote
() ;
00219     
00220     ## -------------------------------------------------------------------------------------------
00221     
00222     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # "Programmation en PHP (3) : recherche"
00223     
00224     ## -------------------------------------------------------------------------------------------
00225     
00226     blockquote
() ;
00227     
00228     p
("texte") ;
00229     echo " On voudrait compter le nombre de prot&eacute;ines du fichier "
.href("leadb880.xml")." et v&eacute;rifier que chaque prot&eacute;ine a bien un attribut ".b("length").". " ;
00230     echo " Ecrire un script 
$PHP qui effectue ce traitement puis qui trouve la plus petite longueur de prot&eacute;ine et la plus grande. " ;
00231     echo " On pourra se contenter d'un script en ligne de commandes. "
;
00232     finp
() ;
00233     
00234     solution
($numExo,$numSerie) ;
00235     
00236     # protminmax.php
00237     p
("texte") ;
00238     echo "Ici, aucune bibliothèque ni module n'est imposé. Dans la mesure où " 
;
00239     echo " "
.href("http://php.net/manual/fr/simplexml.examples-basic.php","SimpleXML")." est simple (!) et suffit ici, on peut se contenter du code suivant&nbsp;: " ;
00240     finp
() ;
00241     
00242     p
() ;
00243     echo b
("Fichier ".href("montresource.php?nomfic=protminmax.php","protminmax.php")) ;
00244     finp
() ;
00245     
00246     pre_fichier
("protminmax.php","cadrebleu") ;
00247     
00248     p
() ;
00249     echo "Voici ce qu'affiche ce script&nbsp;:" 
;
00250     finp
() ;
00251     
00252     pre_fichier
("protminmax.txt","cadre") ;
00253     
00254     p
("texte") ;
00255     echo "On notera les initialisations de longueur minimale et maximale assez \"laxistes\" et on remarquera " 
;
00256     echo " l'utilisation de la fonction " 
;
00257     echo href
("http://php.net/manual/fr/function.intval.php","intval()") ;
00258     echo " pour forcer la longueur à &ecirc;tre un entier, 
$XML ne connaissant que des chaines de caractères pour les valeurs des attributs." ;
00259     finp
() ;
00260     
00261     p
() ;
00262     echo "Les initialisations des longueurs minimales et maximales du programme précédent sont pas très rigoureuses. Il vaut mieux " 
;
00263     echo " utiliser la première longueur vue comme minimum et maximum. Voici donc un code \"plus propre\"&,nsp;:" 
;
00264     finp
() ;
00265     
00266     pre_fichier
("protminmaxv2.php","cadrebleu") ;
00267     finsolution
() ;
00268     
00269     finblockquote
() ;
00270     
00271     ## -------------------------------------------------------------------------------------------
00272     
00273     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # "Programmation en PHP (1) : transformation"
00274     
00275     ## -------------------------------------------------------------------------------------------
00276     
00277     blockquote
() ;
00278     
00279     p
("texte") ;
00280     echo "Ecrire une transformation 
$XSL qui compte les films, les artistes et les metteurs en scène, comme ci-dessous. " ;
00281     echo " On la testera en ligne de commandes. " 
;
00282     finp
() ;
00283     
00284     pre_fichier
("nbfa1_sor.txt","cadre") ;
00285     
00286     p
("texte") ;
00287     echo "Ecrire ensuite une page Web en PHP valide au sens de XHTML 1.0 Strict qui effectue cette transformation sur le serveur." 
;
00288     echo " On affichera le résultat dans un élément de type "
.ghVert("&lt;pre&gt;")." comme " ;
00289     echo href
("nbfa1.php","ici").". " ;
00290     #echo " On pourra utiliser ".href("montresource.php?nomfic=std2web.xsl","std2web.xsl") ;
00291     #echo " à condition d'expliciter quelles ".em("templates")." on utilise. " ;
00292     finp
() ;
00293     
00294     p
("texte") ;
00295     echo " Comment faut-il faire si on veut afficher avec de la couleur et dans des paragraphes comme dans la page " 
;
00296     echo href
("nbfa2.php","nbfa2")."&nbsp;? " ;
00297     finp
() ;
00298     
00299     solution
($numExo,$numSerie) ;
00300     
00301     p
("texte") ;
00302     echo " La solution en ligne de commandes avait déjà été vue la semaine dernière, dans le T.P. précédent. Nous la reproduisons ici, " 
;
00303     echo " avec un encodage en "
.b("ISO8859-15")." explicite car c'est celui de la page Web qui exécute la transformation $XSL." ;
00304     finp
() ;
00305     
00306     pre_fichier
("nbfa1.xsl","cadrebleu") ;
00307     
00308     p
("texte") ;
00309     echo " Si "
.b("xmlstarlet")." est accessible depuis $PHP sur le serveur, on peut se contenter du code suivant pour répondre à la question&nbsp;:" ;
00310     finp
() ;
00311     
00312     pre_fichier
("nbfa1.php","cadre") ;
00313     
00314     p
("texte") ;
00315     echo " De m&ecirc;me si on veut du 
$XHTML dans la sortie de la transformation, il suffit de modifier légèrement la feuille de style, " ;
00316     echo " d'enlever les "
.b("&lt;xsl:text&gt;") ;
00317     echo " et d'ajouter des "
.b("&lt;span&nbsp;class=...&gt;")."&nbsp;:" ;
00318     finp
() ;
00319     
00320     pre_fichier
("nbfa2.xsl","cadrejaune") ;
00321     
00322     p
("texte") ;
00323     echo "Le résultat est visible "
.href("nbfa2.php","ici")."." ;
00324     finp
() ;
00325     
00326     p
("texte") ;
00327     echo " Si par contre "
.b("xmlstarlet")." n'est pas accessible, on peut effectuer la transformation dans $PHP via " ;
00328     echo href
("http://php.net/manual/fr/xsltprocessor.construct.php","XSLTProcessor").", ";
00329     echo href
("http://php.net/manual/fr/xsltprocessor.importstylesheet.php","importStyleSheet()")." et " ;
00330     echo href
("http://php.net/manual/fr/xsltprocessor.transformtoxml.php","transformToXML") ;
00331     echo " comme suit " 
;
00332     finp
() ;
00333     
00334     pre_fichier
("nbfa3.php","cadre") ;
00335     
00336     finsolution
() ;
00337     
00338     finblockquote
() ;
00339     
00340     ## -------------------------------------------------------------------------------------------
00341     
00342     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # "Programmation en Javascript (1) : lecture"
00343     
00344     ## -------------------------------------------------------------------------------------------
00345     
00346     blockquote
() ;
00347     
00348     p
("texte") ;
00349     echo "Comment fait-on pour lire du 
$XML en ".$Javascript."&nbsp;?" ;
00350     echo " Reproduire la sortie de l'exercice 1 via du Javascript externalisé et non intrusif. " 
;
00351     echo " On pourra utiliser la page "
.href("montresource.php?nomfic=nbelt.php","nbelt.php") ;
00352     echo " comme point de départ, l'archive des fichiers à utiliser est "
.href("../std.php.zip","ici").". " ;
00353     finp
() ;
00354     
00355     pre_fichier
("nbelt.php","cadrejaune") ;
00356     
00357     solution
($numExo,$numSerie) ;
00358     
00359     p
("texte") ;
00360     echo "Commençons par ajouter du 
$Javascript à la page. Pour cela, on déclare le fichier ".href("montresource.php?nomfic=nbelt.js","nbelt.js") ;
00361     echo " comme paramètre numéro quatre dans l'appel de la fonction " 
;
00362     echo href
("http://forge.info.univ-angers.fr/~gh/internet/stdphp.php?lafns=debutPage","debutPage()").", ce qui permet d'inclure le code $Javascript dès la partie ".b("&lt;head&gt;")." du document."   ;
00363     echo " Voici donc la nouvelle page Web&nbsp;:" 
;
00364     finp
() ;
00365     
00366     p
() ;
00367     echo b
("Fichier ".href("montresource.php?nomfic=nbeltjs.php","nbeltjs.php")) ;
00368     finp
() ;
00369     
00370     pre_fichier
("nbeltjs.php","cadrebleu") ;
00371     
00372     p
("texte") ;
00373     echo "Pour que le 
$Javascript soit non intrusif, on ne doit pas définir une action à exécuter dès le chargement de la page (évènement ".b("load")."). " ;
00374     echo " Par contre on doit définir un gestionnaire d'évènements et ajouter ce qu'on veut faire à la liste des évènements prévus au chargement. " 
;
00375     echo " Si on convient que l'on veut exécuter une fonction nommée "
.b("films")." alors le début du fichier $Javascript doit ressembler à &nbsp;:" ;
00376     finp
() ;
00377     
00378     pre_fichier
("nbeltjs-debut.txt","cadrejaune") ;
00379     
00380     p
("texte") ;
00381     echo "Il y a deux actions à réaliser dans notre fonction "
.b("films")."&nbsp;: charger le fichier puis évaluer du code $XPATH pour trouver les titres de films. " ;
00382     echo " La première action est très classique si on connait 
$AJAX car on passe par " ;
00383     echo href
("https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest","XMLHttpRequest").". " ;
00384     echo " Pour la seconde, il faut utiliser la méthode " 
;
00385     echo href
("https://developer.mozilla.org/fr/docs/Web/API/Document/evaluate","evaluate")." pour traiter les expressions $XPATH. " ;
00386     echo " Voici le code complet du fichier 
$Javascript nommé " ;
00387     echo href
("montresource.php?nomfic=nbelt.js","nbeltjs").". " ;
00388     finp
() ;
00389     
00390     pre_fichier
("nbelt.js","cadrejaune") ;
00391     
00392     p
("texte") ;
00393     echo "On peut vérifier "
.href("nbeltjs.php","ici")." ce que cela donne." ;
00394     finp
() ;
00395     
00396     h3
("Remarque&nbsp;:") ;
00397     
00398     p
("texte") ;
00399     echo "Si on utilise "
.href("http://learn.jquery.com/","JQUERY")." on peut se passer de $XPATH. A titre d'exemple, on pourra consulter la page " ;
00400     echo href
("nbeltjquery.php") ;
00401     echo" dont le code est ci-dessous&nbsp;:" 
;
00402     finp
() ;
00403     
00404     pre_fichier
("nbeltjquery.php","cadrebleu") ;
00405     
00406     p
("texte") ;
00407     echo " Le code complet du fichier 
$Javascript associé, qui utilise ".href("http://learn.jquery.com/","JQUERY").", nommé " ;
00408     echo href
("montresource.php?nomfic=nbeltjq.js","nbeltjq.js").", ".b("formatté selon nos règles").", est ci-dessous&nbsp;:" ;
00409     finp
() ;
00410     
00411     pre_fichier
("nbeltjq.js","cadrejaune") ;
00412     
00413     finsolution
() ;
00414     
00415     finblockquote
() ;
00416     
00417     ## -------------------------------------------------------------------------------------------
00418     
00419     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # "Programmation en Javascript (2) : génération"
00420     
00421     ## -------------------------------------------------------------------------------------------
00422     
00423     blockquote
() ;
00424     
00425     p
("texte") ;
00426     echo "Essayer de produire, via du 
$Javascript externalisé, le contenu  $XML suivant&nbsp;" ;
00427     finp
() ;
00428     
00429     pre_fichier
("trajets.xml","cadre") ;
00430     
00431     solution
($numExo,$numSerie) ;
00432     
00433     p
("texte") ;
00434     echo "Vous n'&ecirc;tes pas autorisé pour l'instant à lire la solution. " 
;
00435     echo " Le fichier solution sera indiqué pendant le T.P." 
;
00436     finp
() ;
00437     
00438     finsolution
() ;
00439     
00440     finblockquote
() ;
00441     
00442     ###########################################################################################
00443     
00444     p
() ;
00445     echo href
("montresource.php?nomfic=l2xml_6_tp5.php","Code-source php de cette page","orange_stim nou")."." ;
00446     finp
() ;
00447     
00448     finSection
() ;
00449     
00450     if (!isset($_GET
["standalone"])) { finPage() ;  } ;
00451     ?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)