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.
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é.
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).
Cours 9 (2015) : saisie d’un commentaire
xkcd: listen to yourself
Nous n’aurons le temps de traiter pour le moment que les éléments suivants :
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.
Quelques remarques :
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).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
On a décrit ici tout ce dont on avait besoin.
Les noms des fonctions sont très importants :
Les trois fonctions-étapes
Maintenant qu’on a leurs noms, on sait ce qu’elles doivent faire. Au travail :
Là encore, on a différé deux trois étapes, traitées ci-dessous.
Deux fonctions auxiliaires et la variable
$photo
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).