diff --git a/php/.htaccess b/php/.htaccess index 095bf2a..9837fc7 100644 --- a/php/.htaccess +++ b/php/.htaccess @@ -1,6 +1,11 @@ - - RewriteEngine On - RewriteBase /php/public/ - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^(.*)$ index.php [QSA,L] - +#RewriteEngine On +# +#RewriteCond %{REQUEST_FILENAME} !-f +#RewriteCond %{REQUEST_FILENAME} !-d +#RewriteRule ^(.*)$ index.php/$1 [L] + + +RewriteEngine on +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule . index.php [L] + diff --git a/php/composer.json b/php/composer.json index 01808c9..38be522 100644 --- a/php/composer.json +++ b/php/composer.json @@ -1,6 +1,7 @@ { "require": { "twig/twig": "^3.0", + "twig/extensions": "^1.5", "ext-pdo": "*", "ext-fileinfo": "*" }, diff --git a/php/index.php b/php/index.php new file mode 100755 index 0000000..f0cf101 --- /dev/null +++ b/php/index.php @@ -0,0 +1,22 @@ + false, + 'debug' => true +]); +$twig->addExtension(new \Twig\Extension\DebugExtension()); +$twig->addGlobal('dir', '/SAE_2A_FA-Reseau_ALICA/php'); + + + + +$cont = new \App\controleur\FrontControleur(); diff --git a/php/public/css/accueil.css b/php/public/css/accueil.css index df44b3b..b8516c3 100755 --- a/php/public/css/accueil.css +++ b/php/public/css/accueil.css @@ -1,148 +1,30 @@ @import url(https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=Share+Tech+Mono&display=swap); *{ + margin: 0; + padding: 0; box-sizing: border-box; font-family: 'Poppins', sans-serif; - margin: 0; -} - -.main { - color: #212121; - font-size: 1rem; } - -.title-banner{ - text-align: center; -} - -.banner-img{ - width: 100%; - height: 250px; - object-fit: cover; +body{ + display: inline; + justify-content: center; + align-items: center; + min-height: 100vh; + background: #fff; } -.banner { +input{ position: relative; -} - -.title-banner { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: rgba(0, 0, 0, 0.5); - color: #fff; - padding: 10px; - border-radius: 5px; -} - -.title-banner .title{ - font-size: 35px; - color: #00DBFF; - font-weight: bold; -} - -.title-banner .subtitle{ - font-size: 20px; - color: #fff; -} - -.title-banner .description{ - font-size: 15px; + outline: none; + padding: 10px 20px; + border-radius: 10px; + letter-spacing: 1px; + font-size: 0.85em; + background-color: #00DBFF; color: #fff; -} - -.slideshow-container { - position: relative; - max-width: 70%; - margin: 0 auto; - padding: 30px; -} - -.slide { - width: 100%; - height: 350px; - border-radius: 20px; - border: #212121 1px solid; -} - -.slide-content { - display: flex; - width: 100%; -} - -.slide-img, -.slide-info { - width: 50%; - overflow: hidden; -} - -.slide-info{ - padding: 15px; -} - -.slide-title{ - font-size: 20px; - font-weight: bold; -} - -.slide-info .button{ - color: #00DBFF; - font-size: 14px; - padding: 5px; + cursor: pointer; text-transform: uppercase; - border-radius: 15px; - border: #00DBFF 2px solid; - display: inline-block; + font-weight: 600; margin-top: 10px; -} - -.slide-img img{ - height: 350px; - border-radius: 20px; -} - -.prevButton, .nextButton { - position: absolute; - top: 50%; - transform: translateY(-50%); - font-size: 24px; - background-color: black; - color: white; - padding: 8px 16px; border: none; - cursor: pointer; -} - -.prevButton { - left: 0; -} - -.nextButton { - right: 0; -} -.search{ - background-color: #212121; - padding: 50px 30px; - display: flex; - justify-content: center; - align-items: center; -} - -.search .search-bar{ - border-radius: 10px; - height: 40px; - width: calc(100% - 50px); - margin-right: 10px; -} - -.search .search-button{ - display: flex; - justify-content: center; - align-items: center; - width: 40px; - height: 40px; - border-radius: 10px; - background: #fff; - color: #212121; - vertical-align: middle; -} +} \ No newline at end of file diff --git a/php/public/css/connexion.css b/php/public/css/connexion.css index fceb9de..1853cc0 100755 --- a/php/public/css/connexion.css +++ b/php/public/css/connexion.css @@ -110,4 +110,4 @@ form{ color: #000; letter-spacing: 1px; font-size: 0.85em; -} \ No newline at end of file +} diff --git a/php/public/css/offres.css b/php/public/css/offres.css index de4ce90..01fa053 100644 --- a/php/public/css/offres.css +++ b/php/public/css/offres.css @@ -49,3 +49,12 @@ .row3 img { align-self: flex-start; } + +a{ + text-decoration: none; +} + +.current{ + + border-bottom: 1px solid black; +} diff --git a/php/public/index.php b/php/public/index.php deleted file mode 100755 index 2bce566..0000000 --- a/php/public/index.php +++ /dev/null @@ -1,16 +0,0 @@ - false, - 'debug' => true -]); -$twig->addExtension(new \Twig\Extension\DebugExtension()); -$cont = new \App\controleur\FrontControleur(); \ No newline at end of file diff --git a/php/src/TwigExtensions.php b/php/src/TwigExtensions.php deleted file mode 100644 index 64fe288..0000000 --- a/php/src/TwigExtensions.php +++ /dev/null @@ -1,24 +0,0 @@ - [ - "supprimerCompte", "consulterSignalement","supprimerOffre" - ], - "Moderateur" => [ - //TODO - ], - "Membre" => [ - "deconnexion","proposerOffre","consulterProfil","modifierProfil","signaler", - ], - "Utilisateur" => [ - - "connexion", "inscription", "accueil", "consulterProfilLimite", "publierOffre", "listerEvenement", "creerEvenement", "supprimerEvenement", "avoirDetailEvenement", "rechercherEvenement" - ] - ); - - $action = \App\config\Validation::nettoyerString($_GET["action"] ?? ""); - if(in_array($action,$actions['Admin'])) { - if (!isset($_SESSION["role"]) || $_SESSION["role"]!="admin") { - $dVueErreur[] = 'Veuillez vous connecter'; - echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]); - } else{ - new AdminControleur(); - } - } - else if(in_array($action,$actions['Moderateur'])) { - if (!isset($_SESSION["role"]) || ($_SESSION["role"]!="moderateur" && $_SESSION["role"]!="admin")) { - $dVueErreur[] = 'Veuillez vous connecter'; - echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]); - } else{ - new ModerateurControleur(); - } + + $router = new AltoRouter(); + + $router->setBasePath('/SAE_2A_FA-Reseau_ALICA/php'); + + $router->map('GET', '/', 'UtilisateurControleur'); + + $router->map('GET','/[a:action]?','UtilisateurControleur'); + + $router->map('POST','/[a:action]?','UtilisateurControleur'); + + $router->map('GET','/[a:action]/[i:id]?','UtilisateurControleur'); + + $router->map('GET|POST', '/user/[i:id]/[a:action]?', 'MembreControleur'); + + $router->map('GET|POST', '/admin/[i:id]/[a:action]?', 'AdminControleur'); + + $id = 0; + + $match = $router->match(); + + $action = array(); + + $id = array(); + + $twig->render("accueil.html",[]); + + if (!$match) { + + $dVueErreur[] = "Error 404 Page not found"; + echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]); } - else if(in_array($action,$actions['Membre'])) { - if (!isset($_SESSION["utilisateur"])) { - $dVueErreur[] = 'Veuillez vous connecter'; + + if ($match) { + + $controller = $match['target'] ?? NULL; + $action = $match['params']['action'] ?? NULL; + $id = $match['params']['id'] ?? NULL; + + //var_dump($match); + + try { + if ($controller == "MembreControleur") { + if ($_SESSION["utilisateur"]->getRole() != "Admin" || $_SESSION["utilisateur"]->getRole() != "Membre") { + + echo $twig->render("connection.html",['msg' => 'Vous devez vous connecter pour effectuer cette action']); + } + } + + if ($controller == "AdminControleur") { + $Alumni = $_SESSION["utilisateur"]; + if ($Alumni->getRole() != "Admin") { + $dVueErreur = ["Erreur : Vous n'avez pas les privileges pour cette action"]; + + global $twig; + echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]); + return; + } + } else { + $namespace = 'App\\Controleur\\'; + $controller = $namespace . $controller; + $controller = new $controller(); + } + + if (is_callable(array($controller, $action))) { + + call_user_func(array($controller, $action), $match['params']); + } else { + + $dVueErreur = ['Erreur : Action inconnue']; + + echo $twig->render('accueil.html', ['dVueErreur' => $dVueErreur]); + } + + } catch (Error $error) { + $dVueErreur = ['Erreur : Action inconnue']; + + + echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]); - } else{ - new MembreControleur(); } - }else{ - new UtilisateurControleur(); } } + } diff --git a/php/src/controleur/MembreControleur.php b/php/src/controleur/MembreControleur.php index 151c410..715c419 100755 --- a/php/src/controleur/MembreControleur.php +++ b/php/src/controleur/MembreControleur.php @@ -5,36 +5,12 @@ class MembreControleur extends UtilisateurControleur { public function __construct() { - global $twig; - if (!isset($_REQUEST["action"])) { - $action = NULL; - } else { - $action = \App\config\Validation::nettoyerString($_REQUEST["action"]); - } - switch ($action) { - case "deconnexion": - $this->deconnexion(); - break; - case "proposerOffre": - $this->proposerOffre(); - break; - case "consulterProfil": - $this->consulterProfil(); - break; - case "modifierProfil": - $this->modifierProfil(); - break; - case "signaler": - $this->signaler(); - break; - default: - parent::__construct(); - } } protected function deconnexion() { session_destroy(); + echo "on est passes ici"; header('Location: index.php?action=accueil'); exit(); } diff --git a/php/src/controleur/UtilisateurControleur.php b/php/src/controleur/UtilisateurControleur.php index b0192c6..a1a3b23 100755 --- a/php/src/controleur/UtilisateurControleur.php +++ b/php/src/controleur/UtilisateurControleur.php @@ -13,63 +13,9 @@ class UtilisateurControleur public function __construct() { - global $twig; - if (!isset($_REQUEST["action"])) { - $action = NULL; - } else { - $action = Validation::nettoyerString($_REQUEST["action"]); - } - switch ($action) { - case NULL: - case "accueil": - $this->accueil(); - break; - case "inscription_success": - $this->inscription_success(); - break; - case "connection": - $this->connection(); - break; - case "inscription": - $this->inscription(); - break; - case "consultOffers": - $this->consultOffers(); - break; - case "consulterProfilLimite": - $this->consulterProfilLimite(); - break; - case "createOffer": - $this->createOffer(); - break; - case "createOfferForm": - $this->createOfferForm(); - break; - case "displayOffer": - $this->displayOffer(); - break; - case "listerEvenement": - $this->listerEvenement(); - break; - case "creerEvenement": - $this->creerEvenement(); - break; - case "supprimerEvenement": - $this->supprimerEvenement(); - break; - case "avoirDetailEvenement": - $this->avoirDetailEvenement(); - break; - case "rechercherEvenement": - $this->rechercherEvenement(); - break; - default: - $dVueErreur[] = "Action inconnue ou non autorisée"; - echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]); - } } - protected function connection() + public function connection() { global $twig; $dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant @@ -83,7 +29,7 @@ class UtilisateurControleur if ($utilisateur instanceof Alumni) { $_SESSION['utilisateur'] = $utilisateur; - header('Location: index.php?action=accueil'); + header('Location: accueil'); exit(); } else { $dVueErreur[] = "L'adresse email ou le mot de passe est incorrect."; @@ -92,8 +38,9 @@ class UtilisateurControleur echo $twig->render('connection.html', ['dVueErreur' => $dVueErreur]); } - protected function inscription() + public function inscription() { + global $twig; $dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant $userModel = new UtilisateurModele(); @@ -114,21 +61,14 @@ class UtilisateurControleur $dVueErreur[] = "L'adresse email est déjà utilisée."; } } - try { - $nouvelUtilisateur = $userModel->inscription($prenom,$nom,$email, $hash); - if ($nouvelUtilisateur instanceof Alumni) { - header('Location: index.php?action=inscription_success'); - exit(); - } else { - $dVueErreur[] = "L'inscription a échoué, veuillez réessayer."; - } - } catch (\Exception $e) { + $nouvelUtilisateur = $userModel->inscription($prenom,$nom,$email, $hash); + + if ($nouvelUtilisateur instanceof Alumni) { + echo $twig->render('inscription_success.html'); + exit(); + } else { $dVueErreur[] = "L'inscription a échoué, veuillez réessayer."; - $twig->render('inscription.html', ['dVueErreur' => $dVueErreur]); } - - - } echo $twig->render('inscription.html', ['dVueErreur' => $dVueErreur]); } @@ -153,25 +93,29 @@ class UtilisateurControleur echo $twig->render('accueil.html', ['prenom' => $prenom, 'nom' => $nom, 'id' => $id,"eventsList"=>$evenements]); } - protected function inscription_success() - { - global $twig; - echo $twig->render('inscription_success.html'); - } - protected function consulterProfilLimite() + public function consulterProfilLimite() { //TODO + echo 'not implemented yet'; } - protected function consultOffers() + public function consultOffers() { - $offerMdl = new OffreModele(); + + $userMdl = new UtilisateurModele(); global $twig; $niveauEtudes=null; $typeContrat=null; $exp = null; + $role = NULL; + if(isset($_SESSION['utilisateur'])) + { + $role = $_SESSION['utilisateur']->getRole() ; + } + + $nbOffers = 5 ; if(isset($_GET["niveauEtudes"]) && Validation::validateTypeStudies($_GET["niveauEtudes"])) { @@ -187,31 +131,30 @@ class UtilisateurControleur } if ($niveauEtudes == null && $typeContrat == null && $exp == null) { - $totalOffers = $offerMdl->getNbOffers(); + $totalOffers = $userMdl->getNbOffers(); } else { $params = array( 'typeContrat' => $typeContrat, 'exp' => $exp, 'niveauEtudes' => $niveauEtudes, + 'role' => $role ); - $offers = $offerMdl->getOffersWithFilters($params); + $offers = $userMdl->getOffersWithFilters($params); $totalOffers = count($offers); } $numberPages = ceil($totalOffers / 5); - if($numberPages == 0 ) - { - - echo $twig->render("erreur.html",['dVueErreur' => ['Aucune Offre Trouvée']]); - return; + $msg = NULL; + if($numberPages == 0 ) { + $msg = 'Aucune Offre Trouvée'; } if (isset($_GET["page"]) && intval($_GET["page"]) != null) { $page = intval($_GET["page"]); if ($page > $numberPages || $page < 1) { $dVueErreur[] = "Page introuvable"; - echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]); + echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur ]); return; } } else { @@ -221,11 +164,11 @@ class UtilisateurControleur $start = intval(($page - 1) * 5); if ($niveauEtudes == null && $typeContrat == null && $exp == null) { - $offers = $offerMdl->getOfferLimit($start, $nbOffers); + $offers = $userMdl->getOfferLimit($start, $nbOffers); } else { $params['start'] = $start; $params['nbOffers'] = 5; - $offers = $offerMdl->getOffersWithFilters($params); + $offers = $userMdl->getOffersWithFilters($params); } /* echo "filtre :".$niveauEtudes."
"; @@ -233,25 +176,27 @@ class UtilisateurControleur echo "filtre :".$exp."
";*/ echo $twig->render('OffersList.html', [ + 'msg' => $msg, 'offres' => $offers, 'numberPages' => $numberPages, 'currentPage' => $page, - 'typeContrat' => (($typeContrat != null ? $typeContrat : "")), - 'experience' => (($exp != null ? $exp : "")), - 'niveauEtudes' => (($niveauEtudes != null ? $niveauEtudes : "")), - 'valContrat' => (($typeContrat != null ? "&typeContrat=".$typeContrat : "")), - 'valExp' => (($exp != null ? "&experience=".$exp : "")), - 'valEtudes' => (($niveauEtudes != null ? "&niveauEtudes=".$niveauEtudes : "")) + 'typeContrat' => (($typeContrat != null) ? $typeContrat : ""), + 'experience' => (($exp != null) ? $exp : ""), + 'niveauEtudes' => (($niveauEtudes != null) ? $niveauEtudes : ""), + 'valContrat' => (($typeContrat != null) ? "&typeContrat=".$typeContrat : ""), + 'valExp' => (($exp != null) ? "&experience=".$exp : ""), + 'valEtudes' => (($niveauEtudes != null) ? "&niveauEtudes=".$niveauEtudes : ""), + 'role' => $role ]); } - protected function createOfferForm() + public function createOfferForm() { global $twig; echo $twig->render("CreerOffre.html", []); } - protected function createOffer() + public function createOffer() { global $twig; $taberror = []; @@ -304,10 +249,10 @@ class UtilisateurControleur $saveImg1 = ImageSaver::SaveImage("image"); $saveImg2 = ImageSaver::SaveImage("logo"); if($saveImg1[0] && $saveImg2[0]) { - $offreMdl = new OffreModele(); + $mbrModel = new MembreModele(); - $offre = $offreMdl->publishOffer($saveImg1[1], $saveImg2[1]); + $offre = $mbrModel->publishOffer($saveImg1[1], $saveImg2[1]); echo $twig->render("OffreDetailTest.html", ['offre' => $offre]); } @@ -319,14 +264,14 @@ class UtilisateurControleur } } - public function displayOffer() + public function displayOffer(?array $params) { global $twig; - if (isset($_GET["id"]) && intval($_GET["id"]) != null) + if (isset($params['id']) && intval($params['id']) != null) { - $offreMdl = new OffreModele(); - $offre = $offreMdl->getOfferFromId(intval($_GET["id"])); + $uttilsMdl = new UtilisateurModele(); + $offre = $uttilsMdl->getOfferFromId(intval($params["id"])); if($offre != NULL) { echo $twig->render("OffreDetailTest.html",['offre' => $offre]); @@ -337,7 +282,7 @@ class UtilisateurControleur echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]); } - protected function listerEvenement() + public function listerEvenement() { $mdl = new UtilisateurModele(); $evenements = $mdl->getEvenement(); @@ -346,7 +291,7 @@ class UtilisateurControleur echo $twig->render('evenement.html', ['evenements' => $evenements]); } - protected function creerEvenement() + public function creerEvenement() { global $twig; @@ -367,30 +312,37 @@ class UtilisateurControleur } } - protected function supprimerEvenement() + public function supprimerEvenement(?array $params) { $mdl = new UtilisateurModele(); - $mdl->deleteEvenement($_GET["id"]); + $mdl->deleteEvenement($params["id"]); $this->listerEvenement(); } - protected function avoirDetailEvenement() + public function avoirDetailEvenement(?array $params) { $mdl = new UtilisateurModele(); - $evenement = $mdl->getEvenementById($_GET["id"]); - global $twig; - echo $twig->render('detailEvenement.html', ['evenement' => $evenement]); + + if(isset($params['id'])) + { + $evenement = $mdl->getEvenementById($params['id']); + + + echo $twig->render('detailEvenement.html', ['evenement' => $evenement]); + } + else echo $twig->render('erreur.html', ['dVueErreur' => ['erreur id evenement']]); + + } - protected function rechercherEvenement() + public function rechercherEvenement() { $mdl = new UtilisateurModele(); $evenements = $mdl->getEvenement(); - if(isset($_POST["recherche"]) AND !empty($_POST["recherche"])) - { + if (isset($_POST["recherche"]) and !empty($_POST["recherche"])) { $recherche = Validation::nettoyerString($_POST["recherche"]); $evenements = $mdl->getEvenementByTitre($recherche); } diff --git a/php/src/gateway/AlumniGateway.php b/php/src/gateway/AlumniGateway.php index e4fb4c7..ab84401 100644 --- a/php/src/gateway/AlumniGateway.php +++ b/php/src/gateway/AlumniGateway.php @@ -1,6 +1,9 @@ offreGw->getNewId(), + new Alumni("test.mail@icloud.fr","password","admin","prenom","nom"), + $nom, + $desc, + $img, + $logo, + $typeContrat, + $ville, + $entreprise, + $descposte, + $profilRecherche, + $exp, + $niveauEtudes, + $mail, + $num, + $site, + $remote, + $date); + + $this->offreGw->addOffers($offre); + + return $offre; + + } + + } \ No newline at end of file diff --git a/php/src/modele/OffreModele.php b/php/src/modele/OffreModele.php deleted file mode 100644 index c16cf9d..0000000 --- a/php/src/modele/OffreModele.php +++ /dev/null @@ -1,145 +0,0 @@ -offreGw = new OffreGateway(new Connection(DB_HOST,DB_USER,DB_PASS)); - } - - public function publishOffer(string $img, string $logo) - { - $desc = $_POST["description"]; - $descposte = $_POST["descriptPoste"]; - $nom = $_POST["name"]; - $ville = $_POST["ville"]; - $entreprise = $_POST["entreprise"]; - $profilRecherche = $_POST["profilRecherche"]; - $mail = $_POST["mail"]; - $num = $_POST["num"]; - $site = $_POST["site"]; - $exp = $_POST["choixExp"]; - $typeContrat = $_POST["typeContrat"]; - $niveauEtudes = $_POST["education"]; - $date = new \DateTime(); - - if(isset($_POST["fullRemote"])) - { - $remote = true; - } - else $remote = false; - - // à la place de NULL passer id utilisateur créateur offre - $offre = new Offre($this->offreGw->getNewId(), - new Alumni("test.mail@icloud.fr","password","admin","prenom","nom"), - $nom, - $desc, - $img, - $logo, - $typeContrat, - $ville, - $entreprise, - $descposte, - $profilRecherche, - $exp, - $niveauEtudes, - $mail, - $num, - $site, - $remote, - $date); - - $this->offreGw->addOffers($offre); - - return $offre; - - } - public function getOffers() : array - { - $res = $this->offreGw->getOffers(); - $offers = $this->CreateOffersFromGw($res); - return $offers; - } - - - public function getOfferFromId(int $id) : ?Offre - { - $res = $this->offreGw->getOfferFromId($id); - if($res != null) - return $this->CreateOffersFromGw($res)[0]; - return null; - } - - public function CreateOffersFromGw($res) : array - { - $alGw = new AlumniGateway(new Connection(DB_HOST,DB_USER,DB_PASS)); - - $offers=[]; - foreach ($res as $row) - { - $resal = $alGw->ObtenirById($row['offreur']); - $profilGw = new ProfilGateway(new Connection(DB_HOST,DB_USER,DB_PASS)); - $resProfl = $profilGw->getProfilById($row['offreur']); - - $alumni = new Alumni($resal[0]['id'],$resal[0]['mail'],$resal[0]['mdp'],$resal[0]['role'],$resProfl[0]['nom'],$resProfl[0]["prenom"]); - - $date = \DateTime::createFromFormat('Y-m-d', $row['date']); - - $offers[]=new Offre( - $row['id'], - $alumni, - $row['titre'], - $row['description'], - $row["image"], - $row["logo"], - $row['typeContrat'], - $row['ville'], - $row["entreprise"], - $row['descriptifPoste'], - $row['profil'], - $row['experience'], - $row['niveauEtudes'], - $row['mailContact'], - $row['numero'], - $row['websiteURL'], - $row['remote'], - $date); - } - - - return $offers; - } - - public function getOfferLimit($start, $nbOffers): array - { - $res = $this->offreGw->getOfferLimit($start, $nbOffers); - return $this->CreateOffersFromGw($res); - } - - public function getNbOffers() : int - { - return $this->offreGw->getNbOffers(); - } - - - - public function getOffersWithFilters($params) : array - { - return $this->offreGw->getOffersWithFilters($params); - } - -} \ No newline at end of file diff --git a/php/src/modele/UtilisateurModele.php b/php/src/modele/UtilisateurModele.php index 9986c2a..a28680f 100755 --- a/php/src/modele/UtilisateurModele.php +++ b/php/src/modele/UtilisateurModele.php @@ -3,19 +3,24 @@ namespace App\modele; use App\gateway\Connection; use App\gateway\EvenementGateway; +use App\gateway\OffreGateway; use App\metier\Evenement; use App\metier\Alumni; use App\gateway\AlumniGateway; use App\gateway\ProfilGateway; +use App\metier\Offre; class UtilisateurModele { private $con; + protected $offreGw; + public function __construct() { $this->con = new Connection(DB_HOST,DB_USER,DB_PASS); + $this->offreGw = new OffreGateway($this->con); } /** @@ -38,12 +43,14 @@ class UtilisateurModele // Le mot de passe est correct, retournez l'utilisateur return new Alumni($utilisateur[0]['id'],$utilisateur[0]['mail'], $utilisateur[0]['mdp'], $utilisateur[0]['role'],$utilisateur[0]['nom'],$utilisateur[0]['prenom']); } else { + // Le mot de passe est incorrect, renvoyez null return null; } } else { + // L'utilisateur n'existe pas, renvoyez null return null; } - } + } /** * @description s'inscrire @@ -177,4 +184,85 @@ class UtilisateurModele return $evenement; } + + + public function getOfferFromId(int $id) : ?Offre + { + $res = $this->offreGw->getOfferFromId($id); + if($res != null) + return $this->CreateOffersFromGw($res)[0]; + return null; + } + + + + + public function CreateOffersFromGw($res) : array + { + $alGw = new AlumniGateway(new Connection(DB_HOST,DB_USER,DB_PASS)); + + $offers=[]; + foreach ($res as $row) + { + $resal = $alGw->ObtenirById($row['offreur']); + + $profilGw = new ProfilGateway(new Connection(DB_HOST,DB_USER,DB_PASS)); + $resProfl = $profilGw->getProfilById($row['offreur']); + + + $alumni = new Alumni(intval($resal[0]['id']),$resal[0]['mail'],$resal[0]['mdp'],$resal[0]['role'],$resProfl[0]['nom'],$resProfl[0]["prenom"]); + + $date = \DateTime::createFromFormat('Y-m-d', $row['date']); + + $offers[]=new Offre( + $row['id'], + $alumni, + $row['titre'], + $row['description'], + $row["image"], + $row["logo"], + $row['typeContrat'], + $row['ville'], + $row["entreprise"], + $row['descriptifPoste'], + $row['profil'], + $row['experience'], + $row['niveauEtudes'], + $row['mailContact'], + $row['numero'], + $row['websiteURL'], + $row['remote'], + $date); + } + + + return $offers; + } + + public function getOfferLimit($start, $nbOffers): array + { + $res = $this->offreGw->getOfferLimit($start, $nbOffers); + return $this->CreateOffersFromGw($res); + } + + public function getNbOffers() : int + { + return $this->offreGw->getNbOffers(); + } + + + + public function getOffersWithFilters($params) : array + { + return $this->offreGw->getOffersWithFilters($params); + } + + public function getOffers() : array + { + $res = $this->offreGw->getOffers(); + $offers = $this->CreateOffersFromGw($res); + return $offers; + } + + } \ No newline at end of file diff --git a/php/src/router/AltoRouter.php b/php/src/router/AltoRouter.php new file mode 100644 index 0000000..3f7c952 --- /dev/null +++ b/php/src/router/AltoRouter.php @@ -0,0 +1,304 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +class AltoRouter +{ + + /** + * @var array Array of all routes (incl. named routes). + */ + protected $routes = []; + + /** + * @var array Array of all named routes. + */ + protected $namedRoutes = []; + + /** + * @var string Can be used to ignore leading part of the Request URL (if main file lives in subdirectory of host) + */ + protected $basePath = ''; + + /** + * @var array Array of default match types (regex helpers) + */ + protected $matchTypes = [ + 'i' => '[0-9]++', + 'a' => '[0-9A-Za-z]++', + 'h' => '[0-9A-Fa-f]++', + '*' => '.+?', + '**' => '.++', + '' => '[^/\.]++' + ]; + + /** + * Create router in one call from config. + * + * @param array $routes + * @param string $basePath + * @param array $matchTypes + * @throws Exception + */ + public function __construct(array $routes = [], $basePath = '', array $matchTypes = []) + { + $this->addRoutes($routes); + $this->setBasePath($basePath); + $this->addMatchTypes($matchTypes); + } + + /** + * Retrieves all routes. + * Useful if you want to process or display routes. + * @return array All routes. + */ + public function getRoutes() + { + return $this->routes; + } + + /** + * Add multiple routes at once from array in the following format: + * + * $routes = [ + * [$method, $route, $target, $name] + * ]; + * + * @param array $routes + * @return void + * @author Koen Punt + * @throws Exception + */ + public function addRoutes($routes) + { + if (!is_array($routes) && !$routes instanceof Traversable) { + throw new RuntimeException('Routes should be an array or an instance of Traversable'); + } + foreach ($routes as $route) { + call_user_func_array([$this, 'map'], $route); + } + } + + /** + * Set the base path. + * Useful if you are running your application from a subdirectory. + * @param string $basePath + */ + public function setBasePath($basePath) + { + $this->basePath = $basePath; + } + + /** + * Add named match types. It uses array_merge so keys can be overwritten. + * + * @param array $matchTypes The key is the name and the value is the regex. + */ + public function addMatchTypes(array $matchTypes) + { + $this->matchTypes = array_merge($this->matchTypes, $matchTypes); + } + + /** + * Map a route to a target + * + * @param string $method One of 5 HTTP Methods, or a pipe-separated list of multiple HTTP Methods (GET|POST|PATCH|PUT|DELETE) + * @param string $route The route regex, custom regex must start with an @. You can use multiple pre-set regex filters, like [i:id] + * @param mixed $target The target where this route should point to. Can be anything. + * @param string $name Optional name of this route. Supply if you want to reverse route this url in your application. + * @throws Exception + */ + public function map($method, $route, $target, $name = null) + { + + $this->routes[] = [$method, $route, $target, $name]; + + if ($name) { + if (isset($this->namedRoutes[$name])) { + throw new RuntimeException("Can not redeclare route '{$name}'"); + } + $this->namedRoutes[$name] = $route; + } + + return; + } + + /** + * Reversed routing + * + * Generate the URL for a named route. Replace regexes with supplied parameters + * + * @param string $routeName The name of the route. + * @param array @params Associative array of parameters to replace placeholders with. + * @return string The URL of the route with named parameters in place. + * @throws Exception + */ + public function generate($routeName, array $params = []) + { + + // Check if named route exists + if (!isset($this->namedRoutes[$routeName])) { + throw new RuntimeException("Route '{$routeName}' does not exist."); + } + + // Replace named parameters + $route = $this->namedRoutes[$routeName]; + + // prepend base path to route url again + $url = $this->basePath . $route; + + if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) { + foreach ($matches as $index => $match) { + list($block, $pre, $type, $param, $optional) = $match; + + if ($pre) { + $block = substr($block, 1); + } + + if (isset($params[$param])) { + // Part is found, replace for param value + $url = str_replace($block, $params[$param], $url); + } elseif ($optional && $index !== 0) { + // Only strip preceding slash if it's not at the base + $url = str_replace($pre . $block, '', $url); + } else { + // Strip match block + $url = str_replace($block, '', $url); + } + } + } + + return $url; + } + + /** + * Match a given Request Url against stored routes + * @param string $requestUrl + * @param string $requestMethod + * @return array|boolean Array with route information on success, false on failure (no match). + */ + public function match($requestUrl = null, $requestMethod = null) + { + + $params = []; + + // set Request Url if it isn't passed as parameter + if ($requestUrl === null) { + $requestUrl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/'; + } + + // strip base path from request url + $requestUrl = substr($requestUrl, strlen($this->basePath)); + + // Strip query string (?a=b) from Request Url + if (($strpos = strpos($requestUrl, '?')) !== false) { + $requestUrl = substr($requestUrl, 0, $strpos); + } + + $lastRequestUrlChar = $requestUrl ? $requestUrl[strlen($requestUrl)-1] : ''; + + // set Request Method if it isn't passed as a parameter + if ($requestMethod === null) { + $requestMethod = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; + } + + foreach ($this->routes as $handler) { + list($methods, $route, $target, $name) = $handler; + + $method_match = (stripos($methods, $requestMethod) !== false); + + // Method did not match, continue to next route. + if (!$method_match) { + continue; + } + + if ($route === '*') { + // * wildcard (matches all) + $match = true; + } elseif (isset($route[0]) && $route[0] === '@') { + // @ regex delimiter + $pattern = '`' . substr($route, 1) . '`u'; + $match = preg_match($pattern, $requestUrl, $params) === 1; + } elseif (($position = strpos($route, '[')) === false) { + // No params in url, do string comparison + $match = strcmp($requestUrl, $route) === 0; + } else { + // Compare longest non-param string with url before moving on to regex + // Check if last character before param is a slash, because it could be optional if param is optional too (see https://github.com/dannyvankooten/AltoRouter/issues/241) + if (strncmp($requestUrl, $route, $position) !== 0 && ($lastRequestUrlChar === '/' || $route[$position-1] !== '/')) { + continue; + } + + $regex = $this->compileRoute($route); + $match = preg_match($regex, $requestUrl, $params) === 1; + } + + if ($match) { + if ($params) { + foreach ($params as $key => $value) { + if (is_numeric($key)) { + unset($params[$key]); + } + } + } + + return [ + 'target' => $target, + 'params' => $params, + 'name' => $name + ]; + } + } + + return false; + } + + /** + * Compile the regex for a given route (EXPENSIVE) + * @param $route + * @return string + */ + protected function compileRoute($route) + { + if (preg_match_all('`(/|\.|)\[([^:\]]*+)(?::([^:\]]*+))?\](\?|)`', $route, $matches, PREG_SET_ORDER)) { + $matchTypes = $this->matchTypes; + foreach ($matches as $match) { + list($block, $pre, $type, $param, $optional) = $match; + + if (isset($matchTypes[$type])) { + $type = $matchTypes[$type]; + } + if ($pre === '.') { + $pre = '\.'; + } + + $optional = $optional !== '' ? '?' : null; + + //Older versions of PCRE require the 'P' in (?P) + $pattern = '(?:' + . ($pre !== '' ? $pre : null) + . '(' + . ($param !== '' ? "?P<$param>" : null) + . $type + . ')' + . $optional + . ')' + . $optional; + + $route = str_replace($block, $pattern, $route); + } + } + return "`^$route$`u"; + } +} diff --git a/php/templates/OffersList.html b/php/templates/OffersList.html index c86f465..2cf74e8 100644 --- a/php/templates/OffersList.html +++ b/php/templates/OffersList.html @@ -5,7 +5,7 @@ Alica - Offres - +
@@ -14,13 +14,17 @@
- Publier une offre + + {% if role == 'Membre' or role == 'Admin' %} + Publier une offre + {% endif %}
+
-
+

Filtrer les offres

@@ -79,7 +83,7 @@
@@ -87,27 +91,29 @@

Offres d'emploi

+{% if msg %} +

{{ msg }}

+{% endif %}
{% for offre in offres %}
- logo + logo

{{ offre.getNom() }}

-

Julien Martin | {{ offre.getDateStringFr()}}

+

{{offre.getOffreur().Prenom()}}, {{offre.getOffreur().getNom() }} | {{ offre.getDateStringFr()}}

{{ offre.getDescription() }}

- location + location

{{offre.getVille()}}

+ onclick="window.location.href = '{{dir}}/displayOffer/{{offre.getId()}}'">En savoir plus
{% endfor %} @@ -115,19 +121,21 @@ @@ -136,8 +144,6 @@ - - diff --git a/php/templates/Offre.html b/php/templates/Offre.html deleted file mode 100644 index 7211ce4..0000000 --- a/php/templates/Offre.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Offre {{ offre.getNom() }} - - - - - \ No newline at end of file diff --git a/php/templates/OffreDetailTest.html b/php/templates/OffreDetailTest.html index e404b79..7e91b08 100644 --- a/php/templates/OffreDetailTest.html +++ b/php/templates/OffreDetailTest.html @@ -17,10 +17,10 @@
    -
  • Logo -
  • Offer Image
  • +
  • Logo +
  • Offer Image
  • -
  • Offreur: {{ offre.getOffreur().getNom() }}
  • +
  • Offreur: {{offre.getOffreur().Prenom()}} {{offre.getOffreur().getNom() }}
  • Nom de l'offre: {{ offre.getNom() }}
  • Entreprise : {{ offre.getEntreprise() }}
  • Description: {{ offre.getDescription() }}
  • diff --git a/php/templates/accueil.html b/php/templates/accueil.html index e7bfa6d..e947817 100755 --- a/php/templates/accueil.html +++ b/php/templates/accueil.html @@ -7,6 +7,8 @@ Alica - Accueil + +
    {% include 'menu.html' %} @@ -41,6 +43,8 @@
    Nous sommes d’anciens étudiants à l’IUT d’Aubière qui aimerions créer un réseau d'anciens étudiants au travers d'un réseau alumni du département Informatique.
+
+
{% for event in eventsList %} diff --git a/php/templates/connection.html b/php/templates/connection.html index 01ded33..7574411 100755 --- a/php/templates/connection.html +++ b/php/templates/connection.html @@ -6,64 +6,60 @@ Alica - Connexion - -
- {% include 'menu.html' %} -
-
- -

Connexion

-
- Email -
-
- -
- -
-
-
- Mot de passe -
-
- -
- -
-
- Mot de passe oublié ? -
-
- + +{% if msg %} +

{{msg}}

+{% endif %} + +
+ +

Connexion

+
+ Identifiant +
+
+
+
- +
+ Mot de passe
-
- -
+
+ +
+
- {% if dVueErreur is not empty %} + Mot de passe oublié ?
-
-
    - {% for erreur in dVueErreur %} -
  • {{ erreur }}
  • - {% endfor %} -
-
+
- {% endif %} + +
+
-
- {% include 'footer.html' %} -
- - + {% if dVueErreur is not empty %} +
+
+
+
    + {% for erreur in dVueErreur %} +
  • {{ erreur }}
  • + {% endfor %} +
+
+
+
+ {% endif %} +
- \ No newline at end of file + + + \ No newline at end of file diff --git a/php/templates/creerEvenement.html b/php/templates/creerEvenement.html index 7b7b28d..74145cf 100644 --- a/php/templates/creerEvenement.html +++ b/php/templates/creerEvenement.html @@ -9,7 +9,7 @@

Créer un Événement

-
+
diff --git a/php/templates/creerOffre.html b/php/templates/creerOffre.html index 8a1e867..54d0710 100644 --- a/php/templates/creerOffre.html +++ b/php/templates/creerOffre.html @@ -15,7 +15,7 @@

Publier Une Offre

- + {% if tabError is defined %} {% for error in tabError %} diff --git a/php/templates/detailEvenement.html b/php/templates/detailEvenement.html index fd9e78d..5e1924c 100644 --- a/php/templates/detailEvenement.html +++ b/php/templates/detailEvenement.html @@ -22,9 +22,9 @@

Organisateur: {{ evenement.organisateurId }}

Date: {{ evenement.date }}

Description: {{ evenement.description }}

- Event Image + Event Image

Places disponibles: {{ evenement.nbPlaceMax }}

- Retour + Retour
{% else %}

L'événement n'existe pas ou n'est pas disponible.

diff --git a/php/templates/erreur.html b/php/templates/erreur.html index ea207e5..d8fd4c1 100755 --- a/php/templates/erreur.html +++ b/php/templates/erreur.html @@ -3,25 +3,23 @@ - + Alica - Erreur - - {% include "menu.html" %} +
+ {% include "menu.html" %} +
+

Erreur

{% if dVueErreur is defined %} {% for value in dVueErreur %}

{{value}}

{% endfor %} {% endif %} - +
diff --git a/php/templates/evenement.html b/php/templates/evenement.html index 8d45c2e..addb02d 100644 --- a/php/templates/evenement.html +++ b/php/templates/evenement.html @@ -5,7 +5,7 @@ Liste des Événements - + @@ -15,14 +15,14 @@
-
+

Liste des Événements

- Publier événement + Publier événement
    @@ -34,13 +34,13 @@

    Organisateur: {{ evenement.getNomOrganisateur() }}

    Date: {{ evenement.date }}

    Description: {{ evenement.description }}

    - {{ evenement.titre }} + {{ evenement.titre }}

    Places disponibles: {{ evenement.nbPlaceMax }}

    - Détails + Détails
-
+
diff --git a/php/templates/inscription.html b/php/templates/inscription.html index 3873434..eeafe1b 100755 --- a/php/templates/inscription.html +++ b/php/templates/inscription.html @@ -7,18 +7,16 @@ -
- {% include 'menu.html' %} -
-
-
-

S'inscrire

-
- Prénom : -
-
- -
+
+ +

S'inscrire

+
+ Prénom : +
+
+ +
+
@@ -38,48 +36,46 @@
-
-
-
- Mot de passe -
-
- -
- -
-
-
-
- -
+
-
+
+ Mot de passe
-
- -
+
+ +
+
- {% if dVueErreur is not empty %}
-
-
    - {% for erreur in dVueErreur %} -
  • {{ erreur }}
  • - {% endfor %} -
-
+
- {% endif %} + +
+
-
- {% include 'footer.html' %} -
- - + {% if dVueErreur is not empty %} +
+
+
+
    + {% for erreur in dVueErreur %} +
  • {{ erreur }}
  • + {% endfor %} +
+
+
+
+ {% endif %} +
- \ No newline at end of file + + + \ No newline at end of file diff --git a/php/templates/inscription_success.html b/php/templates/inscription_success.html index 3e1f2b3..d3db6a7 100644 --- a/php/templates/inscription_success.html +++ b/php/templates/inscription_success.html @@ -3,7 +3,7 @@ Success - +

Inscription effectuée avec succès, vous pouvez désormais vous connecter

@@ -15,7 +15,7 @@
diff --git a/php/templates/menu.html b/php/templates/menu.html index f8ece9e..7e48b0e 100644 --- a/php/templates/menu.html +++ b/php/templates/menu.html @@ -1,13 +1,13 @@ - +