Cours Symfony Twig
Cours Symfony Twig
Cours Symfony Twig
Achref El Mouelhi
1 Introduction
2 Commentaire
3 Interpolation
4 Déclaration de variable
6 Structure conditionnelle
7 Structure itérative
8 Filtre
10 Lien hypertexte
11 Variables globales
12 Inclusion
13 Block et héritage
14 Bonnes pratiques
Symfony
Twig
Apparu en 2009.
H I ©
EL
Syntaxe inspirée par Jinja (moteur de template du framework Django de Python).
©A
Symfony
Twig
Apparu en 2009.
H I ©
EL
Syntaxe inspirée par Jinja (moteur de template du framework Django de Python).
©A
Remarque
Symfony
Twig, Pourquoi ?
Symfony
Twig, Pourquoi ?
Symfony
Symfony
c h
{{ ... }} : pour afficher
©A
Symfony
Avant de commencer, considérons le contenu suivant pour le contrôleur HomeController
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
H I ©
U EL
class HomeController extends AbstractController
O
LM
{
/**
r e f E
* @Route("/home", name="home_route")
*/
ch
{ ©A
public function index(): Response
return $this->render(’home/index.html.twig’, [
’controller_name’ => ’HomeController’,
]);
}
}
Symfony
</div>
{% endblock %}
Symfony
{# commentaire #} H I ©
UEL
n’affiche rien et ne fait rien. O
f E LM
ch r e
s’utilise en mono-ligne et multi-lignes.
©A
Symfony
{{ var }}
H I ©
UEL
O
permet de récupérer et afficher la valeur d’une variable var
envoyée par le contrôleur
f E LM
ch r e
est l’équivalent de <?php echo $var; ?>
©A
Symfony
Symfony
Symfony
Exercice
H I ©
Créez un contrôleur TwigController
UEL
O
f E LM
La route de ce contrôleur doit permettre de récupérer deux
ch r e
paramètres de requête nom et prenom et les envoyer à la vue
©A
La vue affiche les valeurs envoyées par le contrôleur
Symfony
{{ tableau[’idColonne’] }}
H I ©
EL
OU
affiche le contenu d’un élément du tableau
M
L $tableau[’idColonne’];
est l’équivalent de <?phpEecho
f
?>
chr e
© A
Symfony
Exemple : contenu de la méthode index de HomeController
$tab = [2, 3, 8];
return $this->render(’home/index.html.twig’, [
’controller_name’ => ’HomeController’,
’tableau’ => $tab
]);
H I ©
UEL
O
f E LM
ch r e
©A
Symfony
Exemple : contenu de la méthode index de HomeController
$tab = [2, 3, 8];
return $this->render(’home/index.html.twig’, [
’controller_name’ => ’HomeController’,
’tableau’ => $tab
]);
H I ©
UEL
O
LM
Pour afficher le tableau dans index.html.twig : trois écritures correctes
<ul>
r e f E
ch
<li>
©A
{{ tableau[0] }}
</li>
<li>
{{ tableau[’1’] }}
</li>
<li>
{{ tableau["2"] }}
</li>
</ul>
{{ objet.attribut }}
H I ©
U EL
O
f E LM
ch r e
©A
{{ objet.attribut }}
Réellement {{ objet.attribut }}
H I ©
U
affiche $objet[’attribut’] si $objet est un tableau. EL
O
f E LM
affiche $objet->attribut si $objet est un objet et $attribut est public.
ch r e
affiche $objet->attribut() si $objet est un objet et attribut() est une méthode
©A
public.
namespace App\Entity;
class Personne
{
private $id;
private $nom;
private $prenom;
public function getId(): ?int
{
©
return $this->id;
}
H I
EL
public function setId(int $id): void
{
}
$this->id = $id;
O U
LM
public function getNom(): ?string
{
return $this->nom;
r e f E
ch
}
public function setNom(string $nom): void
©A
{
$this->nom = $nom;
}
public function getPrenom(): ?string
{
return $this->prenom;
}
public function setPrenom(string $prenom): void
{
$this->prenom = $prenom;
}
}
Symfony
Pour afficher les attributs de l’objet Personne dans la vue
<ul>
<li>
{{ personne.id }}
H I ©
EL
</li>
<li> M OU
f E L
{{ personne.nom() }}
</li>
ch r e
© A
<li>
{{ personne.getPrenom() }}
</li>
</ul>
Symfony
f E LM
ch r e
©A
Symfony
f E LM
ch r e
©A
Exemple de concaténation
<p>
{{ personne.prenom ˜ " " ˜ personne.nom }}
</p>
Symfony
H I ©
Pour le débogage, vous pouvez utiliser la fonction dump dans les
pages Twig
UEL
<p>
L MO
r e f E
{{ dump(personne) }}
</p>
A ch
©
Symfony
Utilisez le mot-clé set pour déclarer une variable str dans un bloc {% ... %}
{% set str = ’bonjour’ %}
H I ©
UEL
O
f E LM
ch r e
©A
Symfony
Utilisez le mot-clé set pour déclarer une variable str dans un bloc {% ... %}
{% set str = ’bonjour’ %}
L’équivalent PHP
H I ©
<?php
UEL
$str = ’bonjour’;
O
?>
f E LM
ch r e
©A
Symfony
Utilisez le mot-clé set pour déclarer une variable str dans un bloc {% ... %}
{% set str = ’bonjour’ %}
L’équivalent PHP
H I ©
<?php
UEL
$str = ’bonjour’;
O
?>
f E LM
ch r e
©A
Pour afficher la variable str
{{ str }}
Symfony
Utilisez le mot-clé set pour déclarer une variable str dans un bloc {% ... %}
{% set str = ’bonjour’ %}
L’équivalent PHP
H I ©
<?php
UEL
$str = ’bonjour’;
O
?>
f E LM
ch r e
©A
Pour afficher la variable str
{{ str }}
Symfony
On peut utiliser le mot-clé with pour donner une portée locale à une variable
{% with %}
{% set x = 2 %}
{{ x }}
{# affiche 2 #}
H I ©
EL
{% endwith %}
O U
f E LM
ch r e
©A
Symfony
On peut utiliser le mot-clé with pour donner une portée locale à une variable
{% with %}
{% set x = 2 %}
{{ x }}
{# affiche 2 #}
H I ©
EL
{% endwith %}
O U
f E LM
Une deuxième écriture sans set
ch r e
©A
{% with %}
{% set x = 2 %}
{{ x }}
{# affiche 2 #}
{% endwith %}
{{ x }}
{# Variable "x" does not exist. #}
Symfony
Symfony
Dans un bloc with, par défaut, on a accès aux variables définies dans le contexte global
{% set y = 5 %}
{% with { x: 2 } %}
{{ x }} {{ y }}
{# affiche 2 5 #}
{% endwith %}
H I ©
{# la variable x n’est plus visible ici #}
UEL
O
f E LM
ch r e
©A
Symfony
Dans un bloc with, par défaut, on a accès aux variables définies dans le contexte global
{% set y = 5 %}
{% with { x: 2 } %}
{{ x }} {{ y }}
{# affiche 2 5 #}
{% endwith %}
H I ©
{# la variable x n’est plus visible ici #}
UEL
O
f E LM
ch
Une deuxième écriture sans set r e
{% set y = 5 %} ©A
{% with { x: 2 } only %}
{{ x }}
{# affiche 2 et la variable y n’est plus accessible #}
{% endwith %}
Symfony
Symfony
Autres opérations
Symfony
Exemple avec in
{{ 8 in tableau }}
{# affiche 1 #}
H I ©
UEL
O
f E LM
ch r e
©A
Symfony
Exemple avec in
{{ 8 in tableau }}
{# affiche 1 #}
H I ©
Exemple avec not in UEL
O
{{ 1 not in tableau }}
f E LM
{# affiche 1 #}
ch r e
©A
Symfony
Exemple avec in
{{ 8 in tableau }}
{# affiche 1 #}
H I ©
Exemple avec not in UEL
O
{{ 1 not in tableau }}
f E LM
{# affiche 1 #}
ch r e
©A
Exemple avec starts with
{{ personne.prenom starts with ’j’ }}
{# affiche 1 #}
Symfony
Symfony
Symfony
Symfony
Symfony
Symfony
Symfony
Symfony
Symfony
Symfony
Symfony
O U
f E LM
ch r e
©A
Symfony
O U
f E LM
Le résultat
ch r e
0
1
©A
2
3
Symfony
O U
f E LM
ch r e
©A
Symfony
O U
f E LM
Le résultat
ch r e
0
1
©A
2
3
Symfony
O U
f E LM
ch r e
©A
Symfony
O U
f E LM
Le résultat
ch r e
0
2
©A
4
6
Symfony
On peut utiliser l’opérateur .. pour définir un intervalle de
caractères
{% for i in ’a’..’f’ %}
{{ i }} <br>
{% endfor %}
H I ©
UEL
O
f E LM
ch r e
©A
Symfony
On peut utiliser l’opérateur .. pour définir un intervalle de
caractères
{% for i in ’a’..’f’ %}
{{ i }} <br>
{% endfor %}
H I ©
UEL
O
f E LM
Le résultat
ch r e
a
b ©A
c
d
e
f
Symfony
Ou aussi
{% for i in range(’a’,’f’) %}
{{ i }} <br>
{% endfor %}
H I ©
UEL
O
f E LM
ch r e
©A
Symfony
Ou aussi
{% for i in range(’a’,’f’) %}
{{ i }} <br>
{% endfor %}
H I ©
UEL
O
Le résultat
f E LM
a ch r e
b
c
©A
d
e
f
Symfony
Symfony
Symfony
Symfony
Exemple
{% for valeur in tableau %}
{{ loop.index0 }} : {{
H ©
valeur }}
I
EL
<br>
{% endfor %}
O U
f E LM
ch r e
©A
Symfony
Exemple
{% for valeur in tableau %}
{{ loop.index0 }} : {{
H ©
valeur }}
I
EL
<br>
{% endfor %}
O U
f E LM
ch r e
©A
Le résultat
0 : 2
1 : 3
2 : 8
Symfony
Filtre
Symfony
Quelques exemples
upper : convertit les lettres en majuscules comme strtupper()
en PHP (lower est la réciproque)
H I ©
EL
length : calcule le nombre d’éléments d’un tableau ou le nombre
de caractères d’une chaı̂ne
M OU
f E
sort : trie les éléments d’unLtableau
e
chlesr caractères spéciaux indiqués du début et de
A
trim : supprime
© chaı̂ne de caractères
la fin d’une
striptags : supprime les balisesHTML
...
symfony
Exemples avec les chaı̂nes de caractères
{{ personne.prenom | length }}
{# affiche 4 #}
{{ ’ john wick!
{# affiche 10 #}
’ | trim | length }}
H I ©
U EL
{{ ’ john wick!’ | trim(’!’) | length }}
O
{# affiche 11 #}
f E LM
{{ ’ john wick!
ch r e
’ | trim(side=’left’) | length }}
{# affiche 12 #}
©A
{{ ’ john wick! ’ | trim(’ ’, ’right’) | length }}
{# affiche 12 #}
symfony
symfony
symfony
symfony
symfony
symfony
Exemples avec les tableaux (reduce)
H I ©
UEL
O
f E LM
ch r e
©A
symfony
Exemples avec les tableaux (reduce)
H I ©
reduce accepte aussi une valeur initiale
UEL
O
f E LM
{{ tableau | reduce((somme, valeur) => somme + valeur, 5) }}
{# affiche 18 #}
ch r e
©A
symfony
Exemples avec les tableaux (reduce)
H I ©
reduce accepte aussi une valeur initiale
UEL
O
f E LM
{{ tableau | reduce((somme, valeur) => somme + valeur, 5) }}
{# affiche 18 #}
ch r e
© A
Exemple avec map et reduce
Symfony
Remarques
I ©
Par défaut, Twig protège les variables en appliquant un filtre pour
H
les protéger de balises HTML
U EL
O
f E
Par exemple {{ variable | raw }}LM
Pour désactiver le filtre, on peut utiliser le filtre raw
r e
chde caractères non-définies dans une variable, on
utilise e©
A
Pour les chaı̂nes
pour échapper les balises HTML
Par exemple {{ ’texte <br>’ | e }}
symfony
{{ chaine | raw }}
{# affiche bonjour #}
Symfony
Symfony
Symfony
Caractéristiques
H I ©
EL
Il permet donc de référencer des fichiers de ressource (CSS, JavaScript,
U
images ...) définis dans public
O
f E LM
ch r e
©A
Symfony
Caractéristiques
H I ©
EL
Il permet donc de référencer des fichiers de ressource (CSS, JavaScript,
U
images ...) définis dans public
O
f E LM
ch r e
Exemples
© A
<link href="{{ asset(’css/style.css’) }}" rel="stylesheet" />
<script src="{{ asset(’js/jquery-1.11.3.js’) }}"></script>
<script src="{{ asset(’js/bootstrap.js’) }}"></script>
<script src="{{ asset(’js/script.js’) }}"></script>
Symfony
path et url
H I ©
EL
url génère une URL absolue.
O U
f E LM
ch r e
©A
Symfony
path et url
H I ©
EL
url génère une URL absolue.
O U
f E LM
Exemple
ch r e
<a href="{{©
A
<a href="{{ path(’vehicule_route’) }}">Véhicule</a>
url(’vehicule_route’) }}">Véhicule</a>
Symfony
path et url
H I ©
EL
url génère une URL absolue.
O U
f E LM
Exemple
ch r e
<a href="{{©
A
<a href="{{ path(’vehicule_route’) }}">Véhicule</a>
url(’vehicule_route’) }}">Véhicule</a>
Symfony
©A
Symfony
ch
app.environment r e: l’environnement courant dev ou prod
© A
Symfony
ch
app.environment r e: l’environnement courant dev ou prod
© A
Exemple
{% set id = app.request.get(’personne’).nom %}
Symfony
Symfony
H I ©
UEL
O
f E LM
ch r e
©A
Symfony
H I ©
U
Inclusion avec ignorance d’erreur si page EL
inexistante
L MO
re f E
{% include ’page.twig’ ignore missing %}
c h
©A
Symfony
H I ©
U
Inclusion avec ignorance d’erreur si page EL
inexistante
L MO
re f E
{% include ’page.twig’ ignore missing %}
A c h
©
Inclusion conditionnelle
{% include condition ? ’_menu-admin.twig’ : ’_menu-
user.twig’ ignore missing %}}
Symfony
Pour inclure le menu, on peut créer une méthode dans HomeController et lui
associer une route
/**
* @Route("/menu", name="menu_route")
*/
H I ©
EL
public function menu()
{
O U
LM
return $this->render(’shared/_menu.twig’, []);
}
r e f E
ch
©A
Symfony
Pour inclure le menu, on peut créer une méthode dans HomeController et lui
associer une route
/**
* @Route("/menu", name="menu_route")
*/
H I ©
EL
public function menu()
{
O U
LM
return $this->render(’shared/_menu.twig’, []);
}
r e f E
ch
©A
Pour exécuter cette méthode dans la vue, on utilise la fonction render
{{ render("menu") }}
Symfony
Pour inclure le menu, on peut créer une méthode dans HomeController et lui
associer une route
/**
* @Route("/menu", name="menu_route")
*/
H I ©
EL
public function menu()
{
O U
LM
return $this->render(’shared/_menu.twig’, []);
}
r e f E
ch
©A
Pour exécuter cette méthode dans la vue, on utilise la fonction render
{{ render("menu") }}
Symfony
Symfony
Le fichier base.html.twig situé dans templates
{# base.html.twig #}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
H I ©
<title>
UEL
{% block title %}Welcome!{% endblock %}
O
</title>
f E LM
ch r e
{% block stylesheets %}{% endblock %}
<link href="{{ asset(’css/style.css’) }}" rel="stylesheet"/
>
</head> ©A
<body>
{% block body %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html>
Symfony
{% block title %}
H I ©
Home
UEL
O
{# ce contenu sera inséré dans le bloc title de base.
html.twig #}
{% endblock %}
f E LM
h r e
%}c
{% block body A
© précédent #}
{# contenu
{# ce contenu sera inséré dans le bloc body de base.
html.twig #}
{% endblock %}
Symfony
Remarques
H I ©
EL
L’héritage sert à créer un template parent (avec un ou plusieurs blocks) qui contient le
U
design de base de notre site pour que les templates enfants puissent l’utiliser
O
pour ce block
f E LM
Si le template enfant ne redéfinit pas un block hérité, il aura la valeur définie par le père
ch r e
{{ parent() }} permet de récupérer le contenu du block côté père
©A
On peut faire des include pour ajouter entièrement un template
Symfony
Bonnes pratiques
H I ©
EL(Exemple :
Utiliser le Snake Case pour nommer les vues
U
page admin.html.twig).
L MO
f
Préfixer le nom d’uneevue
r Epar un underscore pour les fragments
A
de vue (Exemple ch: menu.twig).
©