Afficher la pageAnciennes révisionsLiens de retourHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== TP01 : Réorganisation et évolution d’une application PHP (MVC) ====== * **Durée : 4 heures** * Technologie : PHP natif + MySQL * Contraintes : pas de framework, architecture MVC imposée. * <badge>JalonXX</badge> : indique une validation à faire auprès de Mme Thevenot avant de passer à la suite du travail ---- ===== Contexte et objectif ===== Voici une application PHP **non structurée en MVC** de gestion d'une bibliothèque. Cette application permet : * d’ajouter des livres dans une base de données * d’afficher la liste des livres existants. Votre mission est de : - Réorganiser cette application en **respectant le modèle MVC** (Modèle / Vue / Contrôleur). - Implémenter une **évolution spécifique** de l’application (attribuée à chaque étudiant). - Travail complémentaire : utiliser des classes ---- ===== Ressources fournies ===== * Fichier **bibliotheque.php** (code initial) * Script SQL **bibliotheque.sql** pour créer la base ===== Partie 1 – Application de départ ===== Le fichier fourni **bibliotheque.php** contient tout le code (HTML, PHP et SQL). <bootnote>Le fichier **bibliotheque.php** est à enregistrer dans le dossier local de votre **serveur LAMP** (à installer selon le [[https://sio.lyc-lecastel.fr/doku.php?id=promo_2025:php:tp00&s[]=lamp|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**.</bootnote> <code ruby 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> </code> ===== Partie 2 – Objectif ===== <badge>Jalon0 : Tester la version initiale non organisée selon le modèle MVC</badge> Réorganiser ce code en respectant le schéma MVC : * Modèle : gestion des livres et accès BDD. * Contrôleur : réception des actions (ajouter, lister, etc.), le contrôleur appelle les fonctions du modèle et charge la vue correspondante. * Vues : uniquement du HTML + affichage, les vues sont séparées * à la racine le fichier index.php est la page d'accueil qui sert de routeur (choix de l’action → appel du contrôleur). <badge>Jalon1 : Proposer une arborescence avec les fichiers et leur rôle précis</badge> Coder et vérifier que l’application fonctionne toujours avec deux fonctionnalités de base : * Ajouter un livre * Afficher la liste des livres <badge>Jalon2 : Validation du fonctionnement de l'application initiale en respectant le modèle MVC</badge> ===== Partie 3 – Évolutions ===== Chaque étudiant implémente une évolution en respectant le MVC. Chaque évolution doit impliquer : * une modification du modèle * une adaptation du contrôleur * une mise à jour de la vue - **Étudiant 1 – Suppression d’un livre** (Morgann) - Ajouter un bouton Supprimer dans la liste des livres. - Implémenter la méthode de suppression dans le modèle. - **Étudiant 2 – Recherche de livres** (Medhi) - Ajouter un champ de recherche (titre/auteur). - Implémenter une méthode de recherche dans le modèle. - Afficher uniquement les résultats correspondants. - **Étudiant 3 – Gestion des catégories** (Steve) - Créer une table categories(id, nom). - Associer chaque livre à une catégorie. - Adapter le formulaire et l’affichage. - **Étudiant 4 – Modification d’un livre** (Salomé) - Ajouter un bouton Modifier dans la liste des livres. - Permettre l’édition et la sauvegarde des informations du livre. - **Étudiant 5 - Gestion du statut d’un livre (emprunté / disponible)** (Emile) - ajouter un champ statut dans la table livres (par défaut "disponible"). - affichage du statut dans la liste + bouton "Emprunter" ou "Rendre". - action changerStatut qui met à jour le champ. <bootnote warning>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**</bootnote> ====== ===== Partie 4 – Evolution du code ===== - utilisation d'un header.php et footer.php pour limiter les redondances de code - utilisation de classes : - LivreControleur avec 2 méthodes au départ : ajouterLivre() et listerLivres() - Livre avec les méthodes getAll() et ajouter($titre, $auteur, $annee) - Database avec la méthode connexionDB() d3/a01.txt Dernière modification : 2025/09/08 17:28de dthevenot