Tutoriel de correction du TP4 

Partie 1 - Cas d'utilisation "Créer un ticket"

Mise en place

(On suppose qu'un répertoire tpdsi a été créé à la racine du site  web.) 

Créer un répertoire tp4 sous le répertoire tpdsi ;  y dézipper l'archive correction du TP3 .
Si le serveur web est lancé sur la machine locale,  on doit pouvoir visualiser le formulaire de saisie de ticket en tapant l'URL http://localhost/tpdsi/tp4/editTicket.php dans un navigateur.

(Lancer Eclipse.) Dans Eclipse, sélectionner le projet tpdsi précédemment créé et utiliser la touche F5 (File->Refresh)
Le répertoire tp4 apparaît alors ainsi que tous les fichiers qu'il contient.

Note concernant le contrôle d'accès: la définition de la classe LaxisteLoginController dans le fichier login/LaxisteLoginController.class.php n'est pas explicitée pour cause de simplicité (voir le fichier AcceptAllExceptZZZLoginController.class.php). Pour utiliser cette classe, il suffit de remplacer le contenu du fichier login/loginAccess.conf.php par :

<?php
// Changer ces 2 lignes pour utiliser un validateur de login différent
include_once 'LaxisteLoginController.class.php';
$loginControl = new LaxisteLoginController();
?>

Définition de la classe Ticket

Sélectionner le répertoire tp4 

File->New->PHP File

Saisir Ticket.class.php pour nom de fichier. Cliquer sur le bouton "Finish".

Eclipse crée un fichier vide.

La classe Ticket est constitué essentiellement d'attributs et d'un constructeur. 

<?php
class Ticket {
    private $ticketID;
    private $applicationName;
    // ...

    function __construct($applicationName, $login, $priority, $type, $creationDate, $oneLiner, $detailedDescription, $attachmentName, $ticketID = -1) {
        $this->ticketID = $ticketID;
        $this->applicationName = $applicationName;
        // ...
    }
}
?>

On va aussi définir des méthodes "accesseur" pour ces attributs, soit des getter et des setter : 

    function getTicketID() { return $this->ticketID; }
    function setTicketID($ticketID) { $this->ticketID = $ticketID; }
    function getLogin() { return $this->login; }
    ...

Définition de la classe TicketDAO

Sélectionner le répertoire tp4 

File->New->PHP File

Saisir TicketDAO.class.php pour nom de fichier. Cliquer sur le bouton "Finish".

On va définir un attribut $filePath et donc un constructeur à un argument et inclure le fichier définissant la classe Ticket :

include_once 'Ticket.class.php';
class TicketDAO {
    private $filePath; // chemin du fichier utilisé pour la persistance des tickets
    function __construct($filePath = 'tickets.csv') {
        $this->filePath = $filePath;
    }
}

La méthode save($ticket) se construit en adaptant la fonction saveTicket() du TP3  : 

    function save($ticket) {
        $line = $ticket->getTicketID() . ";" .  $ticket->getApplicationName() . ";" .  $ticket->getLogin() . ";" .  $ticket->getPriority() . ";" .  $ticket->getType() . ";" .  $ticket->getCreationDate() . ";" .  $ticket->getOneLiner() . ";" .  $ticket->getDetailedDescription() . ";" .  $ticket->getAttachmentName();

        $fd = fopen($this->filePath, 'a+'); // ouverture du fichier en écriture 'append'
        $line .= "\n"; // concaténation d'un saut de ligne
        fputs($fd, $line); // écriture de la ligne en fin de fichier
        fclose($fd); // fermeture du fichier
    }

Utilisons ces classes dans editTicketAction.php. 

Dans le fichier editTicketAction.php,  inclure les 2 classes au début du fichier :

include_once 'Ticket.class.php';
include_once 'TicketDAO.class.php';

Remplacer  

saveTicket($application, $login, $priority, $type, $todayDate, $oneLiner, $contents, $attachmentName);

par :  

$ticket = new Ticket($application, $login, $priority, $type, $todayDate, $oneLiner, $contents, $attachmentName);
$ticketDAO = new TicketDAO();
$ticketDAO->save($ticket);

(Supprimer également la définition de saveTicket() devenue inutile.)

Tester en créant ce ticket de priorité urgente et vérifier le fichier tickets.csv résultant.

Définition de la classe AppService

Sélectionner le répertoire tp4 

File->New->PHP File

Saisir AppService.class.php pour nom de fichier. Cliquer sur le bouton "Finish".
Inclure les fichiers Ticket.class.php et TicketDAO.class.php. Définir les 2 méthodes :

    static function printTicketAsTableRow($ticket, $tableRecordClass) {
        $applicationName = $ticket->getApplicationName();
        $priorityText = $ticket->getPriorityText();
        $type = $ticket->getType();
        $creationDate = $ticket->getCreationDate();
        $oneLiner = $ticket->getOneLiner();
        $detailedDescription = $ticket->getDetailedDescription();
        $str =<<<EOT
    <tr class="$tableRecordClass">
      <td class="center">$applicationName</td>
      <td class="center">$priorityText</td>
      <td class="center">$type</td>
      <td class="center">$creationDate</td>
      <td class="left">$oneLiner</td>
      <td class="left">$detailedDescription</td>
    </tr>
EOT;
        echo $str;
    }

    static function saveTicket($ticket) {
        $ticketDAO = new TicketDAO();
        $ticketDAO->save($ticket);
    }

(Attention,  un appel de méthode (ex.: $ticket->getApplicationName()) n'est pas correctement évalué à l'intérieur de la syntaxe here-doc <<<EOT !!)

Au début de editTicketAction.php inclure les 2 classes utilisées (plus de DAO):

include_once 'Ticket.class.php';
include_once 'AppService.class.php';

Remplacer  

$ticketDAO = new TicketDAO();
$ticketDAO->save($ticket);

par (l'appel statique) :  

AppService::saveTicket($ticket)

Remplacer l' appel à printTicketAsTableRow(...)  par AppService::printTicketAsTableRow($ticket, $tableRecordClass)

(Supprimer également les définitions de printTicketAsTableRow() et saveTicket() devenues inutiles.)

Tester en créant ce ticket de priorité urgente et vérifier le fichier tickets.csv résultant.