From 3b039f83638a6c97a689ddc1cb97fbc5ef204589 Mon Sep 17 00:00:00 2001
From: SofianeLasri <alasri250@gmail.com>
Date: Tue, 29 Nov 2022 20:40:00 +0100
Subject: [PATCH] =?UTF-8?q?TP8=20Ex1=20&=202=20termin=C3=A9s.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md                       |  2 ++
 controller/ControleurAuteur.php |  5 ++-
 controller/ControleurLivre.php  |  2 ++
 index.php                       |  2 ++
 models/Auteur.php               | 21 +++++++++++-
 models/Livre.php                | 61 +++++++++++++++++++++++++++++++++
 models/Objet.php                |  6 ++--
 resources/views/data-grid.php   |  8 +++++
 8 files changed, 102 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index cdc4a95..41d92b2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
 # Documentation
+**Note :** Non mise à jour depuis le TP7 (ou TP6). La gestion des erreurs et des retours de résultat a changé depuis. Les définitions des fonctions restent cependant pour la plupart encore valables.
+
 ## Objet
 Les fonctions publiques statiques retournent des arrays se basant sur ce format :
 ````php
diff --git a/controller/ControleurAuteur.php b/controller/ControleurAuteur.php
index 2cabde1..db27686 100644
--- a/controller/ControleurAuteur.php
+++ b/controller/ControleurAuteur.php
@@ -22,6 +22,8 @@ class ControleurAuteur extends ControleurObjet
             $object['title'] = $auteur->prenom . " " . $auteur->nom;
             $object['desc'] = "ID: $auteur->numAuteur<br>Date de naissance: $auteur->anneeNaissance";
             $object['url'] = "index.php?action=lireAuteur&numAuteur=$auteur->numAuteur";
+            $object['specialLink']['text'] = '<span><i class="fa fa-flag"></i> Définir ses nationalités</span>';
+            $object['specialLink']['url'] = "index.php?action=definirNationalites&numAuteur=$auteur->numAuteur";
             $objects[] = $object;
         }
         return view('data-grid', [
@@ -49,6 +51,7 @@ class ControleurAuteur extends ControleurObjet
 
     public static function definirNationalites(): string
     {
-        return "";
+        $auteurs = Auteur::getAuteursByNumLivre(15);
+        return print_r($auteurs);
     }
 }
diff --git a/controller/ControleurLivre.php b/controller/ControleurLivre.php
index 48e0225..8d47615 100644
--- a/controller/ControleurLivre.php
+++ b/controller/ControleurLivre.php
@@ -23,6 +23,8 @@ class ControleurLivre extends ControleurObjet
             $object['title'] = $livre->titre;
             $object['desc'] = "ID: $livre->numLivre<br>Année de parution: $livre->anneeParution";
             $object['url'] = "index.php?action=lireLivre&numLivre=$livre->numLivre";
+            $object['specialLink']['text'] = '<span><i class="fa fa-users"></i> Définir les auteurs</span>';
+            $object['specialLink']['url'] = "index.php?action=definirAuteurs&numLivre=$livre->numLivre";
             $objects[] = $object;
         }
         return view('data-grid', [
diff --git a/index.php b/index.php
index 3bdc285..03d008d 100644
--- a/index.php
+++ b/index.php
@@ -31,6 +31,8 @@ if (empty($_REQUEST["action"])) {
             "describeTable"  => ControleurObjet::describeTable(),
             "modifierObjet"  => ControleurObjet::modifyObject(),
             "supprimerObjet" => ControleurObjet::supprimerObjet(),
+            "definirAuteurs" => ControleurLivre::definirAuteurs(),
+            "definirNationalites" => ControleurAuteur::definirNationalites(),
             default          => ControleurAuteur::lireAuteur(),
         };
     } catch (Exception $e) {
diff --git a/models/Auteur.php b/models/Auteur.php
index da14485..e005950 100644
--- a/models/Auteur.php
+++ b/models/Auteur.php
@@ -33,7 +33,7 @@ class Auteur extends Objet
         return $tableau;
     }
 
-    public static function getAuteurByNum($numAuteur)
+    public static function getAuteurByNum($numAuteur): Auteur
     {
         // écriture de la requête
         $requetePreparee = "SELECT * FROM Auteur WHERE numAuteur = :num_tag;";
@@ -56,6 +56,25 @@ class Auteur extends Objet
         return $response;
     }
 
+    /**
+     * Récupère les auteurs d'un livre.
+     * @param int $i
+     * @return array
+     * @throws ErrorException
+     */
+    public static function getAuteursByNumLivre(int $i): array
+    {
+        // On prépare la requête
+        $queryString = ("SELECT * FROM Auteur NATURAL JOIN estAuteurDe WHERE numLivre = ?");
+        $query = Database::pdo()->prepare($queryString);
+        try{
+            $query->execute([$i]);
+        } catch (PDOException $e) {
+            throw new ErrorException($e->getMessage());
+        }
+        return $query->fetchAll(PDO::FETCH_CLASS, 'Auteur');
+    }
+
     // méthode static qui retourne un auteur identifié par son numAuteur
 
     public function afficher()
diff --git a/models/Livre.php b/models/Livre.php
index bde6024..4691948 100644
--- a/models/Livre.php
+++ b/models/Livre.php
@@ -64,6 +64,67 @@ class Livre extends Objet
         return $response;
     }
 
+    /**
+     * Récupère les auteurs n'ayant pas écrit ce livre.
+     * @param int $i
+     * @return array
+     * @throws ErrorException
+     */
+    public static function getNonAuteursByNumLivre(int $i): array
+    {
+        // On prépare la requête
+        $queryString = ("SELECT * FROM Auteur WHERE numAuteur NOT IN (SELECT numAuteur FROM Auteur NATURAL JOIN estAuteurDe WHERE numLivre = ?)");
+        $query = Database::pdo()->prepare($queryString);
+        try{
+            $query->execute([$i]);
+        } catch (PDOException $e) {
+            throw new ErrorException($e->getMessage());
+        }
+        return $query->fetchAll(PDO::FETCH_CLASS, 'Auteur');
+    }
+
+    /**
+     * Supprime un auteur d'un livre
+     * @param int $numLivre
+     * @param int $numAuteur
+     * @return void
+     */
+    public static function deleteAuteurForLivre(int $numLivre, int $numAuteur): void
+    {
+        // On prépare la requête
+        $queryString = ("DELETE FROM estAuteurDe WHERE numAuteur = :numAuteur AND numLivre = :numLivre");
+        $query = Database::pdo()->prepare($queryString);
+        try{
+            $query->execute([
+                "numAuteur" => $numAuteur,
+                "numLivre" => $numLivre
+            ]);
+        } catch (PDOException $e) {
+            throw new ErrorException($e->getMessage());
+        }
+    }
+
+    /**
+     * Ajout un auteur à un livre
+     * @param int $numLivre
+     * @param int $numAuteur
+     * @return void
+     */
+    public static function addAuteurForLivre(int $numLivre, int $numAuteur): void
+    {
+        // On prépare la requête
+        $queryString = ("INSERT INTO estAuteurDe (numAuteur, numLivre) VALUES (:numAuteur, :numLivre)");
+        $query = Database::pdo()->prepare($queryString);
+        try{
+            $query->execute([
+                "numAuteur" => $numAuteur,
+                "numLivre" => $numLivre
+            ]);
+        } catch (PDOException $e) {
+            throw new ErrorException($e->getMessage());
+        }
+    }
+
     /**
      * @return string
      */
diff --git a/models/Objet.php b/models/Objet.php
index 614f259..149b867 100644
--- a/models/Objet.php
+++ b/models/Objet.php
@@ -156,15 +156,15 @@ class Objet
 
         // On prépare la requête
         $queryString = ("SELECT * FROM $tableName WHERE " . $id["name"] . "=?");
-        $insertQuery = Database::pdo()->prepare($queryString);
+        $query = Database::pdo()->prepare($queryString);
         try {
             // Et on l'exécute
-            $insertQuery->execute([$id["value"]]);
+            $query->execute([$id["value"]]);
         } catch (PDOException $e) {
             throw new ErrorException($e->getMessage());
         }
 
-        return $insertQuery->fetch(PDO::FETCH_ASSOC);
+        return $query->fetch(PDO::FETCH_ASSOC);
     }
 
     /**
diff --git a/resources/views/data-grid.php b/resources/views/data-grid.php
index a0a6b07..ee9de8b 100644
--- a/resources/views/data-grid.php
+++ b/resources/views/data-grid.php
@@ -30,6 +30,14 @@
                                     <span><i class="fa fa-pencil"></i> Modifier</span>
                                 </a>
                             </li>
+                            @if(!empty($object['specialLink']))
+                            <li>
+                                <a class="btn btn-sm btn-outline-primary d-flex align-items-center ms-2"
+                                   href="{{ $object['specialLink']['url'] }}">
+                                    {{ $object['specialLink']['text'] }}
+                                </a>
+                            </li>
+                            @endif
                             <li>
                                 <a class="btn btn-sm btn-outline-danger d-flex align-items-center ms-2"
                                    href="index.php?action=supprimerObjet&tableName={{ $object['type'] }}&idName={{ $object['idName'] }}&idValue={{ $object['idValue'] }}">
-- 
GitLab