Compare commits
51 Commits
Author | SHA1 | Date |
---|---|---|
Thomas MUZARD | c60f579a25 | 1 year ago |
Clément Verdoire | 776993ce23 | 1 year ago |
Baptiste D | 4c3e3571a9 | 1 year ago |
Baptiste D | 1d3486d9ba | 1 year ago |
Baptiste D | 02048befd8 | 1 year ago |
thomas muzard | 13eb6be744 | 1 year ago |
Baptiste D | e6f5518ebc | 1 year ago |
Baptiste D | 03371c34ad | 1 year ago |
Clément Verdoire | 941296e44c | 1 year ago |
Clément Verdoire | 60dff089bb | 1 year ago |
Baptiste D | ef2ff36190 | 1 year ago |
Baptiste D | 132d41e1db | 1 year ago |
Clément Verdoire | 9176e6cb03 | 1 year ago |
Clément Verdoire | 14479cf2a3 | 1 year ago |
Clément Verdoire | 39bae853c9 | 1 year ago |
Baptiste D | 9271f53d47 | 1 year ago |
Clément Verdoire | 4031f71acb | 1 year ago |
Baptiste D | 406cde7784 | 1 year ago |
Baptiste D | cebb1aac3a | 1 year ago |
Baptiste D | 6aa6dabb26 | 1 year ago |
Leo TUAILLON | 3d0267bb61 | 1 year ago |
Leo TUAILLON | 849663f143 | 1 year ago |
Clément Verdoire | 1e4aaf41b8 | 1 year ago |
Leo TUAILLON | a2f805cba2 | 1 year ago |
Leo TUAILLON | ce5fb022b9 | 1 year ago |
Leo TUAILLON | b5d91b5ac3 | 1 year ago |
Baptiste D | a32a224099 | 1 year ago |
Baptiste D | 090bb42cbd | 1 year ago |
Clément Verdoire | 7f85096c7b | 1 year ago |
Baptiste D | 43729cfd59 | 1 year ago |
Leo TUAILLON | ed00c99894 | 1 year ago |
Leo TUAILLON | bc1f77c054 | 1 year ago |
Leo TUAILLON | 4ee484b938 | 1 year ago |
Leo TUAILLON | f2cea0d18d | 1 year ago |
Leo Tuaillon | a1a1ae6ecb | 1 year ago |
Leo Tuaillon | e208694186 | 1 year ago |
Baptiste DUDONNE | 1ab3ffebf1 | 1 year ago |
Baptiste D | 6d5cc2e436 | 1 year ago |
Baptiste D | 5bd82f523a | 1 year ago |
Leo Tuaillon | 8a26f49de3 | 1 year ago |
Alexis Feron | b6e103465a | 1 year ago |
Baltazouu | e2b6319438 | 1 year ago |
Baltazouu | 9a151f87de | 1 year ago |
Baltazouu | 44414d4a95 | 1 year ago |
Baltazouu | f001193e66 | 1 year ago |
Baltazouu | 06799359ba | 1 year ago |
Baltazouu | 7d5ece1532 | 1 year ago |
Baltazouu | b7a820f49d | 1 year ago |
Leo Tuaillon | a92e9d4f1d | 1 year ago |
Baptiste D | 8e3e130f93 | 1 year ago |
Leo Tuaillon | be622c2be6 | 1 year ago |
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="SqlDialectMappings">
|
||||||
|
<file url="file://$PROJECT_DIR$/php/src/gateway/AlumniGateway.php" dialect="GenericSQL" />
|
||||||
|
</component>
|
||||||
|
</project>
|
After Width: | Height: | Size: 100 KiB |
@ -1,3 +1,11 @@
|
|||||||
|
#RewriteEngine On
|
||||||
|
#
|
||||||
|
#RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
#RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
#RewriteRule ^(.*)$ index.php/$1 [L]
|
||||||
|
|
||||||
|
|
||||||
RewriteEngine on
|
RewriteEngine on
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
RewriteRule . index.php [L]
|
RewriteRule . index.php [L]
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 842 KiB |
@ -0,0 +1,122 @@
|
|||||||
|
/* profil.css */
|
||||||
|
.profiles-container {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-around;
|
||||||
|
gap: 20px;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile {
|
||||||
|
width: calc(50% - 20px); /* Ajustez la largeur si nécessaire pour correspondre au design */
|
||||||
|
border: 1px solid #ccc; /* Bordure comme dans l'image */
|
||||||
|
border-radius: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #fff;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center; /* Alignement vertical */
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-image-container {
|
||||||
|
padding: 10px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: #f0f0f0;
|
||||||
|
flex-shrink: 0; /* Empêche le conteneur de rétrécir */
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-image-container img {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-details {
|
||||||
|
padding: 10px;
|
||||||
|
flex-grow: 1; /* Permet à ce div de prendre l'espace restant */
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-details p {
|
||||||
|
margin: 5px 0;
|
||||||
|
font-weight: bold; /* Texte en gras comme dans l'image */
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-details .job-title {
|
||||||
|
color: #007bff;
|
||||||
|
font-size: 0.85em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-details a {
|
||||||
|
display: block; /* Prend toute la largeur du conteneur */
|
||||||
|
background: #007bff;
|
||||||
|
color: #fff;
|
||||||
|
padding: 5px 15px;
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-size: 14px;
|
||||||
|
margin-top: 10px; /* Espace au-dessus du lien */
|
||||||
|
text-align: center; /* Centre le texte dans le lien */
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-details a:hover {
|
||||||
|
background: #0056b3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* profil.css */
|
||||||
|
.pagination {
|
||||||
|
display: flex;
|
||||||
|
padding-left: 0;
|
||||||
|
list-style: none;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-link {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
padding: 0.5rem 0.75rem;
|
||||||
|
margin-left: -1px;
|
||||||
|
line-height: 1.25;
|
||||||
|
color: #007bff;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #dee2e6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-link:hover {
|
||||||
|
color: #0056b3;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #e9ecef;
|
||||||
|
border-color: #dee2e6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-item:first-child .page-link {
|
||||||
|
margin-left: 0;
|
||||||
|
border-top-left-radius: 0.25rem;
|
||||||
|
border-bottom-left-radius: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-item:last-child .page-link {
|
||||||
|
border-top-right-radius: 0.25rem;
|
||||||
|
border-bottom-right-radius: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-item.active .page-link {
|
||||||
|
z-index: 1;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #007bff;
|
||||||
|
border-color: #007bff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-item.disabled .page-link {
|
||||||
|
color: #6c757d;
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: auto;
|
||||||
|
background-color: #fff;
|
||||||
|
border-color: #dee2e6;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 9.7 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 8.0 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 162 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 164 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 149 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 2.5 MiB |
Before Width: | Height: | Size: 467 KiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 34 KiB |
@ -1,55 +1,136 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
||||||
namespace App\controleur;
|
namespace App\controleur;
|
||||||
|
|
||||||
|
use App\router\AltoRouter;
|
||||||
|
use App\controleur\Error;
|
||||||
|
|
||||||
class FrontControleur
|
class FrontControleur
|
||||||
{
|
{
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
global $twig;
|
global $twig;
|
||||||
session_start();
|
session_start();
|
||||||
$dVueErreur = [];
|
|
||||||
$actions = array(
|
if(!isset($_SESSION['nom']) && !isset($_SESSION['prenom']) && !isset($_SESSION['role']) && !isset($_SESSION['id']))
|
||||||
"Admin" => [
|
{
|
||||||
"supprimerCompte", "consulterSignalement","supprimerOffre"
|
$_SESSION['nom'] = NULL;
|
||||||
],
|
$_SESSION['prenom'] = NULL;
|
||||||
"Moderateur" => [
|
$_SESSION['role'] = "guest";
|
||||||
//TODO
|
$_SESSION['id'] = NULL;
|
||||||
],
|
}
|
||||||
"Membre" => [
|
else{
|
||||||
"deconnexion","proposerOffre","consulterProfil","modifierProfil","signaler",
|
$twig->addGlobal('nom', $_SESSION['nom']);
|
||||||
],
|
$twig->addGlobal('prenom', $_SESSION['prenom']);
|
||||||
"Utilisateur" => [
|
$twig->addGlobal('role', $_SESSION['role']);
|
||||||
|
$twig->addGlobal('id', $_SESSION['id']);
|
||||||
"connexion", "inscription", "accueil", "consulterProfilLimite", "publierOffre", "listerEvenement", "creerEvenement", "supprimerEvenement", "avoirDetailEvenement", "rechercherEvenement"
|
}
|
||||||
]
|
|
||||||
);
|
|
||||||
|
$router = new AltoRouter();
|
||||||
$action = \App\config\Validation::nettoyerString($_GET["action"] ?? "");
|
|
||||||
if(in_array($action,$actions['Admin'])) {
|
$router->setBasePath('/SAE_2A_FA-Reseau_ALICA/php');
|
||||||
if (!isset($_SESSION["role"]) || $_SESSION["role"]!="admin") {
|
|
||||||
$dVueErreur[] = 'Veuillez vous connecter';
|
$router->map('GET|POST', '/', 'UtilisateurControleur');
|
||||||
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
|
|
||||||
} else{
|
$router->map('GET|POST','/[a:action]?','UtilisateurControleur');
|
||||||
new AdminControleur();
|
|
||||||
|
$router->map('POST','/[a:action]?','UtilisateurControleur');
|
||||||
|
|
||||||
|
$router->map('GET|POST','/[a:action]/[i:id]?','UtilisateurControleur');
|
||||||
|
|
||||||
|
$router->map('GET|POST', '/user/[a:action]?', 'MembreControleur');
|
||||||
|
|
||||||
|
$router->map('GET|POST', '/user/[i:id]/[a:action]?', 'MembreControleur');
|
||||||
|
|
||||||
|
$router->map('GET|POST', '/user/[i:id]/[a:action]/[i:id2]?', 'MembreControleur');
|
||||||
|
|
||||||
|
|
||||||
|
$router->map('GET|POST', '/admin/[i:id]/[a:action]?', 'AdminControleur');
|
||||||
|
|
||||||
|
$router->map('GET|POST', '/admin/[i:id]/[a:action]/[i:id2]?', 'AdminControleur');
|
||||||
|
|
||||||
|
$id = 0;
|
||||||
|
|
||||||
|
$match = $router->match();
|
||||||
|
|
||||||
|
$action = array();
|
||||||
|
|
||||||
|
$id = array();
|
||||||
|
|
||||||
|
try{
|
||||||
|
if (!$match) {
|
||||||
|
|
||||||
|
$dVueErreur[] = "Error 404 Page not found";
|
||||||
|
echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($match) {
|
||||||
|
|
||||||
|
$controller = $match['target'] ?? NULL;
|
||||||
|
$action = $match['params']['action'] ?? NULL;
|
||||||
|
$id = $match['params']['id'] ?? NULL;
|
||||||
|
|
||||||
|
$namespace = 'App\\controleur\\';
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ($controller == "MembreControleur") {
|
||||||
|
if ($_SESSION["role"] != "Membre" && $_SESSION["role"] != "Admin") {
|
||||||
|
|
||||||
|
echo $twig->render("connection.html", ['msg' => 'Vous devez vous connecter pour effectuer cette action']);
|
||||||
|
} else {
|
||||||
|
$controller = "MembreControleur";
|
||||||
|
$controller = $namespace . $controller;
|
||||||
|
//echo "controller : ".$controller;
|
||||||
|
$controller = new $controller();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(in_array($action,$actions['Moderateur'])) {
|
|
||||||
if (!isset($_SESSION["role"]) || ($_SESSION["role"]!="moderateur" && $_SESSION["role"]!="admin")) {
|
if ($controller == "AdminControleur") {
|
||||||
$dVueErreur[] = 'Veuillez vous connecter';
|
if ($_SESSION["role"] != "Admin") {
|
||||||
|
$dVueErreur = ["Erreur : Vous n'avez pas les privileges pour cette action"];
|
||||||
|
|
||||||
|
global $twig;
|
||||||
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
|
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
|
||||||
} else{
|
return;
|
||||||
new ModerateurControleur();
|
} else {
|
||||||
|
$controller = "AdminControleur";
|
||||||
|
$controller = $namespace . $controller;
|
||||||
|
$controller = new $controller();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(in_array($action,$actions['Membre'])) {
|
|
||||||
if (!isset($_SESSION["utilisateur"])) {
|
if ($controller == "UtilisateurControleur") {
|
||||||
$dVueErreur[] = 'Veuillez vous connecter';
|
$controller = $namespace . $controller;
|
||||||
|
$controller = new $controller();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_callable(array($controller, $action))) {
|
||||||
|
|
||||||
|
call_user_func(array($controller, $action), $match['params']);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
|
||||||
|
echo $twig->render('accueil.html');
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Error $error) {
|
||||||
|
$dVueErreur = ['Erreur : Action inconnue'];
|
||||||
|
|
||||||
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
|
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
|
||||||
} else{
|
|
||||||
new MembreControleur();
|
|
||||||
}
|
}
|
||||||
}else{
|
|
||||||
new UtilisateurControleur();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch(Error $e)
|
||||||
|
{
|
||||||
|
$dVueErreur = ['Erreur : Action inconnue'];
|
||||||
|
|
||||||
|
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,60 +1,123 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App\controleur;
|
namespace App\controleur;
|
||||||
|
use App\config\Validation;
|
||||||
|
use App\gateway\ImageManager;
|
||||||
|
use App\modele\MembreModele;
|
||||||
|
|
||||||
class MembreControleur extends UtilisateurControleur
|
class MembreControleur extends UtilisateurControleur
|
||||||
{
|
{
|
||||||
public function __construct()
|
public function __construct()
|
||||||
|
{}
|
||||||
|
|
||||||
|
public function deconnexion()
|
||||||
{
|
{
|
||||||
global $twig;
|
global $twig;
|
||||||
if (!isset($_REQUEST["action"])) {
|
session_unset();
|
||||||
$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();
|
session_destroy();
|
||||||
header('Location: index.php?action=accueil');
|
|
||||||
|
header("Location: /SAE_2A_FA-Reseau_ALICA/php/");
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
public function createOfferForm()
|
||||||
|
{
|
||||||
|
global $twig;
|
||||||
|
echo $twig->render("CreateOffer.html", []);
|
||||||
|
}
|
||||||
|
|
||||||
protected function proposerOffre()
|
public function createOffer()
|
||||||
{
|
{
|
||||||
//TODO
|
global $twig;
|
||||||
|
$taberror = [];
|
||||||
|
|
||||||
|
$requiredFields = ['name', 'entreprise', 'description','typeContrat', 'descriptPoste', 'profilRecherche', 'choixExp', 'education', 'mail', 'num'];
|
||||||
|
|
||||||
|
$error = false;
|
||||||
|
foreach ($requiredFields as $field) {
|
||||||
|
if (empty($_POST[$field])) {
|
||||||
|
$error = true;
|
||||||
|
$taberror[] = "Le champ {$field} est requis !";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($error)
|
||||||
|
{
|
||||||
|
echo $twig->render("CreateOffer.html", ['tabError' => $taberror ]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function consulterProfil()
|
if(!Validation::verifierEmail($_POST["mail"]))
|
||||||
{
|
{
|
||||||
//TODO
|
$taberror[] = "Email non valide !";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function modifierProfil()
|
if(!Validation::validateNumber($_POST["num"]))
|
||||||
{
|
{
|
||||||
//TODO
|
$taberror[] = "Numero non valide !";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Validation::validateImage("image"))
|
||||||
|
{
|
||||||
|
$taberror[] = "Image non valide !";
|
||||||
|
|
||||||
|
}
|
||||||
|
if(!Validation::validateImage("logo")) {
|
||||||
|
$taberror[] = "Logo non valide !";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(count($taberror) > 0)
|
||||||
|
{
|
||||||
|
echo $twig->render("CreateOffer.html", ['tabError' => $taberror ]);
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$saveImg1 = ImageManager::SaveImage("image");
|
||||||
|
$saveImg2 = ImageManager::SaveImage("logo");
|
||||||
|
if($saveImg1[0] != NULL && $saveImg2[0] != NULL)
|
||||||
|
{
|
||||||
|
$mbrModel = new MembreModele();
|
||||||
|
|
||||||
|
$offre = $mbrModel->publishOffer($saveImg1[1], $saveImg2[1]);
|
||||||
|
|
||||||
|
echo $twig->render("OffreDetail.html", ['offre' => $offre]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$taberror[] = "Erreur lors de l'upload des images";
|
||||||
|
echo $twig->render("CreateOffer.html", ['tabError' => $taberror ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function deleteOffer(?array $params)
|
||||||
|
{
|
||||||
|
global $twig;
|
||||||
|
$id = $params['id2'];
|
||||||
|
|
||||||
|
$MemberModel = new MembreModele();
|
||||||
|
$offre = $MemberModel->getOfferFromId($id);
|
||||||
|
if($offre != NULL)
|
||||||
|
{
|
||||||
|
$MemberModel->deleteOffer($offre);
|
||||||
|
|
||||||
|
}
|
||||||
|
$this->consultOffers(NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function signaler()
|
public function proposerOffre()
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
public function consulterProfil()
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
public function modifierProfil()
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
public function signaler()
|
||||||
{
|
{
|
||||||
//TODO
|
//TODO
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\gateway;
|
||||||
|
class ImageManager
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int id aléatoire
|
||||||
|
* @description générer un id aléatoire
|
||||||
|
*/
|
||||||
|
public static function getId() : int
|
||||||
|
{
|
||||||
|
return rand(10000,19999);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description sauvegarder une image
|
||||||
|
* @param string $filename
|
||||||
|
* @return array [bool,string] tableau de retour avec le booléen et le nom de l'image
|
||||||
|
*/
|
||||||
|
public static function SaveImage(string $filename) : array
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$return=[];
|
||||||
|
|
||||||
|
$name = $_FILES[$filename]["name"];
|
||||||
|
$path = "public/uploads/".$name;
|
||||||
|
while(file_exists($path))
|
||||||
|
{
|
||||||
|
$name = substr($_FILES[$filename]["name"], 0, 45);
|
||||||
|
$name = self::getId().$name;
|
||||||
|
$path = "public/uploads/".$name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
move_uploaded_file($_FILES[$filename]['tmp_name'], "public/uploads/$name");
|
||||||
|
$return[]=true;
|
||||||
|
$return[]=$name;
|
||||||
|
return $return;
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$return[] = false;
|
||||||
|
$return[] = "";
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $img
|
||||||
|
* @return bool true si l'image a été supprimée, false sinon
|
||||||
|
* @description supprimer une image
|
||||||
|
*/
|
||||||
|
public static function deleteImg(string $img) : bool
|
||||||
|
{
|
||||||
|
$path = "public/uploads/$img";
|
||||||
|
if (file_exists($path)) {
|
||||||
|
unlink($path);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,44 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\gateway;
|
|
||||||
class ImageSaver
|
|
||||||
{
|
|
||||||
|
|
||||||
public static function getId() : int
|
|
||||||
{
|
|
||||||
return rand(10000,19999);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function SaveImage(string $filename) : array
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
$return = [];
|
|
||||||
|
|
||||||
$originalName = $_FILES[$filename]["name"];
|
|
||||||
$name = substr($originalName, 0, 45);
|
|
||||||
$name = self::getId() . $name;
|
|
||||||
|
|
||||||
$uploadDir = "public/uploads/";
|
|
||||||
$targetPath = $uploadDir . $name;
|
|
||||||
|
|
||||||
$counter = 1;
|
|
||||||
while (file_exists($targetPath)) {
|
|
||||||
$name = self::getId() . $counter . $originalName;
|
|
||||||
$targetPath = $uploadDir . $name;
|
|
||||||
$counter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
move_uploaded_file($_FILES[$filename]['tmp_name'], $targetPath);
|
|
||||||
|
|
||||||
$return[] = true;
|
|
||||||
$return[] = $name;
|
|
||||||
|
|
||||||
return $return;
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
$return[] = false;
|
|
||||||
$return[] = "";
|
|
||||||
return $return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\metier;
|
||||||
|
|
||||||
|
class Image
|
||||||
|
{
|
||||||
|
private int $id;
|
||||||
|
private string $name;
|
||||||
|
|
||||||
|
private string $taille;
|
||||||
|
|
||||||
|
private string $type;
|
||||||
|
|
||||||
|
private string $blob;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $id
|
||||||
|
* @param string $name
|
||||||
|
* @param string $taille
|
||||||
|
* @param string $type
|
||||||
|
* @param string $blob
|
||||||
|
*/
|
||||||
|
public function __construct(int $id, string $name, string $taille, string $type, string $blob)
|
||||||
|
{
|
||||||
|
$this->id = $id;
|
||||||
|
$this->name = $name;
|
||||||
|
$this->taille = $taille;
|
||||||
|
$this->type = $type;
|
||||||
|
$this->blob = $blob;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getName(): string
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getTaille(): string
|
||||||
|
{
|
||||||
|
return $this->taille;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getType(): string
|
||||||
|
{
|
||||||
|
return $this->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getBlob(): string
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,145 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\modele;
|
|
||||||
|
|
||||||
use App\gateway\AlumniGateway;
|
|
||||||
use App\gateway\Connection;
|
|
||||||
use App\gateway\ImageGateway;
|
|
||||||
use App\gateway\OffreGateway;
|
|
||||||
use App\gateway\ProfilGateway;
|
|
||||||
use App\metier\Alumni;
|
|
||||||
use App\metier\Offre;
|
|
||||||
use App\metier\Image;
|
|
||||||
use mysql_xdevapi\Exception;
|
|
||||||
|
|
||||||
class OffreModele
|
|
||||||
{
|
|
||||||
private OffreGateway $offreGw;
|
|
||||||
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->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]['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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,304 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\router;
|
||||||
|
/*
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2012 Danny van Kooten <hi@dannyvankooten.com>
|
||||||
|
|
||||||
|
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<named>)
|
||||||
|
$pattern = '(?:'
|
||||||
|
. ($pre !== '' ? $pre : null)
|
||||||
|
. '('
|
||||||
|
. ($param !== '' ? "?P<$param>" : null)
|
||||||
|
. $type
|
||||||
|
. ')'
|
||||||
|
. $optional
|
||||||
|
. ')'
|
||||||
|
. $optional;
|
||||||
|
|
||||||
|
$route = str_replace($block, $pattern, $route);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "`^$route$`u";
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Offre {{ offre.getNom() }}</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,125 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en" xmlns="http://www.w3.org/1999/html">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Publier une Offre</title>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<header>
|
|
||||||
{% include "menu.html" %}
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main class="container mt-4">
|
|
||||||
<h1>Publier Une Offre</h1>
|
|
||||||
|
|
||||||
<form style="background-color: #00DBFF" class="p-4" enctype="multipart/form-data" action="index.php?action=createOffer" method="post">
|
|
||||||
|
|
||||||
{% if tabError is defined %}
|
|
||||||
{% for error in tabError %}
|
|
||||||
<p style="color: red">{{ error }}</p>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
<p>Les champs contenant des astrérisques * sont obligatoires.</p>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="name">Intitulé de l'offre*</label>
|
|
||||||
<input type="text" class="form-control" id="name" name="name" placeholder="Intitulé" maxlength="128" required>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="entreprise">Nom de l'entreprise :*</label>
|
|
||||||
<input type="text" class="form-control" id="entreprise" name="entreprise" placeholder="Entreprise" maxlength="64" required>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="description">Amorce :*</label>
|
|
||||||
<textarea class="form-control" id="description" name="description" placeholder="Description rapide" maxlength="200" required></textarea>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-check">
|
|
||||||
<input type="checkbox" class="form-check-input" id="fullRemote" name="fullRemote" >
|
|
||||||
<label class="form-check-label" for="fullRemote">Full Remote</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="ville">Ville</label>
|
|
||||||
<input type="text" class="form-control" id="ville" name="ville" placeholder="Ville" required maxlength="100">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="choixContrat">Choisissez un type de contrat :*</label>
|
|
||||||
<select class="form-control" id="choixContrat" name="typeContrat">
|
|
||||||
<option value="CDI" selected>CDI</option>
|
|
||||||
<option value="CDD">CDD</option>
|
|
||||||
<option value="Alternance">Alternance</option>
|
|
||||||
<option value="Stage">Stage</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="descriptPoste">Descriptif du Poste :*</label>
|
|
||||||
<textarea class="form-control" id="descriptPoste" name="descriptPoste" placeholder="Description du Poste" required maxlength="2028"></textarea>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="profilRecherche">Profil Recherché :*</label>
|
|
||||||
<textarea class="form-control" id="profilRecherche" name="profilRecherche" placeholder="Profil recherché" required maxlength="2028"></textarea>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="choixExp">Experience Recherchée :*</label>
|
|
||||||
<select class="form-control" id="choixExp" name="choixExp" required>
|
|
||||||
<option value="Indifférent" selected>Indifferent</option>
|
|
||||||
<option value="Junior">Junior</option>
|
|
||||||
<option value="Senior">Senior</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="nivEtudes">Niveau d'études :*</label>
|
|
||||||
<select class="form-control" id="nivEtudes" name="education" required>
|
|
||||||
<option value="Indifférent" selected>Indifferent</option>
|
|
||||||
<option value="Bac+2">Bac+2</option>
|
|
||||||
<option value="Bac+3">Bac+3</option>
|
|
||||||
<option value="Bac+5">Bac+5</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="mail">Email de contact :*</label>
|
|
||||||
<input type="text" class="form-control" id="mail" name="mail" placeholder="Adresse de contact" maxlength="30" required>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="num">Numero de contact :*</label>
|
|
||||||
<input type="text" class="form-control" id="num" name="num" placeholder="Numéro de contact" required maxlength="10">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="site">Site web de l'annonce ou entreprise :</label>
|
|
||||||
<input type="text" class="form-control" id="site" name="site" placeholder="Adresse web" maxlength="40" required>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label for="image">Image*</label>
|
|
||||||
<input type="file" name="image" id="image" required>
|
|
||||||
<label for="logo">Logo d'entreprise*</label>
|
|
||||||
<input type="file" name="logo" id="logo" required>
|
|
||||||
<input type="submit" value="Publier L'annonce" name="submit" id="submit">
|
|
||||||
<p><i>Les images doivent être de type png, jpg, jpeg, bmp, webp & inférieures à 10MB</i></p>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<!-- scripts : -->
|
|
||||||
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.3/dist/umd/popper.min.js"></script>
|
|
||||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,74 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Profils des Alumnis</title>
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="{{ dir }}/public/css/profil.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
{% include "menu.html" %}
|
||||||
|
</header>
|
||||||
|
<h1 class="text-center my-4">Les Alumnis :</h1>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-12 col-md-8">
|
||||||
|
<div class="profiles-container">
|
||||||
|
{% for profil in profils %}
|
||||||
|
<div class="profile d-flex">
|
||||||
|
<div class="profile-image-container">
|
||||||
|
<img src=" {{dir}}/public/uploads/{{ profil.getImage() ?: 'logo.png'}}" alt="Image de profil">
|
||||||
|
</div>
|
||||||
|
<div class="profile-details">
|
||||||
|
<p>{{ profil.prenom }} {{ profil.nom }}</p>
|
||||||
|
{% if profil.experience is defined %}
|
||||||
|
<p class="job-title">{{ profil.experience }}</p>
|
||||||
|
{% else %}
|
||||||
|
<p class="job-title">Cet utilisateur n'a pas renseigné son poste</p>
|
||||||
|
{% endif %}
|
||||||
|
<a href="#" class="btn btn-primary">Voir le détail du profil</a>
|
||||||
|
{% if role == 'Admin' %}
|
||||||
|
<button onclick="fetch('{{ dir }}/admin/{{ profil.id }}/supprimerCompte');window.location.reload()" class="btn btn-danger">Bannir l'utilisateur</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p>Aucun profil trouvé.</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<nav aria-label="Page navigation example">
|
||||||
|
<ul class="pagination justify-content-center">
|
||||||
|
<li class="page-item {% if page <= 1 %}disabled{% endif %}">
|
||||||
|
<a class="page-link" href="{{ dir }}/getProfilByPage/{{ page - 1 }}" tabindex="-1">Précédente</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
{% for i in 1..nombreTotalPages %}
|
||||||
|
<li class="page-item {% if page == i %}active{% endif %}">
|
||||||
|
<a class="page-link" href="{{ dir }}/getProfilByPage/{{ i }}">{{ i }}</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% if page < nombreTotalPages %}
|
||||||
|
<li class="page-item">
|
||||||
|
<a class="page-link" href="{{ dir }}/getProfilByPage/{{ page + 1 }}">Suivante</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="page-item disabled">
|
||||||
|
<a class="page-link" href="#">Suivante</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<script></script>
|
||||||
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|