Objectifs de cette séance :
GET (+ URL)Ressource Web : objet d’une requête
Exemple : page, document vidéo, formulaire, …
Important pour raisonement (Web sémantique). Hors sujet pour l’instant.
La vue représente un état d’une application interactive, pour l’utilisateur
Patron de conception M V C (Modèle, Vues, Contrôleur)
Modèle déjà vu avec Doctrine. Controleur déjà vu pour programmation événementielle.
Page Web = représentation d’une vue de l’application (affichable dans un navigateur)
Visualisation d’une page (ressourceà contenant différentes ressources
Hypertexte : proviennent pas toutes du même serveur HTTP (requêtes supplémentaires)
Dans ce cours, principalement 1ère option (application Web « classique »)
HyperText Markup Language
Arbre sections, sous-section (plan document textuel), visible :
<body>
<h1>...</h1>
<h2>...</h2>
<p>...</p><h1>...</h1></body>mise en forme « par défaut » par navigateur
<div>...</div><span>...</span><article><aside><details><figcaption><figure><footer><header><main><mark><nav><section><summary><time>| <header> | |
| <nav> | |
| <aside> | <section> |
| <article> | |
| <footer> | |
Listes à puces :
<ul>
<li> ... </li>
<li> ... </li>
</ul>
Lien vers une autre ressource :
<a href="/todo/42">Coder en HTML</a>
Soumission de données pour les applications : génère des requêtes HTTP vers des ressources.
-> séances suivantes
Examiner le code source dans le navigateur
Ctrl U !
« affichage » d’HTML sur la sortie standard du programme
echo "<html>...</html>";
ou
print("<html>...</html>");
En couture :
Résultat souhaité (liste à puces) :
<!DOCTYPE html>
<html>
<head>
<title>Ma page</title>
</head>
<body>
<ul id="navigation">
<li><a href="/todo/">Tâches</a></li>
<li><a href="/tag/">Étiquettes</a></li>
<li><a href="/project/">Projets</a></li>
</ul>
<h1>Ma page</h1>
Salut le monde
</body>
</html>
Motif à répéter : élément de liste à puce (<li>) contenant une balise
de lien (<a href="...">...</a>)
Données : couple [href, caption]
<li>
<a href="{{ href }}">
{{ caption }}
</a>
</li>
Tableau de couples [href, caption]
array(
array('href' => "/todo/", 'caption' => "Tâches"),
array('href' => "/tag/", 'caption' => "Étiquettes"),
array('href' => "/project/", 'caption' => "Projets")
);
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<ul id="navigation">
{% for item in navigation %}
<li><a href="{{ item.href }}">{{ item.caption }}</a></li>
{% endfor %}
</ul>
<h1>{{ title }}</h1>
{{ content }}
</body>
</html>
array(
'title' => "Ma page",
'navigation' => array(
array('href' => "/todo/", 'caption' => "Tâches"),
array('href' => "/tag/", 'caption' => "Étiquettes"),
array('href' => "/project/", 'caption' => "Projets")
),
'content' => "Salut le monde"
);
<!DOCTYPE html>
<html>
<head>
<title>Ma page</title>
</head>
<body>
<ul id="navigation">
<li><a href="/todo/">Tâches</a></li>
<li><a href="/tag/">Étiquettes</a></li>
<li><a href="/project/">Projets</a></li>
</ul>
<h1>Ma page</h1>
Salut le monde
</body>
</html>
HTML nettoyé et valide (ça peut aider)
{{ var }}{% ... %}
for i in,if / endif,block{# ... #}
(différent de <!-- ... --> : commentaire HTML)<?php
require_once("../lib/Twig/Autoloader.php" );
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem('../templates/');
$twig = new Twig_Environment($loader);
$data = array('title' => "Ma page"
'navigation' => array(
array('href' => "/todo/", 'caption' => "Tâches"),
array('href' => "/tag/", 'caption' => "Étiquettes"),
array('href' => "/project/", 'caption' => "Projets")
),
'content' => "Salut le monde");
echo $twig->render('home.html.twig', $data);
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
Le block Twig body, vide, est là pour être surchargé.
Surcharge : le contenu du bloc body de la page spécialisée index.html.twig se
substitue à celui du gabarit de base.
On peut faire valider l’expérience utilisateur avant de tout coder :
Twig s’interface avec le modèle Doctrine => moins de code à écrire en PHP \o/
Inconvénient : pas mal de syntaxes différentes
dump()En PHP :
$var = [
'a simple string' => "in an array of 5 elements",
'a float' => 1.0,
'an integer' => 1,
'a boolean' => true,
'an empty array' => [],
];
dump($var);
En Twig :
{% dump var %}
Exemple :
{% dump todos %}
{% for todo in todos %}
{% dump todo %}
<a href="/todo/{{ todo.id }}">{{ todo.title }}</a>
{% endfor %}
Le Rendering Call Graph nous indique quels blocs Twig sont surchargés
[X] HTTP (GET)[X] PHP[X] Doctrine[X] Routeur Symfony[X] HTML[X] TwigTout ce qu’il faut pour un site Web dynamique en lecture seule :-)