Séparer traitement et rendu
Objectif : Transmettre les données préparées par le traitement à un gabarit pour les afficher.
Une page qui prépare ses données au milieu de son HTML devient difficile à faire évoluer. Par exemple, si le calcul du nombre de contacts et leur affichage sont entremêlés, vous devez comprendre les deux responsabilités à la fois pour modifier l’une d’elles. Vous allez organiser la page du carnet pour préparer d’abord les données, puis les afficher.
Vous connaissez déjà les inclusions require et les fonctions de traitement du carnet. Ici, vous allez appliquer ces acquis à une page complète : un premier bloc PHP prépare les contacts, leur nombre et leur état ; la partie HTML les consomme ensuite pour produire le rendu. Les deux contacts restent des données de démonstration, comme dans les leçons précédentes.
Préparer les données avant le HTML
Le traitement rassemble les opérations nécessaires avant le rendu : charger la fonction de résumé, définir les contacts de démonstration, calculer le compteur et choisir le message d’état. Ce code ne construit pas de balises HTML. Il prépare des valeurs qui seront utilisées plus bas dans la page, ce qui rend visible le passage entre les deux étapes.
<?php
declare(strict_types=1);
require __DIR__ . '/includes/fonctions.php';
$contacts = [
[
'nom' => 'Nadia Martin',
'courriel' => '[email protected]',
'telephone' => '01 23 45 67 89',
],
[
'nom' => 'Hugo Bernard',
'courriel' => '[email protected]',
'telephone' => '06 12 34 56 78',
],
];
$nombreContacts = count($contacts);
$messageEtat = $nombreContacts === 0
? 'Aucun contact dans le carnet.'
: 'Le carnet est prêt à être consulté.';
require __DIR__ . '/includes/entete.php';
?>
<section aria-labelledby="titre-message">
<h2 id="titre-message">État du carnet</h2>
<p class="carnet-message" role="status"><?= htmlspecialchars($messageEtat, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></p>
</section>
<section aria-labelledby="titre-contacts">
<h2 id="titre-contacts">Liste des contacts</h2>
<p><?= $nombreContacts ?> contact(s)</p>
<?php if ($contacts === []): ?>
<p>Aucun contact à afficher.</p>
<?php else: ?>
<ul class="carnet-liste">
<?php foreach ($contacts as $contact): ?>
<li class="carnet-contact">
<h3><?= htmlspecialchars($contact['nom'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></h3>
<p><?= htmlspecialchars(creerResumeContact($contact), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></p>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</section>
<?php require __DIR__ . '/includes/pied.php'; ?>État du carnet : Le carnet est prêt à être consulté.
Liste des contacts
2 contact(s)
Nadia Martin — [email protected] — 01 23 45 67 89
Hugo Bernard — [email protected] — 06 12 34 56 78Transmettre les données au rendu
Les variables définies avant une inclusion sont disponibles dans le fichier inclus. Ici, $messageEtat est préparé avant l’inclusion de l’en-tête, puis les données des contacts et le compteur sont utilisés dans la partie de rendu. L’inclusion n’efface pas ces valeurs : elle exécute le fichier dans le contexte courant.
La fonction creerResumeContact() fournit un texte, pas du HTML : le gabarit décide où le placer et l’échappe au moment de l’afficher. Cette répartition maintient la règle du projet : les fonctions métier ne produisent ni balises ni sortie directe. Le traitement est séparé du rendu par son emplacement et sa responsabilité, sans ajouter de fichier au contrat du projet.
Vérifier le résultat et la séparation
En rechargeant index.php, vous obtenez le message d’état, le nombre de contacts et une ligne de résumé pour chacune des deux personnes. Le résultat découle des données préparées : si vous ajoutez un contact au tableau, le compteur et la boucle de rendu le prennent en compte sans recopier une nouvelle ligne HTML à la main. La vérification consiste aussi à constater que la préparation n’émet pas de balises et que chaque valeur dynamique affichée est échappée.
Le contrat du projet ne prévoit pas de fichier de gabarit supplémentaire : index.php conserve donc la préparation et le rendu, dans deux zones ordonnées, tandis que les inclusions partagées restent dans includes/entete.php et includes/pied.php. Vous ne créez pas ici de fichier ni de classe supplémentaire. Les prochaines leçons pourront faire évoluer le traitement des données sans changer cette organisation générale.
À retenir
- Préparez les données et les valeurs d’état avant de commencer le rendu HTML.
- Les variables préparées restent disponibles dans les fichiers inclus ensuite.
- Laissez les fonctions métier produire des valeurs ; le gabarit choisit leur présentation.
- Échappez les données au point d’affichage et respectez les classes et fichiers du contrat.
Dans la prochaine leçon, vous vérifierez comment recevoir une soumission de formulaire en POST sans confondre les données reçues avec leur affichage.