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 :-)