projet_php/controllers/project_controller.php
2026-02-24 19:42:05 +01:00

426 lines
14 KiB
PHP

<?php
require("./models/project_model.php");
require("./entities/project_entity.php");
require("./models/category_model.php");
require("./entities/category_entity.php");
require("./models/image_model.php");
require("./entities/image_entity.php");
require("./models/user_model.php");
require("./entities/user_entity.php");
require("mother_controller.php");
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;
/**
* Le controler des Project
* @author Yasser & Laura
*/
class ProjectCtrl extends MotherCtrl{
/**
* Fonction d'affichage de la page d'acceuil
*/
public function home(){
if (!isset($_SESSION['user']) && isset($_COOKIE['remember_me'])) {
$token_du_cookie = $_COOKIE['remember_me'];
$hash_a_verifier = hash('sha256', $token_du_cookie);
$objUserModel = new UserModel;
// 2. On cherche le jeton dans TA table "tokens" (avec token_user_id)
$row = $objUserModel->getTokenUser($hash_a_verifier);
if ($row) {
// 3. Jeton trouvé ! On récupère les infos de l'utilisateur
$user = $objUserModel->findUserById($row['token_user_id']);
if ($user) {
// 4. On recrée la session comme lors d'un login normal
$_SESSION['user'] = $user;
}
}
}
$intCategory = 0;
if (!empty($_GET['filter_cat'])) {
$intCategory = (int) $_GET['filter_cat'];
}
$boolOld = false;
if (!empty($_GET['filter_old']) && $_GET['filter_old'] == 'true') {
$boolOld = true;
}
$objProjectModel = new ProjectModel;
$arrProject = $objProjectModel->findAll(0,'',0,0,'','','',$intCategory,$boolOld);
$arrProjectToDisplay = array();
foreach($arrProject as $arrDetProject){
$objProject = new Project;
$objProject->hydrate($arrDetProject);
$arrProjectToDisplay[] = $objProject;
}
$this->_arrData['arrProjectToDisplay'] = $arrProjectToDisplay;
$this->_display("home");
}
/**
* Fonction d'affichage de la barre de recherche
*/
public function search(){
//Récupérer les informations du formulaire
$strKeywords = $_POST['keywords']??'';
$intAuthor = $_POST['author']??0;
$intPeriod = $_POST['period']??0;
$strDate = $_POST['date']??'';
$strStartDate = $_POST['startdate']??'';
$strEndDate = $_POST['enddate']??'';
$intCategory = $_POST['category']??0;
// Récupération des projets
$objProjectModel = new ProjectModel;
$arrProject = $objProjectModel->findAll(intAuthor:$intAuthor, intPeriod:$intPeriod, strDate:$strDate,
strKeywords:$strKeywords, strStartDate:$strStartDate, strEndDate:$strEndDate, intCategory:$intCategory);
$arrProjectToDisplay = array();
foreach($arrProject as $arrDetProject){
$objProject = new Project;
$objProject->hydrate($arrDetProject);
$arrProjectToDisplay[] = $objProject;
}
// Récupération des utilisateurs
$objUserModel = new UserModel;
$arrUser = $objUserModel->findAllUsers();
// Récupération des catégories
$objCategoryModel = new CategoryModel;
$arrCategory = $objCategoryModel->findAllCategory();
$this->_arrData['arrProjectToDisplay'] = $arrProjectToDisplay;
$this->_arrData['arrCategory'] = $arrCategory;
$this->_arrData['arrProject'] = $arrProject;
$this->_arrData['arrUser'] = $arrUser;
$this->_display("search");
}
/**
* Fonction d'affichage de la page projet
* @author Christel adapter par Guillaume
*/
public function addedit_project() {
if (!isset($_SESSION['user'])){ // Pas d'utilisateur connecté
header("Location:index.php?ctrl=error&action=error_403");
exit;
}
$objProject = new Project;
$objProjectModel = new ProjectModel;
$objCategoryModel = new CategoryModel;
// dans la cas de modif
if (isset($_GET['id'])){
$arrProject = $objProjectModel->findOne($_GET['id']);
$objProject->hydrate($arrProject); // BDD
}
// Tester le formulaire
$arrError = [];
if (count($_POST) > 0) {
$objProject->hydrate($_POST); // Formulaire
if ($objProject->getTitle() == ""){
$arrError['title'] = "Le titre est obligatoire";
}
if ($objProject->getDescription() == ""){
$arrError['description'] = "La description est obligatoire";
}
if ($objProject->getContent() == ""){
$arrError['content'] = "Le contenu est obligatoire";
}
// Vérification de l'image
$arrTypeAllowed = array('image/jpeg', 'image/png', 'image/webp');
if ($_FILES['thumbnail']['error'] != 4){
if (!in_array($_FILES['thumbnail']['type'], $arrTypeAllowed)){
$arrError['thumbnail'] = "Le type de fichier n'est pas autorisé";
}else{
// Vérification des codes d'erreur
switch ($_FILES['thumbnail']['error']){
case 0 :
// Renommage de l'image
$strImageName = uniqid().".webp";
// Récupère le nom de l'image avant changement
$strOldImg = $objProject->getThumbnail();
// Mise à jour du nom de l'image dans l'objet
$objProject->setThumbnail($strImageName);
break;
case 1 :
case 2 :
$arrError['thumbnail'] = "Le fichier est trop volumineux";
break;
case 3 :
$arrError['thumbnail'] = "Le fichier a été partiellement téléchargé";
break;
case 6 :
$arrError['thumbnail'] = "Le répertoire temporaire est manquant";
break;
default :
$arrError['thumbnail'] = "Erreur sur l'image";
break;
}
}
}else{
// Est-ce que le fichier existe ?
if (is_null($objProject->getThumbnail())){
$arrError['thumbnail'] = "L'image est obligatoire";
}
}
// SI pas d'erreur : on traite l'image depuis la bdd
if (count($arrError) == 0){
$boolImageOk = true;
// Redimensionnement de l'image
if (isset($strImageName)){
$strDest = $_ENV['IMG_PATH'].$strImageName;
$strSource = $_FILES['thumbnail']['tmp_name'];
list($intWidth, $intHeight) = getimagesize($strSource);
$intDestWidth = 200; $intDestHeight = 250;
$fltDestRatio = $intDestWidth / $intDestHeight;
$fltSourceRatio = $intWidth / $intHeight;
if ($fltSourceRatio > $fltDestRatio) {
$intCropHeight = $intHeight;
$intCropWidth = (int)round($intHeight * $fltDestRatio);
$intCropX = (int)(($intWidth - $intCropWidth) / 2);
$intCropY = 0;
} else {
$intCropWidth = $intWidth;
$intCropHeight = (int)round($intWidth / $fltDestRatio);
$intCropX = 0;
$intCropY = (int)(($intHeight - $intCropHeight) / 2);
}
// Condition en fonction de l'extension de l'image
$objDest = imagecreatetruecolor($intDestWidth, $intDestHeight);
switch ($_FILES['thumbnail']['type']) {
case 'image/jpeg' :
$objSource = imagecreatefromjpeg($strSource);
break;
case 'image/png' :
$objSource = imagecreatefrompng($strSource);
break;
case 'image/webp' :
$objSource = imagecreatefromwebp($strSource);
break;
}
imagecopyresampled($objDest, $objSource, 0, 0, $intCropX, $intCropY, $intDestWidth, $intDestHeight, $intCropWidth, $intCropHeight);
// Sauvegarde du fichier
$boolImageOk = imagewebp($objDest, $strDest);
imagedestroy($objDest);
imagedestroy($objSource);
}
// SI image ok, on balance tout dans la bdd
if ($boolImageOk){
if (!isset($_GET['id'])){
$objProject->setUser_id($_SESSION['user']['user_id']);
$boolOk = $objProjectModel->insert($objProject);
} else {
$boolOk = $objProjectModel->updateProject($objProject);
}
if ($boolOk){
// Suppression de l'ancienne image
if(isset($strOldImg) && !empty($strOldImg) && isset($strImageName)){
$strOldFile = $_ENV['IMG_PATH'].$strOldImg;
if (file_exists($strOldFile)) unlink($strOldFile);
}
$_SESSION['success'] = (!isset($_GET['id'])) ? "Le projet a bien été créé" : "Le projet a bien été modifié";
header("Location:index.php");
exit;
} else {
$arrError[] = "Erreur lors de l'enregistrement en base de données";
}
} else {
$arrError['thumbnail'] = "Erreur dans le traitement de l'image";
}
}
}
// Données pour la vue
$this->_arrData['arrCategory'] = $objCategoryModel->findAllCategory();
$this->_arrData['objProject'] = $objProject;
$this->_arrData['arrError'] = $arrError;
$this->_display('addedit_project');
}
public function display() {
$intId = $_GET['id'] ?? null;
if ($intId) {
$objProjectModel = new ProjectModel();
$arrProject = $objProjectModel->findOne((int)$intId);
if ($arrProject) {
$objProject = new Project();
$objProject->hydrate($arrProject);
$this->_arrData["objProject"] = $objProject;
$this->_arrData["arrProject"] = $arrProject;
$this->_display("project_display");
} else {
header("Location: index.php?ctrl=project&action=home");
exit;
}
} else {
header("Location: index.php?ctrl=project&action=home");
exit;
}
}
public function shareProject(){
if (count($_POST) > 0)
{
$projectId = (int)($_POST['project_id'] ?? 0);
$toEmail = trim($_POST['to_email'] ?? '');
$objProjectModel = new ProjectModel();
$arrProject = $objProjectModel->findOne($projectId);
if (!$arrProject) {
header("Location: index.php?ctrl=project&action=home");
exit;
}
$objProject = new Project();
$objProject->hydrate($arrProject);
$objMail = new PHPMailer();
$objMail->IsSMTP();
$objMail->Mailer = "smtp";
$objMail->CharSet = PHPMailer::CHARSET_UTF8;
$objMail->SMTPDebug = 0;
$objMail->SMTPAuth = true;
$objMail->SMTPSecure = "tls";
$objMail->Port = 587;
$objMail->Host = 'smtp-relay.brevo.com';
$objMail->Username = 'a2a67e001@smtp-brevo.com';
$objMail->Password = 'xsmtpsib-f2af87e12d3db6f1b99802a92c1acda32d45fc32a8446eeed7e49ec91c4ec7ef-AX8Y7YkRWYSmKHwS';
// Désactive la vérification du certificat SSL
// Cela permet d'éviter les erreurs liées au certificat, mais réduit la sécurité de la connexion.
$objMail->SMTPOptions = [
'ssl' => [
'verify_peer' => false,
],
];
$objMail->IsHTML(true);
$objMail->setFrom('projet.folliow@hotmail.com', 'Folliow');
$objMail->addAddress($toEmail);
$objMail->Subject = "Projet : " . $objProject->getTitle();
$url = "https://php.boulayoune.com/index.php?ctrl=project&action=display&id=" . $projectId;
$this->_arrData['projectTitle'] = $objProject->getTitle();
$this->_arrData['projectDescription'] = $objProject->getDescription();
$this->_arrData['projectUrl'] = $url;
$objMail->Body = $this->_display("mail_message", false);
if ($objMail->Send()) {
header("Location: index.php?ctrl=project&action=display&id=".$projectId."&mail=ok");
} else {
header("Location: index.php?ctrl=project&action=display&id=".$projectId."&mail=fail");
}
exit;
}
header("Location: index.php?ctrl=project&action=home");
exit;
}
public function accept(){
//Récupéré l'id dans l'url
$intId = $_GET['id'];
//Je créer un nouveau model pour exec la commande SQL
$objProjectModel = new ProjectModel;
$objProjectModel->accept($intId);
//Redirection vers la page
header("Location: index.php");
exit;
}
public function refuse(){
//Récupéré l'id dans l'url
$intId = $_GET['id'];
//Je créer un nouveau model pour exec la commande SQL
$objProjectModel = new ProjectModel;
$objProjectModel->refuse($intId);
//Redirection vers la page
header("Location: index.php");
exit;
}
public function delete(){
//Récupéré l'id dans l'url
$intId = $_GET['id'];
//Je créer un nouveau model pour exec la commande SQL
$objProjectModel = new ProjectModel;
$objProjectModel->delete($intId);
//Redirection vers la page
header("Location: index.php");
exit;
}
/**
* Page mentions légales
*/
public function mentions(){
// Afficher
$this->_display("mentions");
}
/**
* Page à propos
*/
public function about(){
// Afficher
$this->_display("about");
}
}