Table des matières

TP01 : Réorganisation et évolution d’une application PHP (MVC)


Contexte et objectif

Voici une application PHP non structurée en MVC de gestion d'une bibliothèque. Cette application permet :

Votre mission est de :

  1. Réorganiser cette application en respectant le modèle MVC (Modèle / Vue / Contrôleur).
  2. Implémenter une évolution spécifique de l’application (attribuée à chaque étudiant).
  3. Travail complémentaire : utiliser des classes

Ressources fournies

Partie 1 – Application de départ

Le fichier fourni bibliotheque.php contient tout le code (HTML, PHP et SQL).

Note: Le fichier bibliotheque.php est à enregistrer dans le dossier local de votre serveur LAMP (à installer selon le modèle de l'an dernier en transposant sous votre système Windows), dans un dossier D3-A01BibliMVC - Ce dossier devra être synchronisé avec un dépôt du même nom dans votre gitea.

bibliotheque.php
<?php
 
$ip = 'localhost'; 
$user = 'adminBibli'; 
$pass = 'mdpBibli'; 
$database = 'bdbibliotheque'; 
// Définition de la source des données pour PDO 
 
$dsn = "mysql:host=$ip;dbname=$database;charset=utf8mb4"; 
 
// Création de l'objet $dbh, de type PDO, qui est la ressource d'accès à la base 
try { 
 
$db = new PDO($dsn, $user, $pass); 
 
 } catch (PDOException $e) { 
 
die("Erreur de connexion : ".$e->getMessage());  
} 
 
// Ajout d’un livre
if (!empty($_POST['titre']) && !empty($_POST['auteur']) && !empty($_POST['annee'])) {
    $stmt = $db->prepare("INSERT INTO livres (titre, auteur, annee) VALUES (?, ?, ?)");
    $stmt->execute([$_POST['titre'], $_POST['auteur'], $_POST['annee']]);
}
 
// Récupération des livres
$stmt = $db->query("SELECT * FROM livres");
$livres = $stmt->fetchAll(PDO::FETCH_ASSOC);
 
?>
 
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Bibliothèque</title>
</head>
<body>
    <h1>Gestion de la bibliothèque</h1>
 
    <form method="POST">
        <label>Titre : <input type="text" name="titre"></label><br>
        <label>Auteur : <input type="text" name="auteur"></label><br>
        <label>Année : <input type="number" name="annee"></label><br>
        <button type="submit">Ajouter</button>
    </form>
 
    <h2>Liste des livres</h2>
    <ul>
        <?php foreach ($livres as $livre): ?>
            <li><?= $livre['titre'] ?> - <?= $livre['auteur'] ?> (<?= $livre['annee'] ?>)</li>
        <?php endforeach; ?>
    </ul>
</body>
</html>

Partie 2 – Objectif

Jalon0 : Tester la version initiale non organisée selon le modèle MVC

Réorganiser ce code en respectant le schéma MVC :

Jalon1 : Proposer une arborescence avec les fichiers et leur rôle précis

Coder et vérifier que l’application fonctionne toujours avec deux fonctionnalités de base :

Jalon2 : Validation du fonctionnement de l'application initiale en respectant le modèle MVC

Partie 3 – Évolutions

Chaque étudiant implémente une évolution en respectant le MVC.

Chaque évolution doit impliquer :

  1. Étudiant 1 – Suppression d’un livre (Morgann)
    1. Ajouter un bouton Supprimer dans la liste des livres.
    2. Implémenter la méthode de suppression dans le modèle.
  2. Étudiant 2 – Recherche de livres (Medhi)
    1. Ajouter un champ de recherche (titre/auteur).
    2. Implémenter une méthode de recherche dans le modèle.
    3. Afficher uniquement les résultats correspondants.
  3. Étudiant 3 – Gestion des catégories (Steve)
    1. Créer une table categories(id, nom).
    2. Associer chaque livre à une catégorie.
    3. Adapter le formulaire et l’affichage.
  4. Étudiant 4 – Modification d’un livre (Salomé)
    1. Ajouter un bouton Modifier dans la liste des livres.
    2. Permettre l’édition et la sauvegarde des informations du livre.
  5. Étudiant 5 - Gestion du statut d’un livre (emprunté / disponible) (Emile)
    1. ajouter un champ statut dans la table livres (par défaut “disponible”).
    2. affichage du statut dans la liste + bouton “Emprunter” ou “Rendre”.
    3. action changerStatut qui met à jour le champ.

Attention: L'application avec votre évolution sera le sujet de la revue de code de lundi, elle devra donc être terminée pour lundi 15/09 14h

Partie 4 – Evolution du code

  1. utilisation d'un header.php et footer.php pour limiter les redondances de code
  2. utilisation de classes :
    1. LivreControleur avec 2 méthodes au départ : ajouterLivre() et listerLivres()
    2. Livre avec les méthodes getAll() et ajouter($titre, $auteur, $annee)
    3. Database avec la méthode connexionDB()