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
- Ajoutez à
Annonceune méthode statiquevalider(array $valeurs): arrayqui 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.
- Déclarez la route
/annonces/proposer, enGETet enPOST. EnGET, elle affiche le formulaire vide, dans une page dont l'onglet s'intituleProposer une petite annonce — La Gazette de Saint-Glinglin. - 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. - 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. - 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 :
$_POST['titre'] ?? ''donne le champ, ou''s'il n'a pas été envoyé (sans l'avertissement « Undefined array key ») ;trim($texte)retire les espaces au début et à la fin ;ctype_digit($texte)vauttruesi la chaîne ne contient que des chiffres (et n'est pas vide) ;(int) $textetransforme'40'en l'entier40.
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.