diff --git a/.DS_Store b/.DS_Store index 62a2dc5..756ad0b 100755 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/php/.DS_Store b/php/.DS_Store index e15ad86..a06d127 100755 Binary files a/php/.DS_Store and b/php/.DS_Store differ diff --git a/php/public/assets/location.png b/php/public/assets/location.png new file mode 100644 index 0000000..f5018a6 Binary files /dev/null and b/php/public/assets/location.png differ diff --git a/php/public/assets/logo.png b/php/public/assets/logo.png new file mode 100644 index 0000000..d272825 Binary files /dev/null and b/php/public/assets/logo.png differ diff --git a/php/public/assets/michelin.png b/php/public/assets/michelin.png new file mode 100644 index 0000000..1bbe06b Binary files /dev/null and b/php/public/assets/michelin.png differ diff --git a/php/public/css/menu.css b/php/public/css/menu.css new file mode 100644 index 0000000..6ab9e3d --- /dev/null +++ b/php/public/css/menu.css @@ -0,0 +1,145 @@ +a { + text-decoration: none; +} + +.navbar-container { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 2rem; + width: 100%; + height: 70px; + background: #fff; + color: #212121; + position: sticky; + top: 0; + left: 0; + z-index: 100; +} + +.navbar-container .logo-container a { + font-size: 1.5rem; + font-weight: 500; + font-family: 'Kanit', sans-serif; + text-transform: uppercase; + cursor: pointer; + color: #212121; + max-height: 70px; +} + +.navbar-container .nav-items { + display: flex; + align-items: center; + gap: 3rem; + list-style: none; +} + +.navbar-container .nav-items .nav-link a { + color: #212121; + padding: 10px; + text-transform: uppercase; + transition: 0.2s; +} + +.navbar-container .nav-items .nav-link:after { + content: ''; + display: block; + border-top: 3px solid #00DBFF; + transform: scaleX(0); + transition: transform 250ms ease-in-out; +} + +.navbar-container .nav-items .nav-link:hover:after { + transform: scaleX(0.8); +} + +.navbar-container .nav-items .login-register { + display: flex; + flex-direction: row; + gap: 1rem; +} + +.navbar-container .nav-items .login-register .button { + color: #00DBFF; + padding: 5px 20px; + text-transform: uppercase; + border-radius: 15px; + border: #fff 2px solid; +} + +.navbar-container .nav-items .login-register .button2{ + background: #00DBFF; + color: #fff; + border-radius: 15px; +} + +.navbar-container .nav-items .login-register .button:hover { + border: #00DBFF 2px solid; +} + +.navbar-container .nav-items .login-register .button2:hover { + border: #00A4FF 2px solid; +} + +@media(max-width: 1030px) { + .navbar-container { + padding: 0 1rem; + } + + .navbar-container .nav-items { + gap: 0.1rem; + } + + .navbar-container .nav-items .nav-link a, + .navbar-container .nav-items .login-register .button { + font-size: 0.9rem; + } +} + +@media(max-width: 915px) { + .navbar-container .nav-items { + flex-direction: column; + position: fixed; + top: 70px; + right: -100%; + width: 100vw; + height: 100vh; + padding: 1rem 0; + z-index: 99; + background: #fff; + transition: 0.2s ease-in; + } + + .bars { + width: 22px; + height: auto; + cursor: pointer; + } + + .bars .bar { + width: 100%; + height: 2px; + background: #212121; + margin: 5px; + } + + .navbar-container .nav-items { + gap: 3rem; + } + + .navbar-container .nav-items .login-register { + width: 50%; + text-align: center; + flex-direction: column; + gap: 2rem; + } + + .navbar-container .nav-items .login-register .button { + padding: 1rem 0; + } + +} + +.navbar-container .nav-items.active { + right: 0; +} \ No newline at end of file diff --git a/php/scripts/creerOffre.js b/php/scripts/creerOffre.js new file mode 100644 index 0000000..c0c169e --- /dev/null +++ b/php/scripts/creerOffre.js @@ -0,0 +1,32 @@ +// change la possibilité d'entrer une ville pour l'offre +// cas où l'offre est à pourvoir en full remote +document.getElementById("fullRemote").addEventListener("change", function () { + var villeInput = document.getElementById("ville"); + villeInput.disabled = this.checked; + //var ville = document.getElementById('') +}); + +document.addEventListener("DOMContentLoaded", function() { + const form = document.querySelector("form"); + const submitButton = document.querySelector('input[type="submit"]'); + + // Fonction pour vérifier si tous les champs du formulaire sont remplis + function checkFormFields() { + const inputs = form.querySelectorAll('input, textarea, select'); + let allFieldsFilled = true; + + inputs.forEach(function(input) { + if (!input.value) { + allFieldsFilled = false; + } + }); + + submitButton.disabled = !allFieldsFilled; + } + + // Écoute les événements de saisie dans les champs du formulaire + form.addEventListener("input", checkFormFields); + + // Appelle la fonction initiale pour la première vérification + checkFormFields(); +}); diff --git a/php/src/controleur/FrontControleur.php b/php/src/controleur/FrontControleur.php index 0fe94ad..ff7de9f 100755 --- a/php/src/controleur/FrontControleur.php +++ b/php/src/controleur/FrontControleur.php @@ -19,7 +19,7 @@ class FrontControleur "deconnexion","proposerOffre","consulterProfil","modifierProfil","signaler" ], "Utilisateur" => [ - "connection", "inscription", "accueil","consulterProfilLimite" + "connection", "inscription", "accueil","consulterProfilLimite","publierOffre" ] ); diff --git a/php/src/controleur/UtilisateurControleur.php b/php/src/controleur/UtilisateurControleur.php index 6f13247..1e4ee39 100755 --- a/php/src/controleur/UtilisateurControleur.php +++ b/php/src/controleur/UtilisateurControleur.php @@ -4,7 +4,11 @@ namespace App\controleur; use App\gateway\Connection; use App\gateway\ImageGateway; -use App\modele\Image; +use App\gateway\OffreGateway; +use App\metier\Image; +use App\modele\NiveauEtudes; +use App\modele\Offre; +use App\modele\TypeContrat; class UtilisateurControleur { @@ -13,7 +17,7 @@ class UtilisateurControleur global $twig; if (!isset($_REQUEST["action"])) { //$action = NULL; - $action = "CreerOffre"; + $action = "consulterOffres"; } else { $action = \App\config\Validation::nettoyerString($_REQUEST["action"]); } @@ -30,16 +34,22 @@ class UtilisateurControleur case "inscription": $this->inscription(); break; + case "consulterOffres": + $this->consulterOffres(); + break; case "consulterProfilLimite": $this->consulterProfilLimite(); break; - case "CreerOffre": + case "creerOffre": //echo "test"; $this->creerOffre(); break; case "publierOffre": $this->publierOffre(); break; + case "testAction": + $this->testAction(); + break; default: $dVueErreur[] ="Action inconnue ou non autorisée"; echo $twig->render("erreur.html",['dVueErreur' => $dVueErreur]); @@ -72,7 +82,7 @@ class UtilisateurControleur // Si l'inscription a réussi, redirigez l'utilisateur vers une page de confirmation // Vous pouvez également gérer les erreurs ici en cas d'échec de l'inscription - if ($nouvelUtilisateur instanceof \App\modele\Alumni) { + if ($nouvelUtilisateur instanceof \App\metier\Alumni) { // L'inscription a réussi, redirigez l'utilisateur vers une page de confirmation // par exemple : header('Location: index.php?action=inscription_success'); @@ -98,14 +108,18 @@ class UtilisateurControleur //TODO } + protected function consulterOffres() + { + global $twig; + echo $twig->render('offres.html', []); + } protected function creerOffre() { - /* + global $twig; - echo $twig->render('testImage.html', []); - /* - * */ - $con = new Connection("mysql:host=localhost;dbname=dbAlica",'test','test'); + echo $twig->render('CreerOffre.html', []); + + /* $con = new Connection("mysql:host=localhost;dbname=dbAlica",'test','test'); $imgGw = new ImageGateway($con); @@ -114,32 +128,92 @@ class UtilisateurControleur //echo $imglist[0]->getBlob(); // echo $imglist[0]->toString(); - echo 'mon image'; + echo 'mon image';*/ } protected function publierOffre() { + global $twig; + try{ + if(isset($_POST["submit"])) + { + // echo "numero : ",$_POST["num"]; + $con = new Connection("mysql:host=localhost;dbname=dbAlica",'test','test'); + $imgGw = new ImageGateway($con); + + $img = new Image($imgGw->getNewId(),$_FILES["image"]["name"], + $_FILES["image"]["size"],$_FILES["image"]["type"],file_get_contents($_FILES["image"]["tmp_name"])); + + $imgid = $imgGw->findByNom($img->getName())->getId(); + + $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"]; + + $type = match ($_POST["type"]) { + "Stage" => TypeContrat::Stage, + "CDI" => TypeContrat::CDI, + "CDD" => TypeContrat::CDD, + "Alternance" => TypeContrat::Alternance, + default => TypeContrat::CDD, + }; + + $niveauEtudes = match ($_POST["education"]) { + "Bac+2" => NiveauEtudes::Bac2, + "Bac+3" => NiveauEtudes::Bac3, + "Bac+5" => NiveauEtudes::Bac5, + default => NiveauEtudes::Indifferent, + }; + + $offre = new Offre(NULL,$nom,$desc,$imgid,$type,$ville,$entreprise,$profilRecherche,$mail,$num,$site,$type,$niveauEtudes); + } + } + catch(\Exception ) + { + $twig->render("erreur.html",['dVueErreur' => "erreur "]); + } - if(isset($_POST["submit"])) + + + if(isset($_POST["submit"])) $img = new Image($_FILES["image"]["name"], $_FILES["image"]["size"],$_FILES["image"]["type"],file_get_contents($_FILES["image"]["tmp_name"])); else { - echo "

Image non inserée

"; + echo $twig->render("erreur.html", ['dVueErreur' => "Erreur lors de l'upload de l'image"]); return; } + + $con = new Connection("mysql:host=localhost;dbname=dbAlica",'test','test'); $imgGw = new ImageGateway($con); $imgGw->insertImage($img); - //echo $img->getBlob(); - // echo 'mon image'; + + // echo 'mon image'; + - echo "

Image inserée

"; + } + + + protected function testAction() + { + echo "test action "; + $con = new Connection("mysql:host=localhost;dbname=dbAlica",'test','test'); + $offreGw = new OffreGateway($con); + if($offreGw->getMaxid() == NULL) + echo "max id == NULL"; + else echo "max id != NULL"; } diff --git a/php/src/gateway/ImageGateway.php b/php/src/gateway/ImageGateway.php index e1c9bf8..b8dd8ac 100644 --- a/php/src/gateway/ImageGateway.php +++ b/php/src/gateway/ImageGateway.php @@ -2,8 +2,9 @@ namespace App\gateway; -use App\modele\Image; +use App\metier\Image; use PDO; + class ImageGateway { private Connection $con; @@ -31,7 +32,7 @@ class ImageGateway public function insert(int $id,string $name, string $desc, string $taille, string $type, string $blob) { - $query = 'INSERT INTO Image (nom, taille, type, desc, blob) VALUES (:i, :n, :t, :ty, :d, :b)'; + $query = 'INSERT INTO Image VALUES (:i, :n, :t, :ty, :d, :b)'; $this->con->executeQuery($query, array( ':i' => array($id,PDO::PARAM_INT), ':n' => array($name, PDO::PARAM_STR), @@ -43,6 +44,8 @@ class ImageGateway } + + public function delete(int $id) { $query = 'DELETE FROM Image WHERE id=:i'; @@ -61,6 +64,25 @@ class ImageGateway return new Image($res[0]['nom'], $res[0]['desc'], $res[0]['taille'], $res[0]['type'], $res[0]['blob']); } + public function findByNom(string $nom) + { + $query = 'SELECT * FROM Image WHERE nom=:n'; + $this->con->executeQuery($query, array( + ':n' => array($nom, PDO::PARAM_STR) + )); + $res = $this->con->getResults(); + return new Image($res[0]['nom'], $res[0]['taille'], $res[0]['type'], $res[0]['blob']); + + } + + public function getNewId() + { + $query = 'SELECT MAX(id) FROM Image'; + $this->con->executeQuery($query); + $res = $this->con->getResults(); + return $res[0]['MAX(id)'] + 1; + } + public function getAll() { $query = 'SELECT * FROM Image'; diff --git a/php/src/gateway/OffreGateway.php b/php/src/gateway/OffreGateway.php index 85e4aab..128c2c9 100755 --- a/php/src/gateway/OffreGateway.php +++ b/php/src/gateway/OffreGateway.php @@ -15,4 +15,12 @@ class OffreGateway $query='INSERT INTO Offre VALUES ()'; $this->con->executeQuery($query, array()); } + + public function getMaxid() + { + $query = 'SELECT MAX(id) FROM Offre'; + $this->con->executeQuery($query, array()); + $res = $this->con->getResults(); + return $res[0]['MAX(id)']; + } } \ No newline at end of file diff --git a/php/src/modele/Alumni.php b/php/src/metier/Alumni.php similarity index 97% rename from php/src/modele/Alumni.php rename to php/src/metier/Alumni.php index 7084fba..159b204 100644 --- a/php/src/modele/Alumni.php +++ b/php/src/metier/Alumni.php @@ -1,6 +1,6 @@ id = $id; + $this->id = $id; $this->name = $name; $this->taille = $taille; $this->type = $type; @@ -49,6 +50,11 @@ class Image return $this->blob; } + public function getId() : string + { + return $this->id; + } + public function toString() : string { return "Image : " . $this->name . " " . $this->taille . " " . $this->type . " blob " . $this->blob; } diff --git a/php/src/modele/Offre.php b/php/src/metier/Offre.php similarity index 88% rename from php/src/modele/Offre.php rename to php/src/metier/Offre.php index 5d247af..1625442 100755 --- a/php/src/modele/Offre.php +++ b/php/src/metier/Offre.php @@ -1,6 +1,9 @@ id = $id; $this->offreur = $offreur; $this->nom = $nom; $this->description = $description; - $this->imageUrl = $imageUrl; + $this->imgId = $imgId; $this->typeContrat = $typeContrat; $this->ville = $ville; $this->entreprise = $entreprise; @@ -211,4 +215,15 @@ class Offre { return $this->siteUrl; } + + + public function getImgId(): int + { + return $this->imgId; + } + + public function setImgId(int $imgId): void + { + $this->imgId = $imgId; + } } \ No newline at end of file diff --git a/php/src/modele/Profil.php b/php/src/metier/Profil.php similarity index 98% rename from php/src/modele/Profil.php rename to php/src/metier/Profil.php index 69e5bc5..cee762c 100644 --- a/php/src/modele/Profil.php +++ b/php/src/metier/Profil.php @@ -1,5 +1,5 @@ insert($email, $hashpassword, $role)) { // L'insertion a réussi, retournez le nouvel utilisateur - $nouvelUtilisateur = new \App\modele\Alumni($email, $hashpassword, $role); + $nouvelUtilisateur = new \App\metier\Alumni($email, $hashpassword, $role); return $nouvelUtilisateur; } else { // L'insertion a échoué, renvoyez un utilisateur vide pour indiquer l'échec - return new \App\modele\Alumni(null, null, null); + return new \App\metier\Alumni(null, null, null); } } } diff --git a/php/templates/CreerOffre.html b/php/templates/CreerOffre.html index afb5aa6..b065b59 100644 --- a/php/templates/CreerOffre.html +++ b/php/templates/CreerOffre.html @@ -9,44 +9,27 @@
- + {% include "menu.html" %}

Publier Une Offre

-
+ +

Les champs contenant des astrérisques * sont obligatoires.

- +
- +
- +
@@ -61,7 +44,7 @@
- +
- +
- +
- +
- +
- +
- - + +
- - + +
+
- +
- +
@@ -126,7 +110,7 @@ - +
diff --git a/php/templates/menu.html b/php/templates/menu.html new file mode 100644 index 0000000..87f0a45 --- /dev/null +++ b/php/templates/menu.html @@ -0,0 +1,30 @@ + + + + + + + \ No newline at end of file diff --git a/php/templates/offres.html b/php/templates/offres.html new file mode 100644 index 0000000..8b59258 --- /dev/null +++ b/php/templates/offres.html @@ -0,0 +1,67 @@ + + + + + Alica - Offres + + + + +
+ {% include "menu.html" %} +
+ +
+

Offres d'emploi

+ +
+
+
+ Michelin +
+
+

Administrateur de bases de données (CDI)

+

Julien Martin - 15 Janvier 2022

+

Nous recherchons un administrateur en base de données pour contribuer au développement de nos infrastructures

+ Localisation +

Clermont-Ferrand (63)

+
+
+
+ +
+
+
+ Michelin +
+
+

Administrateur de bases de données (CDI)

+

Julien Martin - 15 Janvier 2022

+

Nous recherchons un administrateur en base de données pour contribuer au développement de nos infrastructures

+ Localisation +

Clermont-Ferrand (63)

+
+
+
+ +
+
+
+ Michelin +
+
+

Administrateur de bases de données (CDI)

+

Julien Martin - 15 Janvier 2022

+

Nous recherchons un administrateur en base de données pour contribuer au développement de nos infrastructures

+ Localisation +

Clermont-Ferrand (63)

+
+
+
+
+ + + + + + \ No newline at end of file