From 0ea1efddca04b5ecf00850d7e3be0c33ef2c7cd1 Mon Sep 17 00:00:00 2001 From: SofianeLasri <alasri250@gmail.com> Date: Sun, 13 Nov 2022 18:47:00 +0100 Subject: [PATCH] =?UTF-8?q?Ex=203=20&=204=20finis=20(peut-=C3=AAtre=20auss?= =?UTF-8?q?i=20une=20partie=20du=205eme)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TP6/controller/ControleurObjet.php | 30 ++-- TP6/index.php | 21 +-- TP6/models/Auteur.php | 14 -- TP6/models/Objet.php | 38 +++++- TP6/resources/views/components/navbar.php | 2 +- .../views/formulaire-creation-objet.php | 129 +++++++++++++++--- 6 files changed, 175 insertions(+), 59 deletions(-) diff --git a/TP6/controller/ControleurObjet.php b/TP6/controller/ControleurObjet.php index 4f71ed4..a44387b 100644 --- a/TP6/controller/ControleurObjet.php +++ b/TP6/controller/ControleurObjet.php @@ -1,10 +1,5 @@ <?php -/** - * Désolé mais le TP5 est une mauvaise idée de bout en bout. - * Je me suis arrêté à l'ex 2 car je ne vois pas comment on pourrait aisément rassembler tous les contrôleurs ici - * étant donné que le contenu diffère légèrement selon les modèles. - */ class ControleurObjet { public static function lireObjets() : string @@ -15,9 +10,28 @@ class ControleurObjet public static function creerObjet() : string { - return view('formulaire-creation-auteur', [ - 'pageTitle' => 'Créer un auteur', - 'insertMessage' => $insertMessage + $createdObject = []; + // Si reçoie une requête POST pour créer un objet et qu'on a plus d'une entrée + if(!empty($_POST["objectName"]) && count($_POST) > 1){ + $columns = []; + foreach ($_POST as $index => $value){ + if(!in_array($index, ["action", "objectName"])){ + $columns[$index] = $value; + } + } + + $createdObject = Objet::addObject($_POST["objectName"], $columns); + if($createdObject["status"] === "fail"){ + $createdObject["status"] = "danger"; // Pour le style Bootstrap + } + } + if(!empty($_GET["describeTable"])){ + return json_encode(Objet::describeObject($_GET["describeTable"])); + } + + return view('formulaire-creation-objet', [ + 'pageTitle' => 'Créer un objet', + 'insertMessage' => $createdObject ]); } } \ No newline at end of file diff --git a/TP6/index.php b/TP6/index.php index 1463542..b67a879 100644 --- a/TP6/index.php +++ b/TP6/index.php @@ -15,32 +15,19 @@ require_once("controller/ControleurLivre.php"); Database::connect(); -if (empty($_GET["action"])) { +if (empty($_REQUEST["action"])) { echo ControleurAuteur::lireAuteurs(); } else { - // Test TP 5 - if ($_GET["action"] === "lireObjets" && !empty($_GET["objet"])) { - switch ($_GET["objet"]){ - case 'Auteur': - echo ControleurAuteur::lireObjets(); - break; - default: - echo ControleurAuteur::lireObjets(); - break; - } - } - // Fin test TP5 - // C'est plus long que get_class_methods mais c'est moins sujet à problèmes. - switch ($_GET["action"]){ + switch ($_REQUEST["action"]){ case "lireAuteur": echo ControleurAuteur::lireAuteur(); break; case "lireAuteurs": echo ControleurAuteur::lireAuteurs(); break; - case "creerAuteur": - echo ControleurAuteur::creerAuteur(); + case "creerObjet": + echo ControleurObjet::creerObjet(); break; case "lireAdherent": echo ControleurAdherent::lireAdherent(); diff --git a/TP6/models/Auteur.php b/TP6/models/Auteur.php index a45a040..da14485 100644 --- a/TP6/models/Auteur.php +++ b/TP6/models/Auteur.php @@ -62,19 +62,5 @@ class Auteur extends Objet { return "<p>auteur $this->prenom $this->nom, né(e) en $this->anneeNaissance </p>"; } - - public static function addAuteur($nom, $prenom, $anneeNaissance){ - $query = Database::pdo()->prepare("INSERT INTO Auteur(nom, prenom, anneeNaissance) VALUES (:nom, :prenom, :anneeNaissance)"); - try{ - $query->execute([ - "nom" => $nom, - "prenom" => $prenom, - "anneeNaissance" => $anneeNaissance - ]); - return "success"; - } catch (PDOException $e){ - return $e; - } - } } diff --git a/TP6/models/Objet.php b/TP6/models/Objet.php index 24a0740..f770e2b 100644 --- a/TP6/models/Objet.php +++ b/TP6/models/Objet.php @@ -39,10 +39,10 @@ class Objet * @param array $columns * @return array|string[] */ - public static function insertInDatabase(String $tableName, array $columns) : array + public static function addObject(String $tableName, array $columns) : array { - $result["status"] = "sucess"; - $result["message"] = "Insertion réussie."; + $result["status"] = "success"; + $result["message"] = "Insertion réussie"; // On va vérifier que $tableName est bien en format alphanumérique if(!isAlphaNumeric($tableName)){ @@ -92,4 +92,36 @@ class Objet return $result; } + + /** + * Permet de décrire une table représentant un objet. + * @param $tableName + * @return array + */ + public static function describeObject($tableName) : array + { + if(!isAlphaNumeric($tableName)){ + return [ + "status" => "fail", + "message" => "Le format du nom de la table est incorrect.", + "columns" => [] + ]; + }else{ + try{ + $query = Database::pdo()->query("DESCRIBE {$tableName}"); + $columns = $query->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + return [ + "status" => "fail", + "message" => $e->getMessage(), + "columns" => [] + ]; + } + + return [ + "status" => "success", + "columns" => $columns + ]; + } + } } \ No newline at end of file diff --git a/TP6/resources/views/components/navbar.php b/TP6/resources/views/components/navbar.php index e37a42b..33f52ea 100644 --- a/TP6/resources/views/components/navbar.php +++ b/TP6/resources/views/components/navbar.php @@ -18,7 +18,7 @@ <a class="nav-link" href="?action=lireLivres">Liste des livres</a> </li> <li class="nav-item"> - <a class="nav-link" href="?action=creerAuteur">Créer un auteur</a> + <a class="nav-link" href="?action=creerObjet">Créer un objet</a> </li> </ul> </div> diff --git a/TP6/resources/views/formulaire-creation-objet.php b/TP6/resources/views/formulaire-creation-objet.php index a2cfbc6..60bc025 100644 --- a/TP6/resources/views/formulaire-creation-objet.php +++ b/TP6/resources/views/formulaire-creation-objet.php @@ -4,26 +4,123 @@ @section('content') <div class="container mt-3"> + <noscript> + <div class="alert alert-danger">L'activation de Javascript est nécessaire sur la page.</div> + </noscript> @if(!empty($insertMessage)) - <div class="alert alert-{{ $insertMessage["type"] }}" role="alert">{{ $insertMessage["text"] }}</div> + <div class="alert alert-{{ $insertMessage["status"] }}" role="alert"> + @if(!empty($insertMessage["pdoError"])) + <strong>{{ $insertMessage["message"] }}</strong> + <br>{{ $insertMessage["pdoError"] }} + @else + {{ $insertMessage["message"] }} + @endif + </div> @endif <h1>{{ $pageTitle }}</h1> - <form action="index.php" method="get" class="col-6"> - <input hidden name="action" value="creerAuteur"> - <div class="mb-3"> - <label class="form-label" for="nom">Nom</label> - <input class="form-control" type="text" name="nom" placeholder="nom" required> - </div> - <div class="mb-3"> - <label class="form-label" for="nom">Prénom</label> - <input class="form-control" type="text" name="prenom" placeholder="prenom" required> - </div> - <div class="mb-3"> - <label class="form-label" for="anneeNaissance">Année de naissance</label> - <input class="form-control" type="number" name="anneeNaissance" placeholder="Année de naissance" required> - </div> - <button type="submit" class="btn btn-primary">Créer</button> + + + <div class="col-6 border rounded bg-light p-2"> + <h5>Type d'objet à créer</h5> + <select id="objectType" class="form-select form-select-sm" aria-label=".form-select-sm example"> + <option value="dontchooseme" selected>Choisissez un objet dans la liste</option> + <option value="Auteur">Auteur (oui c'est triste mais on les considère comme tel dans le code :c)</option> + <option value="Adherent">Adhérent (est-ce surprenant du coup?)</option> + <option value="Livre">Livre</option> + </select> + </div> + <form action="index.php" method="post" class="col-6 mt-2" id="objectForm"> </form> </div> + +<script type="text/javascript"> + const objectForm = document.getElementById("objectForm"); + const selectObjectType = document.getElementById("objectType"); + selectObjectType.addEventListener('change', function (){ + if(selectObjectType.value !== 'dontchooseme') { + loadObjectTypeForm(selectObjectType.value); + } + }) + const typesList = { + "int" : "number", + "varchar" : "text", + "date" : "date" + }; + + async function loadObjectTypeForm(objectType){ + objectForm.innerHTML = ""; + + await fetch('?action=creerObjet&describeTable=' + objectType) + .then(res => res.json()) + .then((out) => { + console.log('Output: ', out); + + let objectName = document.createElement("input"); + objectName.name = "objectName"; + objectName.setAttribute("value", objectType); + objectName.hidden = true; + objectForm.appendChild(objectName); + + if(out.status === "success"){ + for(let i = 0; i < out.columns.length; i++){ + // On évite de proposer les clés primaires auto incrémentables + if(out.columns[i].Extra !== "auto_increment"){ + let columnType = out.columns[i].Type; + let match = columnType.match(/([a-z]*)/); + objectForm.appendChild( + createInputDiv( + typesList[match[1]], + out.columns[i].Field + ) + ); + } + } + }else{ + let errorAlert = document.createElement("div"); + errorAlert.classList.add("alert"); + errorAlert.classList.add("alert-danger"); + errorAlert.innerHTML = "<b>Erreur lors de la récupération des spécifications de l'objet " + objectType + "</b><br>" + out.message; + objectForm.appendChild(errorAlert); + } + }).catch(err => console.error(err)); + + let actionInput = document.createElement("input"); + actionInput.name = "action"; + actionInput.value = "creerObjet"; + actionInput.hidden = true; + + objectForm.appendChild(actionInput); + + let submitButton = document.createElement("button"); + submitButton.type = "submit"; + submitButton.classList.add("btn"); + submitButton.classList.add("btn-primary"); + submitButton.innerText = "Créer"; + + objectForm.appendChild(submitButton); + } + + function createInputDiv(type, name){ + let mainContainer = document.createElement("div"); + mainContainer.classList.add("mb-3"); + + let label = document.createElement("label"); + label.classList.add("form-label"); + label.setAttribute("for", name); + label.innerText = name; + + mainContainer.appendChild(label); + + let input = document.createElement("input"); + input.classList.add("form-control"); + input.type = type; + input.name = name; + input.required = true; + + mainContainer.appendChild(input); + + return mainContainer; + } +</script> @endsection \ No newline at end of file -- GitLab