diff --git a/app/controller/AdminController.php b/app/controller/AdminController.php index f75758e9dd7698f67cb7d5dfe2a5db9f2c016b3b..fc80149564ad8a5b6d07bae439fc7d9e42b75c5a 100644 --- a/app/controller/AdminController.php +++ b/app/controller/AdminController.php @@ -119,11 +119,15 @@ class AdminController extends Controller { if($jeuactuel->type == "equipes"){ $_SESSION['equipes'] = Admin::getEquipes($id); $_SESSION['jeu_select'] = $jeuactuel; + $_SESSION['id_partie'] = $id; header("location:modif/stepe1"); + die(); } else { $_SESSION['joueurs_select'] = Admin::getListeJoueur($id); $_SESSION['jeu_select'] = $jeuactuel; + $_SESSION['id_partie'] = $id; header("location:modif/step1"); + die(); } } @@ -494,4 +498,111 @@ class AdminController extends Controller { $this->view->display(); } + public function verifyModifPartieStep2() + { + session_start(); + if (!isset($_SESSION['jeu_select'])) { + self::error("<h1>Erreur : le jeu doit être renseigné.</h1>", "step0"); + die(); + } + + $jeu = $_SESSION['jeu_select']; + if ($jeu->type == 'equipes') { + if (!isset($_SESSION['equipes'])){ + header("Location:stepe1"); + die(); + } + } + else { + if (!isset($_SESSION['joueurs_select'])) { + header("Location:step1"); + die(); + } + } + + if (!isset($_POST['scores'])) { + if ($jeu->type == 'equipes') { + self::error("<h1>Erreur : variables absentes</h1>", "stepe2"); + die(); + } + else { + self::error("<h1>Erreur : variables absentes</h1>", "step2"); + die(); + } + } + + + $scores = $_POST["scores"]; + foreach ($scores as $s) { + if (!is_numeric($s)) { + if ($jeu->type == 'equipes') { + self::error("<h1>Erreur : les scores doivent être des nombres.</h1>", "stepe2"); + die(); + } + else { + self::error("<h1>Erreur : les scores doivent être des nombres.</h1>", "step2"); + die(); + } + } + } + if ($jeu->type == 'equipes') { + $equipes = $_SESSION['equipes']; + $ns = count($scores); + $nj = count($equipes); + if ($ns != $nj) { + self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "stepe2"); + die(); + } + + $pb = Partie::modPartie($equipes, $scores, $jeu, $_SESSION['id_partie']); + if (!$pb) { + unset($_SESSION['equipes']); + unset($_SESSION['id_partie']); + unset($_SESSION['jeu_select']); + header('Location:valid'); // Redirection vers la page OK + die(); + } + switch ($pb) { + case 2: + self::error("<h1>Erreur de connexion à la BD.</h1>", "stepe2"); + die(); + break; + default: + self::error("<h1>Erreur non gérée.</h1>", "stepe2"); + die(); + break; + } + } + else { + $joueurs = $_SESSION['joueurs_select']; + $ns = count($scores); + $nj = count($joueurs); + if ($ns != $nj) { + self::error("<h1>Erreur : scores et joueurs incohérents</h1>", "step2"); + die(); + } + $pb = Partie::modPartie($joueurs, $scores, $jeu, $_SESSION['id_partie']); + if (!$pb) { + unset($_SESSION['jeu_select']); + + unset($_SESSION['id_partie']); + unset($_SESSION['joueurs_select']); + //self::error("<h1>DEBUGGING</h1>", "step2"); + //die(); + header('Location:valid'); // Redirection vers la page OK + die(); + } + switch ($pb) { + case 2: + self::error("<h1>Erreur de connexion à la BD.</h1>", "step2"); + die(); + break; + default: + self::error("<h1>Erreur non gérée.</h1>", "step2"); + die(); + break; + } + } + } + } diff --git a/app/kernel/Router.php b/app/kernel/Router.php index 70f8405bc359ec79428821eca3e228eefaa334c1..7423e56422f8ecaf2c48e404bc73dee6b74f620b 100644 --- a/app/kernel/Router.php +++ b/app/kernel/Router.php @@ -341,6 +341,12 @@ class Router $result["params"]["slug"] = $parts[2]; } + else if($parts[0] == "admin" && count($parts) == 5 && $parts[1] == 'partie' && $parts[3] == 'modif' && $parts[4] == 'verifystep2') { + $result["controller"] = 'Admin'; + $result['action'] = "verifyModifPartieStep2"; + $result["params"]["slug"] = $parts[2]; + } + else if ($parts[0] == "add_partie" && count($parts) == 2 && $parts[1] == "addjoueurs1") { $result["controller"] = "Partie"; $result["action"] = "addjoueurs1"; diff --git a/app/model/Partie.php b/app/model/Partie.php index eea483c611e2e9c77995a3928c88443588e1cfcb..6ae8ae8fbe1fa8efa4edb9ba94544b7afd5f1a8a 100644 --- a/app/model/Partie.php +++ b/app/model/Partie.php @@ -84,6 +84,112 @@ class Partie extends Model return 0; } + public static function modPartie($joueurs, $scores, $jeu, $id_partie) + { + $db = Database::getInstance(); + $sql3 = "SELECT score FROM R_joueur_partie WHERE joueur = :id_joueur AND partie = :id_partie;"; + $sql4 = "UPDATE R_joueur_partie SET classement=:classement, score=:score, score_partie=:score_partie + WHERE partie=:partie AND joueur=:joueur;"; + $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_partie" => $id_partie))) { + 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[$k] = 1000; + $stmtN = $db->prepare($sqlN); + if ($stmtN->execute(array(":id_joueur" => $joueur->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_partie" => $id_partie))) { + if ($row = $stmt3->fetch()) { + // Le joueur a forcément 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 = self::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 2; + } else + return 2; + } + } 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 2; + } else + return 2; + } + } + + return self::updateClassement($jeu); + } + public static function addPartie($joueurs, $scores, $jeu) { $db = Database::getInstance();