Cours 9 (2015) : saisie d’un commentaire

xkcd: listen to yourself

Nous allons voir ici un exemple type de situation réelle : la saisie d’un nouveau commentaire à la suite d’une liste de commentaires en dessous d’une photo, sur une page consacrée à cette photo.
Nous n’aurons le temps de traiter pour le moment que les éléments suivants :

  • un code html minimaliste (mais bien structuré sémantiquement) pour la photo, les commentaires et le formulaire de saisie
  • le code php traitant le commentaire :
    • décomposition rigoureuse en fonctions très courtes (en commençant par le plus haut niveau, c’est à dire la dernière fonction)
    • vérifications
    • construction d’un « pseudo-objet » (un tableau avec des champs) représentant le commentaire
    • insertion dans la base (mongo, en l’occurrence)

Le formulaire

On fait ici une utilisation abondante des balises sémantiques. Les choix de balises et leur organisation sont soumis au jugement du codeur. L’essentiel est qu’ils soient cohérents et lisibles.

<article class="photo">
  <img src="Capture d’écran 2015-03-11 à 10.38.07 (2).png">

  <section class="comments">
    <article class="comment">
      <header>Jean-Raphael</header>
      Wouah trop cool la tof!
    </article>
    <article class="comment">
      <header>Gaëlle</header>
      Merci JR lol
    </article>

    <form class="comment" action="" method="post">
      <input type="hidden" name="photo_comment" value="true" />
      <textarea name="comment">
      </textarea>
      <input type="submit" value="comment"/>
    </form>
  </section>
</article>

Quelques remarques :

  • pour le moment, on a mis une url de photo en dur. En réalité, l’élément img doit être produit par une fonction qui se charge de construire l’url correcte en interrogeant la base de données à partir de l’identifiant de la photo, qui doit normalement être passé en paramètre dans l’url (par la méthode get).
  • l’action du formulaire est le script de la page courante, puisqu’on veut que lorsque le commentaire est envoyé, la page soit rechargée avec le commentaire ajouté après les précédents.
  • l’input hidden a pour but de signaler que ce formulaire a été utilisé, lorsque le script sera rechargé. Il n’est pas exclu que la page contienne d’autres formulaires (maintemant ou à l’avenir), donc on utilise ici un nom sans ambiguïté.

La fonction principale

function process_comment_if_any_comment_posted ()
{
   $comment = get_posted_comment_if_any_and_secure();
   if(invalid_or_no_comment($comment)) return;
   insert_comment($comment);
}

process_comment_if_any_comment_posted();

On a décrit ici tout ce dont on avait besoin.

Les noms des fonctions sont très importants :

  • ils servent de spécifications (même approximatives, c’est un bon aide-mémoire au moment d’écrire la fonction) ;
  • ils rendent le code lisible sans avoir recours aux commentaires (qui, en plus d’être rarement écrits, courent toujours le risque d’être rendus un jour obsolètes par une modification du code).

Les trois fonctions-étapes

Maintenant qu’on a leurs noms, on sait ce qu’elles doivent faire. Au travail :

function get_posted_comment_if_any_and_secure()
{
  $comment = array();

  if(! comment_posted()) return $comment;

  $text = check_and_secure($_POST, 'comment');
  if($text == "") return $comment;

  $comment['text'] = $text;
  $comment['author'] = $_SESSION['user_id'];
  $comment['date'] = today(); // NB : ce sera un type genre timestamp (un entier, quoi)

  global $photo;
  // la variable est définie en dehors de la fonction.
  // Elle vaudra ce qu'elle vaudra au moment de l'appel à la fonction.
  $comment['photo'] = $photo['_id'];

  return $comment;
}

function invalid_or_no_comment($comment)
{
  return empty($comment)
    || ! isSet($comment['text'])
    || (trim($comment['text']) == "");
}

function insert_comment($comment)
{
  $db->insert->comments($comment);
  return $comment['_id'];
}

Là encore, on a différé deux trois étapes, traitées ci-dessous.

Deux fonctions auxiliaires et la variable $photo

function get_photo()
{
  $photo = array();
  // todo :
  // - récupérer l'id de la photo dans l'url ($_GET)
  // - récupérer le doc correspondant dans la base

  return $photo;
}

$photo = get_photo();

function comment_posted()
{
   return isSet($_POST['photo_comment']);
}

function check_and_secure($T, $field)
{
  if(! isSet($T[$field])) return "";
  return htmlentities($T[$field]);
}

Le travail sur la variable $photo n’est pas l’objet de ce cours : c’est ce qui permet d’afficher la photo dont l’identifiant est passé dans l’url. Sur le même modèle que dans le cours 3 (php, premier contact).

Cette entrée a été publiée dans Cours, avec comme mot(s)-clef(s) , , , , , , . Vous pouvez la mettre en favoris avec ce permalien.