3. Design du site web
3.1. Twig
Nous allons mettre en place le design du site web, un design somme toute assez simple.
Pour cela il faut se rendre dans le répertoire templates et modifier le fichier
de rendu par défaut qui se nomme base.html.twig
On rappelle que Twig est qualifié de
moteur de templates pour le langage de programmation PHP, ce qui ne signifie
pas grand chose.
Pour être plus explicite, Twig autorise l'utilisation d'un langage qui permet de manipuler les variables PHP
dans une page HTML/PHP avec un formalisme simplifié. Par exemple plutôt
que d'écrire le code PHP suivant dans une page HTML :
On écrira le code Twig suivant dans un fichier d'extension .twig :
Le fameux moteur de template est un script PHP qui va transformer le code Twig en
code PHP.
Twig permet également d'oragniser la structure d'une page en différents blocks qui peuvent
être modifiés en fonction de des besoins. Par exemple on peut créer un fichier list.persons.html.twig
qui va étendre base.html.twig et pour lequel on modifie la section main pour afficher
une liste de personnes.
3.2. Autre fonctionnalités de Twig pour l'affichage des variables
3.2.1. Les filtres Twig
Les filtres permettent de modifier 7
l'affichage des variables ou la transformation des variables qui sont introduits par la barre verticale '|' (
ou pipe en anglais).
3.2.1.a Filtres sur les chaînes
Par exemple, upper permet de passer une chaîne en majuscule ou capitalize qui met la première lettre en majuscule.
{{ 'mon titre' | upper }}
Un autre filtre intéressant est raw qui permet de prendre une variable qui contient du
code HTML et l'afficher tel quel car, par défaut, une variable avec du code HTML est modifiée et on verra
le code correspondant s'afficher. Essayez avec les deux syntaxes suivantes :
// introduisez une variable 'code' au niveau du contrôleur qui contient du code HTML
// puis affichez la avec l'une des deux syntaxes suivantes :
{{ code }}
3.2.1.b Filtres sur les tableaux
Le filtre join permet de transformer les éléments d'un tableau en chaîne :
{{ [ 2,
3,
5,
7 ] | join( ',' ) }}
Le filtre map permet d'appliquer une fonction à un tableau :
{{ [ 2,
3,
5,
7 ] | map( x => x * x ) | join( ',' ) }}
On obtiendra donc la chaîne "4, 9, 25, 49".
Le filtre filter sélectionne des éléments en fonction d'un critère de choix :
{%
for x in [1,
2,
3,
4,
5,
6] | filter( x => (x %
2) == 0 ) %
}
{{ x }}
On obtient donc uniquement les nombres pairs.
On voit qu'on peut utiliser for endfor pour parcourir un tableau ou une
collection. Il existe également le if, else, endif.
Ces mots clés sont introduits dans des balises {% %}.
3.2.1.c Filtres sur les dates
A partir d'un timestamp, on peut obtenir la date et l'afficher au format jour / mois /année :
{{ 23580000 | date('d/m/Y') }}
On peut également choisir d'afficher la date au format jour / mois en lettres / année mais dans ce cas on obtient un mois en anglais.
{{ 23580000 | date('d F Y') }}
Il faut alors utiliser le filtre format_date mais il est alors nécessaire d'installer deux packages : twig/intl-extra et twig/extra-bundle. Pour cela on utilise composer :
symfony composer require twig/intl-extra
symfony composer require twig/extra-bundle
Il existe également format_date qui permet de formater une date avec la locale adaptée :
{{ 23580000 | format_date( pattern="dd MMMM yyyy", locale='fr' ) }}
Néanmoins, il faut éventuellement ajouter le package Linux correspondant (par exemple php-8.2-intl)
et modifier le fichier php.ini adéquat (par exemple dans /etc/php/8.2/apache2)
en décommentant l'extension :
...
;extension=gettext
;extension=gmp
extension=intl
;extension=imap
;extension=mbstring
...
3.2.1.d Réutilisation des templates
Il est possible de créer un template Twig et de l'inclure dans un autre template, en passant des paramètres :
{{ include( "template_a_inclure.twig",
{ var : nom_var } ) }}
3.2.1.e Extension de page
Le code de base d'une page est donné par le fichier templates/base.html.twig. Celui ci peut être réutilisé (hérité) et modifié pour certaines parties.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text></svg>">
<link rel="stylesheet"
href="{{ asset('css/style.css') }}">
<script src="{{ asset('js/javascript.js') }}"></script>
</head>
<body>
</body>
</html>
Cette page contient des blocks qui peuvent être modifiés, notamment le block body pour créer de nouvelles pages. On aura donc juste à redéfinir le block body pour toute nouvelle page ce qui permet à chaque fois d'inclure la même partie head avec les références aux fichiers CSS et Javascript.
{{%
extends( './base.html.twig") %}}
mon code HTML spécifique à la page
3.2.1.f La variable app
Cette variable permet d'avoir accès à différentes informations comme l'utilisateur connecté, les paramètres passés, environnement (développement, production), les variables de session.
On peut notamment afficher la requête en tapant :
{{ dump( app.request ) }}
{{ dump( app.request.method ) }}
{{ dump( app.request.environment ) }}
{{ dump( app.request.session ) }}
3.3. Modification de base.html.twig
La page principale de notre site sera composée d'un header, d'un footer d'une barre de navigation ainsi que d'une
partie centrale (balise main) qui sera variable.
La barre de navigation située en dessous du header contient un menu avec les options :
- accueil
- conducteurs
- véhicules
- équipements
On obtient donc quelque chose similaire à ceci (cliquez sur l'image pour l'agrandir) :
Dont le code est :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{{ asset('css/style.css') }}">
<script src="{{ asset('js/javascript.js') }}"></script>
</head>
<body>
<header>
<h1>Département des Véhicules à Moteur</h1>
</header>
<nav>
<ul>
<li><a href="/">Accueil</a></li>
<li><a href="/conducteur/list">Conducteurs</a></li>
<li><a href="/vehicule/list">Véhicules</a></li>
<li><a href="/equipement/list">Equipements</a></li>
<li><a href="/connexion">Connexion</a></li>
</ul>
</nav>
<main>
<section>
<h2>Bienvenue sur le site DVM !</h2>
<p>Nous gérons tous les véhicules ainsi que leurs conducteurs.</p>
<p>Un conducteur peut détenir plusieurs véhicules.</p>
<p>Un véhicule possède 0 à plusieurs équipements et un équipement peut
appartenir à 0 ou plusieurs véhicules.</p>
</section>
</main>
<footer>
<p>Copyright 2024 by Jean-Michel Richer</p>
</footer>
</body>
</html>
La mise en forme est donnée par le fichier CSS public/css/style.css :
* {
margin: 0;
}
html {
background-color: white;
}
body {
font-family: Verdana, sans-serif;
font-size: 14px;
background-color: white;
display: flex;
flex-direction: column;
align-items: start;
justify-content: center;
}
/* HEADER avec image à droite */
header {
height: 200px;
background: black;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
header h1 {
color: white;
font-size: 40px;
}
header img {
margin-right: 40px;
}
/* FOOTER */
footer {
height: 40px;
background-color: darkgray;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
footer p {
color: black;
font-size: 18px;
text-align: center;
}
/* NAVIGATION BAR */
nav {
display: flex;
align-items: center;
justify-content: center;
background-color: darkgray;
width: 100%;
height: 40px;
border-top: 1px solid lightgray;
border-bottom: 1px solid black;
}
nav ul {
list-style-type: none;
display: flex;
flex-direction: row;
margin: 0;
padding: 0;
}
nav ul li {
width: 150px;
margin: 5px 2px;
padding: 3px auto;
font-size: 20px;
text-align: center;
}
nav ul li a {
text-decoration: none;
font-size: 18px;
font-weight: bold;
color: black;
}
/* MAIN */
main {
width: 100%;
min-height: calc(100vh - 310px);
display: flex;
flex-direction: column;
align-items: center;
justify-content: start;
background: white;
}
main section {
width: 80%;
margin-top: 40px;
}
main section h2 {
font-size: 34px;
margin: 10px auto;
padding-bottom: 20px;
text-align: center;
color: #D52315 ; /*#D7240F; */
}
main section p {
font-size: 18px;
margin: 20px auto;
text-align: justify;
width: 600px;
}
main section p.center {
text-align: center;
padding: 10px;
}
On notera que tout ce qui concerne les CSS, le Javascript et les images sera placé dans
le répertoire public/ du projet Symfony.
public/
├── css
│ └── style.css
├── images
│ ├── audi_r8.png
│ ├── car_icon.png
│ ├── delete.png
│ ├── error-icon.png
│ └── modify.png
├── index.php
└── js
└── javascript.js
Vous pouvez également récupérer les images images.tgz et les
placer dans le répertoire public/images/ que vous créerez. Pour cela vous pouvez
décompresser l'archive dans le répertoire public.
N'oubliez pas de créer également le répertoire public/js/ ainsi que le fichier
public/js/javascript.js qui contiendra des traitements Javascript qui vont permettre
de dynamiser le site.