Énoncé 4 : L’agenda
Introduction
Durée
4 heures 40
Mots-clés
Type de données SQL, date, timestamp, comparaison, formatage, contrôle de saisie, procédure stockée, classe abstraite, closure.
Objectifs
Les exercices de ce chapitre, tout en approfondissant les techniques MVC, développent la gestion des dates et des heures en PHP/MySQL. C’est un point important dans nombre d’applications, notamment de gestion, et le support de l’environnement technique est primordial dans ce domaine.
Dans Team Up, les dates, heures et durées sont appréhendées au niveau de la base de données, de la couche DAO, de composants de services et bien entendu sur le plan MVC. Les TP qui suivent sont aussi l’occasion de mettre en œuvre des procédures stockées MySQL, ce qui confère plus de performance et de sécurité au code de l’application.
Prérequis
Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après :
1. |
En MySQL, parmi les propositions suivantes, quels sont les types de données associés au temps ? |
|
|
a. |
time |
|
b. |
stamp |
|
c. |
year |
|
d. |
datetime |
2. |
Comment traduire en MySQL du texte varchar en format date ? |
|
|
a. |
avec la fonction getdate() |
b. |
avec la fonction to_date() |
|
|
c. |
avec la fonction str_to_date() |
|
d. |
avec des signes # de part et d’autre de la chaîne |
3. |
Quelle est la chaîne de format MySQL pour analyser le texte 13/09/2019 12:15 ? |
|
a. |
’%d/%m/%Y %H:%i’ |
|
b. |
’%d/%m/%y %h:%i’ |
|
c. |
’dd/mm/yyyy hh:ii’ |
|
|
d. |
’yyyy-mm-dd hh:min’ |
4. |
Comment traduire en MySQL une date en texte ? |
|
|
a. |
avec la fonction date_to_texte() |
|
b. |
avec la fonction date_format() |
|
c. |
avec la fonction date_to_string() |
d. |
avec la fonction convert() |
|
5. |
Comment trier les enregistrements de la table rendezvous par ordre décroissant selon la colonne rdv_date de type datetime ? |
|
|
a. |
select * from rendezvous order by datetime(rdv_date) |
|
b. |
select * from rendezvous order by decrease rdv_date |
|
c. |
select * from rendezvous order by rdv_date desc |
|
d. |
select datetime(rdv_date) from rendezvous desc order by |
|
e. |
select * from rendezvous order by desc rendezvous.rdv_date |
6. |
Parmi les propositions suivantes, quelles fonctions PHP formatent la date courante ? |
|
|
a. |
getdate() |
|
b. |
dateformat() |
|
c. |
today() |
|
d. |
date() |
|
e. |
DateTime::$current |
... |
Énoncé 4.1 Initialisation de la base de données
Durée estimative : 90 minutes
Le TP inaugural du chapitre débute par la construction des tables de la base de données et par la mise au point des requêtes. À la différence de la gestion des utilisateurs ou des demandes, les requêtes sont ici un peu plus élaborées et le DAO ne se limite pas à un CRUD (abréviation de Create Read Update Delete, soit les quatre requêtes de base sur une table).
Exécutez depuis phpMyAdmin le script agenda.sql. Ce script crée les tables et insère quelques enregistrements à titre d’exemple. Inspectez la structure de la table evenement puis de la table participant. La première table représente un rendez-vous défini par un organisateur : un lieu, une date de début et une date de fin, un objet et une description. Quel est le rôle des champs tstamp et uid ?
La table participant associe des utilisateurs de Team Up au rendez-vous.
Testez la requête :
select uuid()
En quoi peut-elle nous être utile ?
Rédigez et testez une requête d’insertion dans la table evenement.
Affichez le code source de la procédure stockée sp_evenement_add et relevez ses paramètres.
Exécutez la procédure stockée en fournissant les paramètres d’entrée....
Énoncé 4.2 Le DAO et la couche de service pour l’agenda
Durée estimative : 30 minutes
Faire bien attention dans ce TP au format des dates échangées entre PHP et MySQL. Des formatages sont à appliquer en lecture et en écriture à l’aide des instructions PHP.
Créez deux entités EvenementEntity et ParticipantEntity.
Créez le DAO EvenementDAO et récupérez la chaîne de connexion à la base de données dans le constructeur.
Ajoutez les méthodes evenement_set_participant($id_evenement, array $pe) et evenement_get_participant($id_evenement).
Implémentez la méthode evenement_add(EvenementEntity $ev, array $pe=null) et retournez l’identifiant de la ligne ajoutée ; cet identifiant est lui-même retourné par la procédure stockée avec last_insert_id().
Implémentez la méthode evenement_get_by_id($id_evenement) qui retourne l’événement correspondant à l’identifiant passé comme paramètre.
Implémentez la méthode evenement_edit(EvenementEntity $ev, array $pe=null) en vous appuyant sur les procédures stockées.
Implémentez les méthodes evenement_get_from_utilisateur($id_utilisateur) et evenement_get_from_dates($dtstart, $dtend).
Implémentez la méthode...
Énoncé 4.3 Saisie et modification d’un rendez-vous
Durée estimative : 60 minutes
Dans ce TP, nous reprenons les techniques de réalisation de formulaire MVC appliquées au chapitre précédent. Il faut traduire les consignes de création de « pages » en composants modèles, vues et actions de contrôleur.
Dans la zone agenda, créez un contrôleur agenda (donc la classe se nomme agendaController) et une action par défaut appelée index(). Mappez cette action dans le menu général menu.json.
Ajoutez un bouton d’action « Nouveau rendez-vous ».
Ajoutez une page (c’est-à-dire une action et une vue) agendaadd().
Concevez dans la vue agendaadd un formulaire de saisie de rendez-vous.
Utilisez UtilisateurService pour déterminer l’organisateur du rendez-vous (en principe, c’est l’utilisateur connecté).
Utilisez UtilisateurService pour lister les participants au rendez-vous.
Il faut choisir un contrôle (une ergonomie au sens HTML) pour sélectionner plusieurs utilisateurs. Cette multisélection peut être réalisée avec une liste de valeurs <select>, des cases à cocher, ou encore un système un peu plus élaboré comme celui mis en œuvre pour les équipes (chapitre Gestion des utilisateurs)....
Énoncé 4.4 Création d’un composant de sélection de date
Durée estimative : 25 minutes
Jusqu’à présent, les affichages de liste étaient réalisés par du code ad hoc au niveau de la vue. On remarque qu’au fil des TP, beaucoup de pages sont très similaires. Une grille de données est affichée à partir d’un composant jQuery et alimentée par un service web JSON. Le code dupliqué entre toutes les pages n’est de fait pas très maintenable. Si nous voulions par exemple changer l’apparence ou le comportement de ces listes, il faudrait repasser dans toutes les pages.
Ce TP explique comment créer des composants réutilisables dans des vues, en appliquant la syntaxe des fonctions PHP anonymes dites closures.
Créez dans le répertoire application un dossier controls et un fichier datepicker.php.
Vous devez inclure le fichier comfpl/views/viewComp.php.
Définissez la classe datePicker qui étend la classe abstraite viewComp.
Définissez une propriété publique $width ainsi qu’un constructeur qui l’initialise à la valeur 300. Ajoutez également une propriété publique $value.
Implémentez la méthode (abstraite dans la classe viewComp) renderBody() de la façon suivante :
public function renderBody()
{
echo "<input id='$this->id' width='$this->width' value='$this->value' />";
}
Créez dans la zone agenda une page (action de contrôleur et vue) testpicker.
Vous devez inclure dans la vue testpicker.php le fichier datepicker.php.
Ajoutez les lignes suivantes pour instancier le composant, et définissez son comportement JavaScript au moyen du closure PHP :
<?php $g = viewComp::instanciate("datePicker","p1") ?>
<?php $g->width = 250; ?>
<?php $g->configureJavaScript( function() { ?>
<script>
$(document).ready(function() { ...
Énoncé 4.5 Affichage de la liste des rendez-vous
Durée estimative : 45 minutes
Après la réalisation du composant datePicker, nous poursuivons par l’affichage du planning.
Ajoutez à la page index une zone de filtre comprenant une liste des utilisateurs de la base de données augmentée d’une valeur « Tous ».
Ajoutez à la page index deux bornes de dates à l’aide du composant datePicker.
À l’affichage de la page, les bornes de dates doivent être définies sur la date courante et la date courante + 1 semaine.
Installez dans le contrôleur la logique pour exposer un service web JSON en prenant en compte les paramètres de filtre (utilisateur, bornes de date).
Ajoutez une grille de données avec les colonnes Début, Fin, Organisateur, Objet, Lieu, et Lien vers l’action agendaedit.
Ajoutez un bouton d’action pour appliquer les filtres et rafraîchir la page.
Testez l’affichage.
Énoncé 4.6 Pour aller plus loin : export de l’agenda dans Outlook ou Gmail
Durée estimative : 30 minutes
Le format iCal est un standard pour représenter des événements dans des environnements tels que Gmail ou Outlook. Il fonctionne à l’aide de messages importés dans la messagerie des participants.
Ajoutez à la vue agendaedit un lien hypertexte intitulé « Obtenir RDV.ics ». L’URL du lien est l’action sendmeeting() qui accepte un paramètre idev (pour id_evenement). Le lien doit s’ouvrir dans une nouvelle fenêtre.
Définissez dans le contrôleur l’action sendmeeting acceptant le paramètre idev. Récupérez la valeur de ce paramètre dans une variable $id_evenement.
À l’aide de la classe EvenementService, récupérez l’ensemble des informations pour le rendez-vous $id_evenement ainsi que la liste des participants. Chargez aussi la liste des utilisateurs en base de données.
À l’aide d’une boucle foreach sur l’ensemble des utilisateurs de la base, récupérez le nom et l’e-mail de l’organisateur comme des participants du rendez-vous. Utilisez les méthodes publiques ICSService::format_organizer et ICSService::format_attendee pour formater ces données dans une variable $organizer...