Leçon 9 / 18

Séparer traitement et rendu

12 min PHP 8 — premiers scripts et formulaires Gratuit

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.

index.php — préparation des donnéesPHP
<?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'; ?>
Résultat attendu
É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 78

Transmettre 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.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.