Merge pull request 'AffichageProfil' (#45) from AffichageProfil into master

Reviewed-on: #45
alexis-rendu
Leo TUAILLON 1 year ago
commit ed00c99894

@ -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>

@ -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;
}

@ -18,14 +18,19 @@ class FrontControleur
global $twig; global $twig;
session_start(); session_start();
if($_SESSION["utilisateur"]){
$twig->addGlobal('nom', $_SESSION["utilisateur"]->getNom());
$twig->addGlobal('prenom', $_SESSION["utilisateur"]->getPrenom());
$twig->addGlobal('role', $_SESSION["utilisateur"]->getRole());
$twig->addGlobal('id', $_SESSION["utilisateur"]->getId());
}
$router = new AltoRouter(); $router = new AltoRouter();
$router->setBasePath('/SAE_2A_FA-Reseau_ALICA/php'); $router->setBasePath('/SAE_2A_FA-Reseau_ALICA/php');
$router->map('GET', '/', 'UtilisateurControleur'); $router->map('GET|POST', '/', 'UtilisateurControleur');
$router->map('GET','/[a:action]?','UtilisateurControleur'); $router->map('GET|POST','/[a:action]?','UtilisateurControleur');
$router->map('POST','/[a:action]?','UtilisateurControleur'); $router->map('POST','/[a:action]?','UtilisateurControleur');

@ -7,18 +7,17 @@ use App\gateway\ImageSaver;
use App\metier\Alumni; use App\metier\Alumni;
use App\modele\OffreModele; use App\modele\OffreModele;
use App\modele\UtilisateurModele; use App\modele\UtilisateurModele;
use Exception;
class UtilisateurControleur class UtilisateurControleur
{ {
public function __construct()
{
}
public function connection() public function connection()
{ {
global $twig; global $twig;
$dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant
$dVueErreur = [];
$userModel = new UtilisateurModele(); $userModel = new UtilisateurModele();
if (isset($_POST['email'], $_POST['password'])) { if (isset($_POST['email'], $_POST['password'])) {
@ -29,8 +28,8 @@ class UtilisateurControleur
if ($utilisateur instanceof Alumni) { if ($utilisateur instanceof Alumni) {
$_SESSION['utilisateur'] = $utilisateur; $_SESSION['utilisateur'] = $utilisateur;
header('Location: accueil'); echo $twig->render('accueil.html');
exit(); return;
} else { } else {
$dVueErreur[] = "L'adresse email ou le mot de passe est incorrect."; $dVueErreur[] = "L'adresse email ou le mot de passe est incorrect.";
} }
@ -42,7 +41,7 @@ class UtilisateurControleur
{ {
global $twig; global $twig;
$dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant $dVueErreur = [];
$userModel = new UtilisateurModele(); $userModel = new UtilisateurModele();
if (isset($_POST['firstname'],$_POST['name'], $_POST['email'], $_POST['password'])) { if (isset($_POST['firstname'],$_POST['name'], $_POST['email'], $_POST['password'])) {
@ -51,23 +50,25 @@ class UtilisateurControleur
$email = Validation::nettoyerString($_POST['email']); $email = Validation::nettoyerString($_POST['email']);
$motDePasse = Validation::nettoyerString($_POST['password']); $motDePasse = Validation::nettoyerString($_POST['password']);
$hash = password_hash($motDePasse, PASSWORD_DEFAULT); $hash = password_hash($motDePasse, PASSWORD_DEFAULT);
try {
// verification que l'email est valide et unique :
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$dVueErreur[] = "L'adresse email n'est pas valide ou est déjà utilisée.";
} else {
$utilisateur = $userModel->getUtilisateurByEmail($email);
if ($utilisateur instanceof Alumni) {
$dVueErreur[] = "L'adresse email est déjà utilisée.";
}
}
$nouvelUtilisateur = $userModel->inscription($prenom, $nom, $email, $hash);
// verification que l'email est valide et unique : if ($nouvelUtilisateur instanceof Alumni) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { echo $twig->render('inscription_success.html');
$dVueErreur[] = "L'adresse email n'est pas valide ou est déjà utilisée."; exit();
} else {
$utilisateur = $userModel->getUtilisateurByEmail($email);
if ($utilisateur instanceof Alumni) {
$dVueErreur[] = "L'adresse email est déjà utilisée.";
} }
} }
$nouvelUtilisateur = $userModel->inscription($prenom,$nom,$email, $hash); catch (Exception $e) {
$dVueErreur[] = "L'inscription a échoué, veuillez réessayer.";
if ($nouvelUtilisateur instanceof Alumni) {
echo $twig->render('inscription_success.html');
exit();
} else {
$dVueErreur[] = "L'inscription a échoué, veuillez réessayer.";
} }
} }
echo $twig->render('inscription.html', ['dVueErreur' => $dVueErreur]); echo $twig->render('inscription.html', ['dVueErreur' => $dVueErreur]);
@ -78,19 +79,13 @@ class UtilisateurControleur
global $twig; global $twig;
// Ajout d'un var_dump pour déboguer // Ajout d'un var_dump pour déboguer
if (isset($_SESSION['utilisateur']) && $_SESSION['utilisateur'] instanceof Alumni) { if (isset($_SESSION['utilisateur']) && $_SESSION['utilisateur'] instanceof Alumni) {
$prenom = $_SESSION['utilisateur']->getPrenom();
$nom = $_SESSION['utilisateur']->getNom();
$id = $_SESSION['utilisateur']->getId();
}
else{
$prenom = null;
$nom = null;
$id = null;
}
$userModel = new UtilisateurModele(); $userModel = new UtilisateurModele();
$evenements=$userModel->getEvenement(); $evenements=$userModel->getEvenement();
//aller sur la page d'accueil avec le nom et prenom de l'utilisateur //aller sur la page d'accueil avec le nom et prenom de l'utilisateur
echo $twig->render('accueil.html', ['prenom' => $prenom, 'nom' => $nom, 'id' => $id,"eventsList"=>$evenements]); echo $twig->render('accueil.html', ['evenements' => $evenements]);
} else {
echo $twig->render('accueil.html');
}
} }
public function consulterProfilLimite() public function consulterProfilLimite()
@ -350,4 +345,33 @@ class UtilisateurControleur
global $twig; global $twig;
echo $twig->render('evenement.html', ['evenements' => $evenements]); echo $twig->render('evenement.html', ['evenements' => $evenements]);
} }
public function getProfilByPage(?array $params)
{
global $twig;
$dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant
$userModel = new UtilisateurModele();
$nbParPage = 10;
$nombreTotalPages = ceil(($userModel->getNbTotalPages())/$nbParPage);
if (isset($params['id'] ) && $params['id'] != null) {
$page = Validation::validerIntPossitif($params['id']);
try{
$profils = $userModel->getProfilByPage($page, $nbParPage);
if (isset($profils)) {
echo $twig->render('profil.html', [
'profils' => $profils,
'nombreTotalPages' => $nombreTotalPages,
'page' => $page]
);
}
}catch (Exception $e){
$dVueErreur[] = "Aucun profil n'a été trouvé.";
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
}
} else {
$dVueErreur[] = "La page n'existe pas.";
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
}
}
} }

@ -12,11 +12,13 @@ class AlumniGateway
/** /**
* @param $con * @param $con
*/ */
public function __construct(Connection $con){ public function __construct(Connection $con)
{
$this->con = $con; $this->con = $con;
} }
public function insert(string $email, string $motDePasse, string $role){ public function insert(string $email, string $motDePasse, string $role)
{
$query = 'INSERT INTO Alumni (mail, mdp, role) VALUES (:mail, :mdp, :role)'; $query = 'INSERT INTO Alumni (mail, mdp, role) VALUES (:mail, :mdp, :role)';
return $this->con->executeQuery($query, array( return $this->con->executeQuery($query, array(
':mail' => array($email, PDO::PARAM_STR), ':mail' => array($email, PDO::PARAM_STR),
@ -26,15 +28,16 @@ class AlumniGateway
} }
public function updateMotDePasse(int $id, string $password){ public function updateMotDePasse(int $id, string $password)
$query='UPDATE Alumni SET motDePasse=:new WHERE id=:i'; {
$query = 'UPDATE Alumni SET motDePasse=:new WHERE id=:i';
$this->con->executeQuery($query, array( $this->con->executeQuery($query, array(
':i' => array($id, PDO::PARAM_INT), ':i' => array($id, PDO::PARAM_INT),
':new' => array($password, PDO::PARAM_STR) ':new' => array($password, PDO::PARAM_STR)
)); ));
} }
public function ObtenirById(int $id) : array public function ObtenirById(int $id): array
{ {
$query = 'SELECT * FROM Alumni WHERE id=:i'; $query = 'SELECT * FROM Alumni WHERE id=:i';
$this->con->executeQuery($query, array( $this->con->executeQuery($query, array(
@ -43,7 +46,8 @@ class AlumniGateway
return $this->con->getResults(); return $this->con->getResults();
} }
public function findByEmail(string $email){ public function findByEmail(string $email)
{
$query = 'SELECT Alumni.id, Alumni.mail, Alumni.mdp, Alumni.role, Profil.nom, Profil.prenom $query = 'SELECT Alumni.id, Alumni.mail, Alumni.mdp, Alumni.role, Profil.nom, Profil.prenom
FROM Alumni FROM Alumni
LEFT JOIN Profil ON Alumni.id = Profil.alumni LEFT JOIN Profil ON Alumni.id = Profil.alumni
@ -55,8 +59,9 @@ class AlumniGateway
} }
public function getAll(){ public function getAll()
$query='SELECT * FROM Alumni'; {
$query = 'SELECT * FROM Alumni';
$this->con->executeQuery($query); $this->con->executeQuery($query);
return $this->con->getResults(); return $this->con->getResults();
} }
@ -70,4 +75,6 @@ class AlumniGateway
$res = $this->con->getResults(); $res = $this->con->getResults();
return $res[0]['id']; return $res[0]['id'];
} }
} }

@ -128,6 +128,13 @@ class OffreGateway
return $this->con->getResults(); return $this->con->getResults();
} }
public function getNbTotalPages()
{
$query = 'SELECT COUNT(*) FROM Profil';
$this->con->executeQuery($query, array());
$res = $this->con->getResults();
return intval($res[0]['COUNT(*)']);
}
} }

@ -33,4 +33,16 @@ class ProfilGateway
)); ));
return $this->con->getResults(); return $this->con->getResults();
} }
public function userByPage(int $page, int $nbParPage)
{
$start = ($page - 1) * $nbParPage; // Calcul de l'index de départ pour LIMIT
$start = max(0, $start); // Si $start est négatif, on met 0 (pas de page -1)
$query = 'SELECT * FROM Profil LIMIT :start, :nbParPage';
$this->con->executeQuery($query, array(
':start' => array($start, PDO::PARAM_INT),
':nbParPage' => array($nbParPage, PDO::PARAM_INT),
));
return $this->con->getResults();
}
} }

@ -34,7 +34,7 @@ class Alumni{
$this->email = $email; $this->email = $email;
$this->motDePasse = $motDePasse; $this->motDePasse = $motDePasse;
$this->role = $role; $this->role = $role;
$this->profil = new Profil($nom, $prenom, $email, "","", "", ""); $this->profil = new Profil($nom, $prenom, $email, "","", "", "","");
} }
/** /**

@ -19,6 +19,7 @@ class Profil
*/ */
private string $nom; private string $nom;
/** /**
* @var string Prenom * @var string Prenom
*/ */
@ -28,6 +29,8 @@ class Profil
/** /**
* @var string Url linkedin * @var string Url linkedin
*/ */
//image can be null
private ?string $image;
private string $linkedinUrl; private string $linkedinUrl;
/** /**
@ -48,11 +51,12 @@ class Profil
* @param string $githubUrl * @param string $githubUrl
* @param string $portfolioUrl * @param string $portfolioUrl
*/ */
public function __construct(string $nom, string $prenom, string $email, string $cv, string $linkedinUrl, string $githubUrl, string $portfolioUrl) public function __construct(string $nom, string $prenom, string $email, ?string $image,string $cv, string $linkedinUrl, string $githubUrl, string $portfolioUrl)
{ {
$this->nom = $nom; $this->nom = $nom;
$this->prenom = $prenom; $this->prenom = $prenom;
$this->image = $image;
$this->email = $email; $this->email = $email;
$this->cv = $cv; $this->cv = $cv;
$this->linkedinUrl = $linkedinUrl; $this->linkedinUrl = $linkedinUrl;
@ -61,6 +65,11 @@ class Profil
} }
public function getImage(): ?string
{
return $this->image ?? 'logo.png';
}
public function getCv(): string public function getCv(): string
{ {
return $this->cv; return $this->cv;

@ -8,6 +8,7 @@ use App\metier\Evenement;
use App\metier\Alumni; use App\metier\Alumni;
use App\gateway\AlumniGateway; use App\gateway\AlumniGateway;
use App\gateway\ProfilGateway; use App\gateway\ProfilGateway;
use App\metier\Profil;
use App\metier\Offre; use App\metier\Offre;
class UtilisateurModele class UtilisateurModele
@ -30,10 +31,10 @@ class UtilisateurModele
* @return Alumni * @return Alumni
*/ */
public function connection(string $email, string $mdp) : ? Alumni public function connection(string $email, string $mdp): ?Alumni
{ {
$con = new Connection(DB_HOST,DB_USER,DB_PASS); $con = new Connection(DB_HOST, DB_USER, DB_PASS);
$gate = new AlumniGateway($con); $gate = new AlumniGateway($con);
// Récupation de l'utilisateur avec l'email // Récupation de l'utilisateur avec l'email
$utilisateur = $gate->findByEmail($email); $utilisateur = $gate->findByEmail($email);
@ -60,41 +61,41 @@ class UtilisateurModele
* @return \Alumni chargé * @return \Alumni chargé
*/ */
public function inscription(string $prenom, string $nom,string $email, string $hashpassword):? Alumni public function inscription(string $prenom, string $nom, string $email, string $hashpassword): ?Alumni
{ {
$role = "Membre"; $role = "Membre";
$con = new Connection(DB_HOST,DB_USER,DB_PASS); $con = new Connection(DB_HOST, DB_USER, DB_PASS);
$gate = new AlumniGateway($con); $gate = new AlumniGateway($con);
$profilGate = new ProfilGateway($con); $profilGate = new ProfilGateway($con);
// Insérez le nouvel utilisateur dans la base de données en utilisant AlumniGateway // Insérez le nouvel utilisateur dans la base de données en utilisant AlumniGateway
if ($gate->insert($email, $hashpassword, $role)) { if ($gate->insert($email, $hashpassword, $role)) {
$id = $gate->getID($email); $id = $gate->getID($email);
if($profilGate->insert($id,$nom, $prenom,$email)){ if ($profilGate->insert($id, $nom, $prenom, $email)) {
// L'insertion a réussi, retournez le nouvel utilisateur // L'insertion a réussi, retournez le nouvel utilisateur
$nouvelUtilisateur = new Alumni($id,$email, $hashpassword, $role,$nom,$prenom); $nouvelUtilisateur = new Alumni($id, $email, $hashpassword, $role, $nom, $prenom);
return $nouvelUtilisateur; return $nouvelUtilisateur;
} }
return null; return null;
} else { } else {
// L'insertion a échoué, renvoyez un utilisateur vide pour indiquer l'échec // L'insertion a échoué, renvoyez un utilisateur vide pour indiquer l'échec
return null; return null;
} }
} }
public function getUtilisateurByEmail(string $email) public function getUtilisateurByEmail(string $email)
{ {
$con = new Connection(DB_HOST,DB_USER,DB_PASS); $con = new Connection(DB_HOST, DB_USER, DB_PASS);
$gate = new AlumniGateway($con); $gate = new AlumniGateway($con);
// Récupérez l'utilisateur avec l'email donné en utilisant AlumniGateway // Récupérez l'utilisateur avec l'email donné en utilisant AlumniGateway
$utilisateur = $gate->findByEmail($email); $utilisateur = $gate->findByEmail($email);
if ($utilisateur instanceof Alumni) { if ($utilisateur instanceof Alumni) {
// L'utilisateur existe, retournez-le // L'utilisateur existe, retournez-le
return $utilisateur; return $utilisateur;
} else { } else {
// L'utilisateur n'existe pas, renvoyez null // L'utilisateur n'existe pas, renvoyez null
return null; return null;
} }
} }
public function getEvenement() : array public function getEvenement() : array
{ {
@ -104,8 +105,7 @@ class UtilisateurModele
$evenement = array(); $evenement = array();
foreach($data as $row) foreach ($data as $row) {
{
$evenement[] = new Evenement( $evenement[] = new Evenement(
$row['id'], $row['id'],
$row['organisateur'], $row['organisateur'],
@ -185,6 +185,32 @@ class UtilisateurModele
return $evenement; return $evenement;
} }
public function getProfilByPage(string $page, int $nbParPage)
{
$page = max(1, intval($page));
$con = new Connection(DB_HOST, DB_USER, DB_PASS);
$gate = new ProfilGateway($con);
$data = $gate->userByPage($page, $nbParPage);
if(isset($data)){
//Création d'une liste d'objets utilisateurs
$profils = array();
foreach ($data as $row) {
$profils[] = new Profil(
$row['nom'],
$row['prenom'],
$row['email'],
$row['image'] ?? null,
$row['cv'] ?? '',
$row['linkedinURL'] ?? '',
$row['githubURL'] ?? '',
$row['portfolioURL'] ?? ''
);
}
return $profils;
}
return null;
}
public function getOfferFromId(int $id) : ?Offre public function getOfferFromId(int $id) : ?Offre
{ {
@ -264,5 +290,10 @@ class UtilisateurModele
return $offers; return $offers;
} }
public function getNbTotalPages()
{
return $this->offreGw->getNbTotalPages();
}
} }

@ -21,6 +21,7 @@
<li class="nav-link"><a href="{{dir}}/consultOffers">Offres</a></li> <li class="nav-link"><a href="{{dir}}/consultOffers">Offres</a></li>
<li class="nav-link"><a href="#">Nous contacter</a></li> <li class="nav-link"><a href="#">Nous contacter</a></li>
<li class="nav-link"><a href="{{dir}}/getProfilByPage/1">Les Alumnis</a></li>
</ul> </ul>
<ul class="nav-items"> <ul class="nav-items">
<!-- Afficher boutons de connexion et d'inscription --> <!-- Afficher boutons de connexion et d'inscription -->

@ -0,0 +1,70 @@
<!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/assets/{{ profil.image ?: 'default.png' }}" alt="Image de profil">
</div>
<div class="profile-details">
<p>{{ profil.prenom }} {{ profil.nom }}</p>
<p class="job-title">Développeur web chez CGI FRANCE</p>
<a href="{{ 'voir_profil.php?id=' ~ profil.id }}" class="btn btn-primary">Voir le détail du profil</a>
{% if user.role == 'admin' %}
<a href="{{ 'bloquer_profil.php?id=' ~ profil.id }}" class="btn btn-danger">Bannir l'utilisateur</a>
{% 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 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>
Loading…
Cancel
Save