Académique Documents
Professionnel Documents
Culture Documents
FAYCEL EL AYEB
dans la première partie, nous avons créer le projet et défini
nos routes. Dans cette partie, nous allons définir les
différentes vues pour chacune des routes que nous avons
créées dans la partie précédente.
Le moteur de template Twig
<?php
//...
class BlogController extends AbstractController {
public function index()
{
return $this->render('blog/index.html.twig');
}
//...
}
La page d'accueil rendu avec Twig:
Quand on actualise la page d'accueil de notre site, nous devons
maintenant avoir ceci:
BlogController.php, la méthode show():
Ce que nous allons faire maintenant c'est de créer les autres vues de
notre site. On va créer la vue pour l'affichage d'un article.
Première des choses à faire, créer le contrôleur. Mais nous avons déjà
notre contrôleur et c'est la méthode show() dans
src/Controller/BlogController.php, ce que nous allons donc faire c'est de
dire à notre contrôleur de retourner une vue (une page, un fichier) twig
en lieu et place de l'objet Response que nous avons actuellement. Notre
méthode va donc ressembler à ça :
public function show($url)
{
return $this->render('blog/show.html.twig', [
'slug' => $url
]);
}
BlogController.php, la méthode show():
C'est juste ce qu'il y a devant le return que nous avons changer, nous lui
disons de retourner le fichier blog/show.html.twig, et en plus nous
envoyons un deuxième paramètre à la fonction render(), un tableau qui
contient les variables que nous envoyons à notre page et que nous
pourrons afficher. Si on récupère par exemple un utilisateur avec notre
contrôleur, nous devons l'envoyer à notre vue pour pouvoir afficher son
nom, email, ...
Ce tableau n'a donc rien de magique, c'est du PHP, la clé (slug) c'est le
nom de la variable que nous utiliserons sur la vue, et la valeur ($url) c'est la
variable que l'on enregistre pour l'afficher sur la vue. Ce tableau peut
contenir n'importe quel type de données, objet, nombres, booléen, ...
C'est un tableau comme on a l'habitude de le voir en PHP.
Création de Vue show.html.twig:
Maintenant que nous avons notre contrôleur, nous allons donc créer notre
vue, le fichier templates/blog/show.html.twig, voici son contenu
<h1>Affichage de l'article {{ slug }}</h1>
Voilà, ce qu’on a sur le lien http://127.0.0.1:8000/show/un-super-article:
Création de Vue show.html.twig:
Sur la vue, je n'ai pas utiliser $url mais plutôt {{ slug }}, la clé que nous
avions défini dans le tableau au niveau du contrôleur.
Et là vous pouvez voir l’intérêt du Twig, nous avons juste du HTML, pas
besoin de balise PHP pour les variables. En PHP on aurait écrit:
add.html.twig
edit.html.twig
Si vous regardez bien, nos pages ont quelque chose en commun, c'est la
barre de navigation, en tant normal c'est soit on la recrée sur toutes le
pages en HTML ou on utilise PHP avec la fonction require(), mais nous,
nous n'allons faire rien de ceux là.
{% block stylesheets %}
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.
min.css">
{% endblock %}
</head>
Templates/base.html.twig (suite):
<body>
<nav>
<div class="nav-wrapper">
<div class="container">
<a href="#" class="brand-logo">Symfony Blog</a>
<ul id="nav-mobile" class="right hide-on-med-and-down">
<li><a href="#">Home</a></li>
<li><a href="#">Login</a></li>
</ul>
</div></div></nav>
{% block content %} {% endblock %}
{% block scripts %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
{% endblock %}
</body>
</html>
Templates/base.html.twig (suite):
Ce fichier défini le template de base de toutes les pages de notre site, toutes nos
pages devront donc hériter de ce fichier. Nous définissons ici 4 blocs (block) à
savoir title, stylesheets, content et scripts.
Les blocs vont nous servir à quoi au juste? A pouvoir les remplacer dans les
templates enfants, dites vous que ce sont les méthodes publics d'une classe.
Tout le contenu qui ne se trouve pas dans un bloc est une méthode privé, on ne
peut donc pas le modifier dans les templates enfants, ce qui veut donc dire
qu'on ne peut pas modifier la barre de navigation dans les templates enfants.
Maintenant pour pouvoir voir les modifications, nous allons faire hériter notre
page d'accueil (index.html.twig) de ce template
{% extends "base.html.twig" %}
On utilise extends comme en PHP aussi. Nous mettons juste le nom du fichier, le
chemin de base pour tout les templates c'est le dossier templates, le fichier
base.html.twig se trouve directement dans ce dossier, pas dans un sous dossier,
donc on ne spécifie aucun chemin ici. Si on actualise la page d'accueil on
obtient:
Templates/base.html.twig (suite):
Templates/base.html.twig (suite):
Nous avons bien la barre de navigation, avec le style par défaut de
materialize. Une autre chose, tout en bas nous avons la debug bar de
Symfony, cette barre est créer par Symfony et reste afficher quand nous
sommes en mode développement, nous pouvons voir la bas la route sur la
quelle on est, les requêtes qui sont faites a la BDD, le temps de
chargement de la page, ...
{% block stylesheets %}
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.
min.css">
<link rel="stylesheet" type="text/css" href="{{ asset('assets/css/blog.css') }}">
{% endblock %}
{% block content %}
<div class="container">
<div class="row">
<div class="col s12 m12 l12">
<h1>Hello, c'est la page d'accueil</h1>
</div>
</div>
</div>
{% endblock %}
On écrit dans le bloc content, si nous essayons d’écrire en dehors de ce bloc, on
a une erreur qui dit qu'un template qui hérite d'un autre ne peut pas définir du
contenu en dehors des blocs défini par le template parent.
index.html.twig :
Si vous définissez un autre bloc, en dehors du bloc content, le contenu de ce
dernier ne sera pas afficher sur cette page.
Mais rien ne vous interdit de le définir à l’intérieur du bloc content:
{% block content %}
<div class="container">
<div class="row">
<div class="col s12 m12 l12">
<h1>Hello, c'est la page d'accueil</h1>
</div>
<div class="col s12 m12 l12">
{% block another_block %}
<h2>Ce contenu sera afficher</h2>
{% endblock %}
</div></div></div>
{% endblock %}
index.html.twig :
Dans notre cas, nous allons écrire le code du formulaire pour l’édition
et la modification d'un article dans
templates/includes/article_form.html.twig
article_form.html.twig
{# templates/includes/article_form.html.twig #}
<form class="row">
<div class="input-field col s12 m12 l12">
<input type="file" name="">
</div>
<div class="input-field col s12 m6 l6">
<input type="text" name="" placeholder="Titre de l'article">
</div>
<div class="input-field col s12 m6 l6">
<input type="text" name="" placeholder="Catégories (php, html, css)">
</div>
<div class="input-field col s12 m12 l12">
<textarea class="materialize-textarea" placeholder="Contenu de
l'article"></textarea>
</div>
article_form.html.twig (Suite)
<div class="input-field col s12 m12 l12">
<p>
<label>
<input type="checkbox" class="filled-in" />
<span>Publier</span>
</label>
</p>
</div>
<div class="input-field col s12 m12 l12">
<input type="submit" name="" value="Enregistrer" class="btn btn-
primary btn-large">
</div>
</form>
edit.html.twig:
Nous avons juste le formulaire et nous allons l'inclure dans nos vue edit.html.twig
et add.html.twig comme suit.
{# templates/blog/edit.html.twig #}
{% extends "base.html.twig" %}
{% block title %}Modifier{% endblock %}
{% block content %}
<div class="container">
<div class="row">
<div class="col s12 m12 l12">
<h4>Modifier l'article {{ slug }}</h4>
</div>
</div>
{% include "includes/article_form.html.twig" %}
</div>
{% endblock %}
add.html.twig:
{# templates/blog/add.html.twig #}
{% extends "base.html.twig" %}
{% block content %}
<div class="container">
<div class="row">
<div class="col s12 m12 l12">
<h4>Ajout d'un article</h4>
</div>
</div>
{% include "includes/article_form.html.twig" %}
</div>
{% endblock %}
index.html.twig:
{# templates/blog/index.html.twig #}
{% extends "base.html.twig" %}
{% block title %}Accueil | {{ parent() }}{% endblock %}
{% block content %}
<div class="container"><div class="row">
<div class="col s12 m7 l9">
<div class="article-card image-card" style="background:
url('https://images.pexels.com/photos/276452/pexels-photo-
276452.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260');">
<h2><a href="">Another Title</a></h2>
<span class="date">14/01/2019</span>
</div></div>
<div class="col s12 m5 l3"><div class="row"><div class="col s12 m12 l12">
<div class="article-card image-card" style="background:
url('https://images.pexels.com/photos/276452/pexels-photo-
276452.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260');">
<h2><a href="">Another Title</a></h2>
<span class="date">14/01/2019</span>
</div></div></div></div></div></div>
index.html.twig (Suite):
<div class="container">
<div class="row">
<div class="col s12 m4 l3">
<div class="article-card">
<img src="https://images.pexels.com/photos/276452/pexels-photo-
276452.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260" class="responsive-img">
<h2><a href="">Another Title</a></h2>
<span class="date">14/01/2019</span>
</div></div>
<div class="col s12 m4 l3">
<div class="article-card">
<img src="https://images.pexels.com/photos/276452/pexels-photo-
276452.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260" class="responsive-img">
<h2><a href="">Another Title</a></h2>
<span class="date">14/01/2019</span>
</div></div></div></div>
{% endblock %}
show.html.twig:
{# templates/blog/show.html.twig #}
{% extends "base.html.twig" %}
{% block content %}
<article class="container">
<div class="row">
<div class="col s12 m12 l8 offset-l2">
<h2>{{ slug }}</h2>
<span>14/01/2019</span>
<p>
<img src="https://images.pexels.com/photos/276452/pexels-photo-
276452.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260" class="responsive-img">
</p>
<span class="categories">php, html, css</span>
</div>
</div>
show.html.twig (Suite):
<div class="row">
<div class="col s12 m12 l8 offset-l2">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
…
</p>
</div>
</article>
{% endblock %}
Nous avons maintenant nos vues. La prochaine fois nous
verrons comment ajouter, lire, modifier et supprimer un
article.