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