Php, Template Et Http
Total Page:16
File Type:pdf, Size:1020Kb
EPAI, Jérôme Frossard (2016) PHP, TEMPLATE ET HTTP Développer des application Web Notion de template 1 ¨ Un template est modèle de document, c’est-à-dire un document dont la forme est définie, mais dont une partie du contenu est variable. ¨ Pour réaliser les parties variables, on insère dans le texte du document des instructions qui permettront au moteur de template de produire le texte variable. ¨ On utilise généralement des balises telles que <% et %>, pour séparer les instructions que le moteur de template doit interpréter, du texte qu’il doit copier sans changement dans le ou les documents résultants. EPAI, Jérôme Frossard (2016) Notion de moteur de template 2 ¨ Un moteur de templates (template processor) est un programme qui combine un template (modèle) et des données pour produire un ou plusieurs documents. Données ... <html> <body> <h1> Moteur de Documents <?=$titre?> templates résultants </h1> ... Template (patron) ¨ Quelques exemples : ASP.NET, JSP, Apache Velocity EPAI, Jérôme Frossard (2016) PHP, un langage de template ? 3 ¨ Le code PHP peut être intégré dans n’importe quel fichier de texte grâce aux balises PHP (<?php et ?>) ¨ À l’exécution, les balises PHP sont remplacées par le texte affiché par le code. ¨ PHP peut donc être utiliser comme un langage de template et son interpréteur comme un moteur de template. EPAI, Jérôme Frossard (2016) Exemple de template PHP 4 <!DOCTYPE html> <html> Fichier guestbook.php <head> <?php <title>Livre d'or</title> // inclut le fichier autoload.php qui contient <link rel="stylesheet" href="guestbook.css"> // les fonctions nécessaires au chargement des </head> // classes utilisée dans le script. <body> require_once('../library/autoload.php'); <h2>Livre d'or</h2> // appelle la méthode getAllMessages définie <div class="message-list"> // dans la classe MessageDAO et qui renvoie <div class="message-item" id="1"> // un tableau d’objets de type Message. Jean<br> $dao = new \Guestbook\MessageDAO(); Merci pour toutes ces informations! $messages = $dao->getAllMessages(); </div> ?> <div class="message-item" id="2"> Cette portion de code ne Pierre<br> <!DOCTYPE html> produit pas de texte Super site, plein d'informations utiles. <html> </div> <head> Ce retour à la ligne est <div class="message-item" id="3"> <title>LivreCopié dans d’or</title> la sortie standard Grégoire<br> <link rel="stylesheet" href="guestbook.css"> Bof... Rien de bien intéressant </head> </div> <body> Les balises PHP peuvent </div> <h2>Livre d’or</h2> apparaître n'importe où </body> <div class="message-list> </html> <?php foreach ($messages as $message): ?> <div class="message-item" id="<?php echo $message->getId(); ?>"> <?php echo $message->getPseudo(); ?></br> <?php echo $message->getMessage(); ?> </div> Interpréteur <?php endforeach; ?> Pour chaque message, répète la partie du PHP </div> template qui se trouve entre ces deux lignes </body> </html> (ces lignes ne produise pas de texte) EPAI, Jérôme Frossard (2016) Exemple de template JSP 5 <!DOCTYPE html> <html> <head> <title>Livre d'or</title> <link rel="stylesheet" href="guestbook.css"> Fichier guestbook.jsp </head> <%@ page import="database.*" %> <body> <% <h2>Livre d'or</h2> // appelle la fonction getAllMessage définie <div class="message-list"> // dans le class DAO du package database et qui <div class="message-item" id="1"> // renvoie un tableau d’objets de type Message. Jean<br> Collection<Message> messages = DAO.getAllMessages(); Merci pour toutes ces informations! </div> %> <div class="message-item" id="2"> Cette portion de code ne Pierre<br> <!DOCTYPE html> produit pas de texte Super site, plein d'informations utiles. <html> </div> <head> Ce retour à la ligne est <div class="message-item" id="3"> <title>Livrecopié dans d’or</title>la sortie standard Grégoire<br> <link rel="stylesheet" href="guestbook.css"> Bof... Rien de bien intéressant </head> </div> <body> Les balises JSP peuvent </div> <h2>Livre d’or</h2> apparaître n'importe où </body> <div class="message-list> </html> <% for(messages : message) { %> <div class="message-item" id="<% out.print(message.getId());%>"> <% out.print(message.getPseudo());%></br> <% out.print(message.getMessage());%> </div> Servlet <% } %> Pour chaque message, répète la partie du Container </div> template qui se trouve entre ces deux lignes </body> </html> (ces lignes ne produise pas de texte) EPAI, Jérôme Frossard (2016) Remarques 6 ¨ Le jeu de caractères de PHP est l’ASCII mais en dehors des balises et dans les chaînes de caractères, n’importe quel caractère (octet) est transmis tel quel. En conséquence : ¤ l’encodage de la sortie est le même que celui du fichier source. ¤ L’encodage du fichier source est sans importance tant que le jeu de caractères est compatible avec l’ASCII. ¨ Tous les caractères (octets) se trouvant en dehors des balises PHP sont copiés dans la sortie standard, cela inclut les caractères blancs tels que : ¤ espaces, tabulations, retours de chariot (CR), fins de ligne (LF) ¤ les trois octets du BOM au début d’un fichier UTF-8 EPAI, Jérôme Frossard (2016) PHP et HTTP 7 ¨ Le but d’un script côté serveur est fournir une réponse à une requête HTTP reçue par le server HTTP. ¨ Lorsque le serveur HTTP passe un script à l’interpréteur PHP, il passe donc également un certain nombre d’informations concernant la requête à traiter. ¨ Parmi ces informations, les plus utilisées sont : ¤ La méthode : $_SERVER[REQUEST_METHOD] ¤ Les paramètres de l’URL : $_GET ¤ Les données d’un formulaire : $_POST ¤ Les cookies : $_COOKIE EPAI, Jérôme Frossard (2016) Informations pour une requête GET 8 $_SERVER[REQUEST_METHOD] $_SERVER[REQUEST_URI] $_SERVER[SERVER_PROTOCOL] GET /index.php HTTP/1.1 Host: localhost $_SERVER[HTTP_HOST] Connection: keep-alive Accept: text/html,application/xhtml+xml,[…] User-Agent: Mozilla/5.0 (X11; Linux x86_64)[…] Accept-Encoding: gzip,deflate,sdch Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 getallheaders() EPAI, Jérôme Frossard (2016) Informations pour une requête POST 9 $_SERVER[REQUEST_METHOD] $_SERVER[REQUEST_URI] $_SERVER[SERVER_PROTOCOL] POST /editors/customers/71 HTTP/1.1 Host: localhost Connection: keep-alive $_SERVER[HTTP_HOST] Content-Length: 117 Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,[…] Origin: http://localhost User-Agent: Mozilla/5.0 (X11; Linux x86_64)[…] Content-Type: application/x-www-form-urlencoded Referer: http://localhost/~dev/editors/customers/71 Accept-Encoding: gzip,deflate Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 firstname=Th%C3%A9odore&name=Aeby&address=rue+d[…] getallheaders() $_POST EPAI, Jérôme Frossard (2016) PHP et réponse HTTP 10 ¨ Le but d’un script PHP est de produire une réponse HTTP, le document (HTML ou autre) n’en est que le contenu. ¨ L’interpréteur PHP ajoute les en-têtes indispensables à la réponse, mais c’est la responsabilité du script de spécifier son statut ainsi que certains en-têtes, tels que : ¤ Cache-Control ¤ Last-Modified, Expires, ETag ¨ Pour spécifier des en-têtes, on utilise la fonction header. Cette fonction doit être appelée avant d’écrire le premier caractère dans la sortie standard. EPAI, Jérôme Frossard (2016) Template de réponse HTTP 11 Fichier guestbook.php Status: 200 OK Content-Type: text/html <?php Cache-Control: no-cache http_response_code(200); header("Content-Type: text/html"); <!DOCTYPE html> header("Cache-Control: no-cache"); <html> // inclut le fichier autoload.php qui contient <head> // les fonctions nécessaires au chargement des <title>Livre d'or</title> // classes utilisée dans le script. <link rel="stylesheet" href="guestbook.css"> require_once('../library/autoload.php'); </head> // appelle la méthode getAllMessages définie <body> // dans la classe MessageDAO et qui renvoie <h2>Livre d'or</h2> // un tableau d’objets de type Message. <div class="message-list"> $dao = new \Guestbook\MessageDAO(); <div class="message-item" id="1"> $messages = $dao->getAllMessages(); Jean<br> ?> Merci pour toutes ces informations! </div> <!DOCTYPE html> <div class="message-item" id="2"> <html> Pierre<br> <head> Super site, plein d'informations utiles. <title>Livre d’or</title> </div> <link rel="stylesheet" href="guestbook.css"> </div> </head> </body> <body> </html> <h2>Livre d’or</h2> <div class="message-list"> <?php foreach ($messages as $message): ?> <div class="message-item" id="<?php echo $message->getId(); ?>"> <?php echo $message->getPseudo(); ?></br> <?php echo $message->getMessage(); ?> Interpréteur </div> <?php endforeach; ?> PHP </div> </body> </html> EPAI, Jérôme Frossard (2016) Séparer PHP et HTML 12 ¨ Dans les exemples précédent, le code PHP et le code HTML sont mélangé dans le même fichier. Bien que cela soit du code valide, ce n’est pas une bonne pratique pour au moins trois raisons : ¤ Les code HTML sont souvent réalisés par des spécialistes du design (souvent non-programmeurs). ¤ D’une manière générale, on cherche à éviter l’utilisation de plusieurs langage dans un même fichier source. ¤ Le mécanisme d’inclusion (transculsion) permet de facilement séparer le code PHP et le code HTML. EPAI, Jérôme Frossard (2016) Template HTML en PHP 13 ¨ Un template HTML devrait avoir une extension .phtml et ne devrait contenir que du code HTML et le sous-ensemble de PHP suivant : ¤ Affichage d’une expression n <?=expression?> <?=$variable?> ou <?=$objet->getMembre()?> ¤ Structures de contrôle avec la syntaxe alternative n <?php foreach ($list as $element): ?> … <?php endforeach; ?> n <?php while ($expression): ?> … <?php endwhile; ?> n <?php if ($expression): ?> … <?php endif; ?> ¨ On utilise l’instruction