Proposer une petite annonce

Exercice 4 sur 7 du chapitre 6 · 200 XP · 5 objectifs vérifiés par des tests

Notions abordées : FormulairePOST$_POSTValidationCode 422

Madame Lou croule sous les petits mots glissés dans sa boîte aux lettres : « Vends brouette », « Cherche chat roux »… Les villageois proposeront désormais leurs petites annonces en ligne. Le neveu d'Odette a déjà dessiné le formulaire, dans templates/proposer-annonce.php : il attend $valeurs, ce qui a été saisi, et $erreurs, la liste des problèmes.

Votre mission

  1. Ajoutez à Annonce une méthode statique valider(array $valeurs): array qui renvoie la liste des erreurs, vide si tout va bien :
    • Le titre est obligatoire. si le titre est vide ;
    • Le prix est obligatoire. si le prix est vide, sinon « quarante » n'est pas un prix : écrivez un nombre entier d'euros., où « quarante » est ce qui a été saisi, s'il ne contient pas que des chiffres ;
    • Le contact est obligatoire. si le contact est vide.
  2. Déclarez la route /annonces/proposer, en GET et en POST. En GET, elle affiche le formulaire vide, dans une page dont l'onglet s'intitule Proposer une petite annonce — La Gazette de Saint-Glinglin.
  3. En POST, lisez les trois champs dans $_POST (sans les espaces autour) et validez-les. S'il y a des erreurs, répondez 422 et réaffichez le formulaire avec ce qui a été saisi.
  4. Sinon, affichez templates/annonce-envoyee.php, à écrire : dans un <main class="lecture">, <p class="confirmation">Merci ! Votre annonce paraîtra dans le prochain numéro.</p> puis l'annonce elle-même.
  5. Dans le menu, ajoutez un lien <a class="proposer"> « Proposer une annonce ».

Les annonces ne sont pas encore enregistrées : il faudra une base de données, au prochain parcours.

Rappel

Un formulaire en method="post" envoie ses champs dans le corps de la requête, et PHP les range dans $_POST, indexés par l'attribut name des champs. $_SERVER['REQUEST_METHOD'] vaut 'GET' ou 'POST' selon la requête, et $r->addRoute(['GET', 'POST'], …) déclare une route qui répond aux deux.

Quelques outils pour lire et vérifier la saisie :

Le code 422 (Unprocessable Content) dit « j'ai compris la demande, mais elle n'est pas valable » : c'est la réponse d'usage à un formulaire refusé.

valider() et le hook set du prix (exercice 13) se complètent. valider() explique à la personne ce qui ne va pas dans ce qu'elle a saisi : « -5 » ne contient pas que des chiffres, il est refusé avec un message. Le hook, lui, garantit qu'une Annonce n'aura jamais un prix négatif, quel que soit le code qui la crée. Le premier parle à l'utilisateur, le second protège le programme.