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 = 5 ;
00022
00023 if (!isset($_GET["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00024
00025 debutSection() ;
00026 h1("$XML en L2, université d'Angers ") ;
00027 h2(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00028 pvide() ;
00029 h2(s_span("T.P. numéro $numSerie","gbleu")." : Programmation") ;
00030 pvide() ;
00031
00032 ###########################################################################################
00033
00034 $tableauDesRubriques = array() ;
00035 $idr = 0 ;
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 = 0 ;
00048 $numSerie = 5 ;
00049 direAfficherSolutions($numSerie) ;
00050 pvide() ;
00051
00052 p("texte") ;
00053 echo b("Attention :")." tout code $PHP qui doit produire du $XHTML doit ê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("<")." ou ".ghvert(">").". ";
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 ?" ;
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 :" ;
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 «".em("meilleure")."» structuration du fichier résultat ?" ;
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("<form ...>").". " ;
00140 echo " Pour cela, on peut se contenter du code suivant :" ;
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 à :" ;
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 (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 :" ;
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 ê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&s=e&c=a&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&s=e&c=a&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éines du fichier ".href("leadb880.xml")." et vérifier que chaque proté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é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 : " ;
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 :" ;
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 à ê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("<pre>")." 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")." ? " ;
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 :" ;
00310 finp() ;
00311
00312 pre_fichier("nbfa1.php","cadre") ;
00313
00314 p("texte") ;
00315 echo " De mê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("<xsl:text>") ;
00317 echo " et d'ajouter des ".b("<span class=...>")." :" ;
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." ?" ;
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("<head>")." du document." ;
00363 echo " Voici donc la nouvelle page Web :" ;
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 à :" ;
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")." : 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 :") ;
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 :" ;
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 :" ;
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 " ;
00427 finp() ;
00428
00429 pre_fichier("trajets.xml","cadre") ;
00430
00431 solution($numExo,$numSerie) ;
00432
00433 p("texte") ;
00434 echo "Vous n'ê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 à la page principale de (gH)