diff --git a/app/controller/AdminController.php b/app/controller/AdminController.php index fc80149564ad8a5b6d07bae439fc7d9e42b75c5a..7693aea89d77f24501f27267f4f817f8321bcf4f 100644 --- a/app/controller/AdminController.php +++ b/app/controller/AdminController.php @@ -500,6 +500,7 @@ class AdminController extends Controller { public function verifyModifPartieStep2() { + $id = $this->route["params"]["slug"]; session_start(); if (!isset($_SESSION['jeu_select'])) { self::error("<h1>Erreur : le jeu doit être renseigné.</h1>", "step0"); @@ -531,7 +532,6 @@ class AdminController extends Controller { } } - $scores = $_POST["scores"]; foreach ($scores as $s) { if (!is_numeric($s)) { @@ -553,11 +553,9 @@ class AdminController extends Controller { self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "stepe2"); die(); } - - $pb = Partie::modPartie($equipes, $scores, $jeu, $_SESSION['id_partie']); + $pb = Admin::ModifPartie($id,$equipes, $scores, $jeu); if (!$pb) { unset($_SESSION['equipes']); - unset($_SESSION['id_partie']); unset($_SESSION['jeu_select']); header('Location:valid'); // Redirection vers la page OK die(); @@ -581,11 +579,9 @@ class AdminController extends Controller { self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "step2"); die(); } - $pb = Partie::modPartie($joueurs, $scores, $jeu, $_SESSION['id_partie']); + $pb = Admin::ModifPartie($id, $joueurs, $scores, $jeu); if (!$pb) { unset($_SESSION['jeu_select']); - - unset($_SESSION['id_partie']); unset($_SESSION['joueurs_select']); //self::error("<h1>DEBUGGING</h1>", "step2"); //die(); @@ -604,5 +600,4 @@ class AdminController extends Controller { } } } - } diff --git a/app/model/Admin.php b/app/model/Admin.php index 3a6a101612c7ef7c52aa0f8797ee8dae73f62d50..7729150682dce4d0c0346f0e5797bdb9871c5e32 100644 --- a/app/model/Admin.php +++ b/app/model/Admin.php @@ -165,6 +165,18 @@ class Admin extends Model { return $res; } + public static function getListeScorePartie2($id) { + $db = Database::getInstance(); // on récupère la connexion à la BDD + $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug. + $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs) + $req->execute(array(':id' => $id)); + $res = array(); + while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste + $res[] = $ligne['score_partie']; + } + return $res; + } + public static function getListeClassement($id) { $db = Database::getInstance(); // on récupère la connexion à la BDD $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug. @@ -177,4 +189,161 @@ class Admin extends Model { return $res; } + public static function getListeClassement2($id) { + $db = Database::getInstance(); // on récupère la connexion à la BDD + $sql = "SELECT * FROM R_joueur_partie WHERE partie = :id ORDER BY classement"; // on définit la requête qu'on enverra (on considère que le slug contient jeu/nomDuJeu pour le classement par jeu. Donc il faudrait encore faire un explode() sur le slug. + $req = $db->prepare($sql); // on prépare la requête (c'est là que la mémthode __call() est utile dans la classe Database d'ailleurs) + $req->execute(array(':id' => $id)); + $res = array(); + while($ligne = $req->fetch(PDO::FETCH_ASSOC)) { // parcours toute la liste + $res[] = $ligne['classement']; + } + return $res; + } + + public static function ModifPartie($id, $joueurs, $scores, $jeu) + { + $db = Database::getInstance(); + $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;"; + $stmt5 = $db->prepare($sql5); + + $partieModif = Partie::getFromId($id); + // recherche des joueurs ayant fais une partie apres celle-ci (celle-ci incluse) + $sql1 = "SELECT * FROM R_joueur_partie JOIN R_partie ON R_joueur_partie.partie = R_partie.id WHERE date >= date(:date) AND jeu =:jeu ORDER BY date"; + $stmt1 = $db->prepare($sql1); + $stmt1->execute(array(':date' => $partieModif->date, ":jeu" => $partieModif->jeu)); + // pour tout les joueurs remettre les scrores comme-ci aucune partie après celle-ci a été jouée + $joueurDejaTraite = array(); + while ($joueur = $stmt1->fetch(PDO::FETCH_ASSOC)) { + if (!in_array($joueur['joueur'], $joueurDejaTraite)) { + $joueurDejaTraite[] = $joueur['joueur']; + $stmt5->execute(array(':new_score' => $joueur['score'], + ':id_joueur' => $joueur['joueur'], + ':id_jeu' => $joueur['jeu'])); + } + } + // applique la partie + if (($resp = self::appliquePartie($id, $joueurs, $scores, $jeu)) > 0){ + print $resp; + die(); + } + // pour chaque partie apres celle modifier on la réapplique avec les nouveaux scores + $sql2 = "SELECT * FROM R_partie WHERE date > date(:date) AND jeu =:jeu ORDER BY date"; + $stmt2 = $db->prepare($sql2); + $stmt2->execute(array(':date' => $partieModif->date, ":jeu" => $partieModif->jeu)); + while ($ligne = $stmt2->fetch(PDO::FETCH_ASSOC)) { + $joueurs = $jeu->type == 'equipes' ? Admin::getEquipes($ligne['id']) : Admin::getListeJoueur($ligne['id']); + $scores = $jeu->type_scores == 'scores' ? Admin::getListeScorePartie2($ligne['id']) : Admin::getListeClassement2($ligne['id']); + self::appliquePartie($ligne['id'],$joueurs, $scores, $jeu); + } + + } + + + static function appliquePartie($id_partie, $joueurs, $scores, $jeu) { + $db = Database::getInstance(); + $sql3 = "SELECT score FROM R_joueur_jeu WHERE joueur = :id_joueur AND jeu = :id_jeu;"; + $sql4 = "UPDATE R_joueur_partie SET classement = :classement, score = :score, score_partie = :score_partie + WHERE joueur = :joueur AND partie = :partie;"; + $sql5 = "UPDATE R_joueur_jeu SET score = :new_score WHERE joueur = :id_joueur AND jeu = :id_jeu;"; + $sqlN = "INSERT INTO R_joueur_jeu (joueur, jeu, score) VALUES (:id_joueur, :id_jeu, :score);"; + $stmt3 = $db->prepare($sql3); + $stmt4 = $db->prepare($sql4); + $stmt5 = $db->prepare($sql5); + + $m = count($scores); + + $old_score = array_fill(0, $m, 0); + $old_score_e = array(); + foreach ($joueurs as $k => $joueur) { + // version avec équipes + if ($jeu->type == 'equipes') { + $old_score_e[$k] = array(); + foreach ($joueur as $kj => $j) { + if ($stmt3->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug))) { + if ($row = $stmt3->fetch()) { + // Le joueur a déja joué à ce jeu + $old_score_e[$k][$kj] = $row[0]; + } else { + // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation. + $old_score_e[$k][$kj] = 1000; + $stmtN = $db->prepare($sqlN); + if ($stmtN->execute(array(":id_joueur" => $j->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) { + + } else + return 2; + } + } + } + $old_score[$k] = array_sum($old_score_e[$k]) / count($old_score_e[$k]); + } else { + // récupération du score actuel de chaque joueur + if ($stmt3->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug))) { + if ($row = $stmt3->fetch()) { + // Le joueur a déja joué à ce jeu + $old_score[$k] = $row[0]; + } else { + // ou le joueur n'a jamais joué à ce jeu, on je rajoute à la relation. + $old_score[$k] = 1000; + $stmtN = $db->prepare($sqlN); + if ($stmtN->execute(array(":id_joueur" => $joueur->slug, ":id_jeu" => $jeu->slug, ":score" => 1000))) { + + } else + return 2; + } + + } + } + } + // Calcul de la nouvelle différence de scores et du classement de chacun dans la partie + $diff_scores = ELO_scores($old_score, $scores, 32); + $classement = Partie::calcul_classement($diff_scores); + foreach ($joueurs as $k => $joueur) { + if ($jeu->type_scores == 'classement'){ + $score = null; + } + else{ + $score = $scores[$k]; + } + if ($jeu->type == 'equipes') { + foreach ($joueur as $kj => $j) { + // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie + // et le score de la partie) pour chaque joueur par équipe + if ($stmt4->execute(array(":partie" => $id_partie, + ":joueur" => $j->slug, + ":classement" => $classement[$k], ":score" => $old_score_e[$k][$kj], ":score_partie" => $score)) + ) { + $newS = $old_score_e[$k][$kj] + $diff_scores[$k]; + // On met à jour le score du joueur actuel dans sa relation avec le jeu + if ($stmt5->execute(array(":new_score" => $newS, + ":id_jeu" => $jeu->slug, ":id_joueur" => $j->slug)) + ) { + } else + return 4; + } else + return 3; + } + } else { + // Insertion des infos de la partie (avec le score avant la partie et le classement interne à la partie + // et le score de la partie) pour chaque joueur + + if ($stmt4->execute(array(":partie" => $id_partie, + ":joueur" => $joueur->slug, + ":classement" => $classement[$k], ":score" => $old_score[$k], ":score_partie" => $score)) + ) { + $newS = $old_score[$k] + $diff_scores[$k]; + // On met à jour le score du joueur actuel dans sa relation avec le jeu + if ($stmt5->execute(array(":new_score" => $newS, + ":id_jeu" => $jeu->slug, ":id_joueur" => $joueur->slug)) + ) { + } else + return 4; + } else + return 3; + } + } + // met à jour le classement de tous les joueurs + return Partie::updateClassement($jeu); + } + } \ No newline at end of file diff --git a/app/model/Partie.php b/app/model/Partie.php index 6ae8ae8fbe1fa8efa4edb9ba94544b7afd5f1a8a..684b5ebc73edd6f73fa9fbd79cdb4639b9f8218e 100644 --- a/app/model/Partie.php +++ b/app/model/Partie.php @@ -44,7 +44,7 @@ class Partie extends Model return false; // on aurait pu mettre deux return (un dans le if et un ici), mais bon... } - private static function calcul_classement($R) + public static function calcul_classement($R) { $m = count($R);