Merge branch 'main' into besnik
This commit is contained in:
commit
c1c3a75aa2
36 changed files with 1661 additions and 7 deletions
115
app/controllers/project_controller.php
Normal file
115
app/controllers/project_controller.php
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
<?php
|
||||
require("../app/models/project_model.php");
|
||||
require("../app/entities/project_entity.php");
|
||||
require("../app/models/category_model.php");
|
||||
require("../app/entities/category_entity.php");
|
||||
require("../app/models/image_model.php");
|
||||
require("../app/entities/image_entity.php");
|
||||
|
||||
/**
|
||||
* Le controler des Project
|
||||
* @author Yasser & Laura
|
||||
*/
|
||||
class ProjectCtrl{
|
||||
|
||||
/**
|
||||
* Fonction d'affichage de la page d'acceuil
|
||||
*/
|
||||
|
||||
public function home(){
|
||||
|
||||
$objProjectModel = new ProjectModel;
|
||||
$arrProject = $objProjectModel->findAll(4);
|
||||
$arrProjectToDiplay = array();
|
||||
foreach($arrProject as $arrDetProject){
|
||||
$objProject = new Project;
|
||||
$objProject->hydrate($arrDetProject);
|
||||
$arrProjectToDiplay[] = $objProject;
|
||||
}
|
||||
|
||||
include('../app/views/partials/header.php');
|
||||
include('../app/views/home.php');
|
||||
include('../app/views/partials/footer.php');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction d'affichage de la barre de recherche
|
||||
*/
|
||||
|
||||
public function search(){
|
||||
|
||||
//variable pour faire fonctionner le script en footer
|
||||
$strPage = "search";
|
||||
|
||||
// inclusion du header
|
||||
include('../app/views/partials/header.php');
|
||||
|
||||
//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 projetc
|
||||
$objProjectModel = new ProjectModel;
|
||||
$arrProject = $objProjectModel->findAll(intAuthor:$intAuthor, intPeriod:$intPeriod, strDate:$strDate,
|
||||
strKeywords:$strKeywords, strStartDate:$strStartDate, strEndDate:$strEndDate, intCategory:$intCategory);
|
||||
|
||||
// Initialisation d'un tableau => objets
|
||||
$arrProjectToDisplay = array();
|
||||
// Boucle de transformation du tableau de tableau en tableau d'objets
|
||||
foreach($arrProject as $arrDetProject){
|
||||
$objProject = new Project;
|
||||
$objProject->hydrate($arrDetProject);
|
||||
$arrProjectToDisplay[] = $objProject;
|
||||
}
|
||||
|
||||
// Récupération des utilisateurs
|
||||
require_once("../app/models/user_model.php");
|
||||
$objUserModel = new UserModel;
|
||||
$arrUser = $objUserModel->findAllUsers();
|
||||
|
||||
// Récupération des catégories
|
||||
require_once("../app/models/category_model.php");
|
||||
$objCategoryModel = new CategoryModel;
|
||||
$arrCategory = $objCategoryModel->findAllCategory();
|
||||
|
||||
|
||||
include('../app/views/search.php');
|
||||
include('../app/views/partials/footer.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* Fonction d'affichage de la page projet
|
||||
*/
|
||||
|
||||
|
||||
public function project (){
|
||||
|
||||
$objProjectModel = new ProjectModel;
|
||||
$arrProject = $objProjectModel->findAll(4);
|
||||
$arrProjectToDiplay = array();
|
||||
foreach($arrProject as $arrDetProject){
|
||||
$objProject = new Project;
|
||||
$objProject->hydrate($arrDetProject);
|
||||
$arrProjectToDiplay[] = $objProject;
|
||||
}
|
||||
|
||||
$objImageModel = new ImageModel;
|
||||
$arrImage = $objImageModel->findAllImage(4);
|
||||
$arrImageToDiplay = array();
|
||||
foreach($arrImage as $arrDetImage){
|
||||
$objImage = new Image;
|
||||
$objImage->hydrate($arrDetImage);
|
||||
$arrImageToDiplay[] = $objImage;
|
||||
}
|
||||
|
||||
include("../app/views/partials/header.php");
|
||||
include('../app/views/project.php');
|
||||
include('../app/views/partials/footer.php');
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -32,18 +32,11 @@ class UserCtrl{
|
|||
$arrError[] = "Mail ou mot de passe invalide";
|
||||
}else{
|
||||
// Ajoute l'utilisateur en session
|
||||
/*$_SESSION['firstname'] = $arrResult['user_firstname'];
|
||||
$_SESSION['name'] = $arrResult['user_name'];
|
||||
$_SESSION['id'] = $arrResult['user_id'];*/
|
||||
// j'enlève le mot de passe avant la session
|
||||
//unset($arrResult['user_pwd']);
|
||||
$_SESSION['user'] = $arrResult;
|
||||
$_SESSION['success'] = "Bienvenue, vous êtes bien connecté";
|
||||
|
||||
header("Location:index.php");
|
||||
exit;
|
||||
//var_dump($_SESSION);
|
||||
//var_dump("Connecté");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
57
app/entities/category_entity.php
Normal file
57
app/entities/category_entity.php
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
require_once("mother_entity.php");
|
||||
|
||||
/**
|
||||
* Classe d'un objet Projet
|
||||
* @author Laura
|
||||
*/
|
||||
|
||||
class Category extends Entity{
|
||||
|
||||
private int $_id;
|
||||
protected string $_name = '';
|
||||
|
||||
/**
|
||||
* Constructeur (j'ai toujours pas compris à quoi ça sert)
|
||||
*/
|
||||
public function __construct(){
|
||||
$this->_prefix = 'category_';
|
||||
}
|
||||
|
||||
// Méthode Getter et Setter
|
||||
|
||||
/**
|
||||
* Récuperation de l'id de la catégorie
|
||||
* @return int l'id de la catégorie
|
||||
*/
|
||||
public function getId():int{
|
||||
return $this->_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de l'id de la catégorie
|
||||
* @param int le nouvelle id
|
||||
*/
|
||||
public function setId($id){
|
||||
$this->_id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récuperation du nom de la catégorie
|
||||
* @return string nom de la catégorie
|
||||
*/
|
||||
public function getName(){
|
||||
return $this->_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour du nom de la catégorie
|
||||
* @param string le nouveau nom de la catégorie
|
||||
*/
|
||||
public function setName($name){
|
||||
$this->_name = $name;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
91
app/entities/image_entity.php
Normal file
91
app/entities/image_entity.php
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
<?php
|
||||
|
||||
require_once("mother_entity.php");
|
||||
|
||||
/**
|
||||
* Classe d'un objet Projet
|
||||
* @author Laura
|
||||
*/
|
||||
|
||||
class Image extends Entity{
|
||||
|
||||
private int $_id;
|
||||
private string $_name = '';
|
||||
private string $_alt = '';
|
||||
private string $_status ='';
|
||||
private int $_project = 0;
|
||||
|
||||
|
||||
|
||||
//le construc habituel
|
||||
public function __construct(){
|
||||
$this->_prefix = 'image_';
|
||||
}
|
||||
|
||||
// Méthode Getter et Setter
|
||||
|
||||
/**
|
||||
* Récuperation de l'id de l'image
|
||||
* @return int l'id de l'image
|
||||
*/
|
||||
public function getId():int{
|
||||
return $this->_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de l'id de l'image
|
||||
* @param int le nouvelle id
|
||||
*/
|
||||
public function setId($id){
|
||||
$this->_id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récuperation du nom de l'image
|
||||
* @return string nom de l'image
|
||||
*/
|
||||
public function getName(){
|
||||
return $this->_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour du nom de l'image
|
||||
* @param string le nouveau nom de l'image
|
||||
*/
|
||||
public function setName($name){
|
||||
$this->_name = $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récuperation de l'alt
|
||||
* @return string contenu de l'alt
|
||||
*/
|
||||
public function getAlt(){
|
||||
return $this->_alt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de l'alt
|
||||
* @param string le nouveau contenu de l'alt
|
||||
*/
|
||||
public function setAlt($alt){
|
||||
$this->_alt = $alt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récuperation du statut de la photo
|
||||
* @return string du statut
|
||||
*/
|
||||
public function getStatus(){
|
||||
return $this->_status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour du statut de la photo
|
||||
* @param string le nouveau statut de la photo
|
||||
*/
|
||||
public function setStatus($status){
|
||||
$this->_status = $status;
|
||||
}
|
||||
|
||||
}
|
||||
29
app/entities/mother_entity.php
Normal file
29
app/entities/mother_entity.php
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Classe d'un Mere de tout objet
|
||||
* @author Yass & Laura
|
||||
*/
|
||||
|
||||
class Entity{
|
||||
|
||||
protected string $_prefix = '';
|
||||
|
||||
|
||||
public function hydrate(array $arrData){
|
||||
foreach($arrData as $key=>$value){
|
||||
$strMethodName = "set".ucfirst(str_replace($this->_prefix,'',$key));
|
||||
if (method_exists($this,$strMethodName)){
|
||||
$this->$strMethodName($value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function nettoyer(string $strText){
|
||||
$strText = trim($strText);
|
||||
$strText = str_replace("<script>", "", $strText);
|
||||
$strText = str_replace("</script>", "", $strText);
|
||||
return $strText;
|
||||
}
|
||||
|
||||
}
|
||||
220
app/entities/project_entity.php
Normal file
220
app/entities/project_entity.php
Normal file
|
|
@ -0,0 +1,220 @@
|
|||
<?php
|
||||
require_once("mother_entity.php");
|
||||
/**
|
||||
* Classe d'un objet Projet
|
||||
* @author Yass
|
||||
*/
|
||||
|
||||
class Project extends Entity{
|
||||
|
||||
private int $_id;
|
||||
private string $_title;
|
||||
private string $_description;
|
||||
private string $_thumbnail;
|
||||
private string $_content;
|
||||
private string $_creation_date;
|
||||
private string $_status;
|
||||
private int $_user;
|
||||
private int $_category;
|
||||
private string $_creatorname;
|
||||
private string $_user_image;
|
||||
|
||||
|
||||
/**
|
||||
* Constructeur (logique mdrr)
|
||||
*/
|
||||
public function __construct(){
|
||||
$this->_prefix = 'project_';
|
||||
}
|
||||
|
||||
// Méthode Getter et Setter
|
||||
|
||||
/**
|
||||
* Récuperation de l'id du Projet
|
||||
* @return int l'id du projet
|
||||
*/
|
||||
public function getId():int{
|
||||
return $this->_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de l'id du projet
|
||||
* @param int le nouvelle id
|
||||
*/
|
||||
public function setId($id){
|
||||
$this->_id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récuperation du titre
|
||||
* @return string tite du projet
|
||||
*/
|
||||
public function getTitle(){
|
||||
return $this->_title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour du titre
|
||||
* @param string le nouveau titre
|
||||
*/
|
||||
public function setTitle($title){
|
||||
$this->_title = $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récuperation de la description
|
||||
* @return string description du projet
|
||||
*/
|
||||
public function getDescription(){
|
||||
return $this->_description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de la description
|
||||
* @param string la nouvelle description
|
||||
*/
|
||||
public function setDescription($description){
|
||||
$this->_description = $description;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Récuperation de l'image
|
||||
* @return string chemin vers l'image
|
||||
*/
|
||||
public function getThumbnail(){
|
||||
return $this->_thumbnail;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de l'image
|
||||
* @param string chemin vers nouvelle image
|
||||
*/
|
||||
public function setThumbnail($thumbnail){
|
||||
$this->_thumbnail = $thumbnail;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récuperation du contenue
|
||||
* @return string contenue du projet
|
||||
*/
|
||||
public function getContent(){
|
||||
return $this->_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour du contenue
|
||||
* @param string le nouveau contenue
|
||||
*/
|
||||
public function setContent($content){
|
||||
$this->_content = $content;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Récupération de la date de création
|
||||
* @param string lang de formatage de la date (par défaut = "fr_FR")
|
||||
* @return string date de création formatter
|
||||
*/
|
||||
public function getCreation_date(string $strFormat = "fr_FR"){
|
||||
$objDate = new DateTime($this->_creation_date);
|
||||
|
||||
$objDateFormatter = new IntlDateFormatter(
|
||||
$strFormat,
|
||||
IntlDateFormatter::LONG,
|
||||
IntlDateFormatter::NONE,
|
||||
|
||||
);
|
||||
$strFormat = $objDateFormatter->format($objDate);
|
||||
return $strFormat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de la date de création
|
||||
* @param string la nouvelle date de création
|
||||
*/
|
||||
public function setCreation_date($creation_date){
|
||||
$this->_creation_date = $creation_date;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupération du statut
|
||||
* @return string statut
|
||||
*/
|
||||
public function getStatus(){
|
||||
return $this->_status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour du statut
|
||||
* @param string le nouveau statut
|
||||
*/
|
||||
public function setStatus($status){
|
||||
$this->_status = $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupération de l'utilisateur
|
||||
* @return int id de l'utilisateur
|
||||
*/
|
||||
public function getUser(){
|
||||
return $this->_user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de l'utilisateur
|
||||
* @param int id de l'utilisateur
|
||||
*/
|
||||
public function setUser($user){
|
||||
$this->_user = $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupération de la catégorie
|
||||
* @return int id de la catégorie
|
||||
*/
|
||||
public function getCategory(){
|
||||
return $this->_category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour de la catégorie
|
||||
* @param int id de la catégorie
|
||||
*/
|
||||
public function setCategory($category){
|
||||
$this->_category = $category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupération du nom du créateur
|
||||
* @return string nom du créateur
|
||||
*/
|
||||
public function getCreatorName(){
|
||||
return $this->_creatorname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour du nom du créateur
|
||||
* @param string le nom du créateur
|
||||
*/
|
||||
public function setCreatorName($creatorname){
|
||||
$this->_creatorname = $creatorname;
|
||||
}
|
||||
/**
|
||||
* Récupération du chemin photo profil
|
||||
* @return string nom du chemin photo profil
|
||||
*/
|
||||
public function getUser_image(){
|
||||
return $this->_user_image;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mise à jour du chemin photo profil
|
||||
* @param string chemin photo profil
|
||||
*/
|
||||
public function setUser_image($user_image){
|
||||
$this->_user_image = $user_image;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
51
app/entities/user_entity.php
Normal file
51
app/entities/user_entity.php
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
require_once("mother_entity.php");
|
||||
|
||||
class User extends Entity{
|
||||
// Attributs
|
||||
private string $_name = '';
|
||||
private string $_firstname = '';
|
||||
private string $_mail = '';
|
||||
private string $_pwd;
|
||||
|
||||
/**
|
||||
* Constructeur
|
||||
*/
|
||||
public function __construct(){
|
||||
// Préfixe de la table pour hydratation
|
||||
$this->_prefixe = 'user_';
|
||||
}
|
||||
|
||||
// Méthodes - getters et setters
|
||||
public function getName():string{
|
||||
return $this->_name;
|
||||
}
|
||||
public function setName(string $strNewName){
|
||||
$this->_name = $this->nettoyer($strNewName);
|
||||
}
|
||||
public function getFirstname():string{
|
||||
return $this->_firstname;
|
||||
}
|
||||
public function setFirstname(string $strFirstname){
|
||||
$this->_firstname = $this->nettoyer($strFirstname);
|
||||
}
|
||||
public function getMail():string{
|
||||
return $this->_mail;
|
||||
}
|
||||
public function setMail(string $strMail){
|
||||
$this->_mail = strtolower($this->nettoyer($strMail));
|
||||
}
|
||||
public function getPwd():string{
|
||||
return $this->_pwd;
|
||||
}
|
||||
public function getPwdHash():string{
|
||||
return password_hash($this->_pwd, PASSWORD_DEFAULT);
|
||||
}
|
||||
public function setPwd(string $strPwd){
|
||||
$this->_pwd = $strPwd;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
25
app/models/category_model.php
Normal file
25
app/models/category_model.php
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
require_once('../config/database.php');
|
||||
|
||||
/**
|
||||
* Traitement des requêtes pour les catégories
|
||||
* @author : Laura
|
||||
*/
|
||||
|
||||
class CategoryModel extends Connect{
|
||||
|
||||
public function findAllCategory(int $intLimit=0):array{
|
||||
|
||||
// Ecrire la requête
|
||||
$strRq = "SELECT category.*
|
||||
FROM category";
|
||||
|
||||
|
||||
if ($intLimit > 0){
|
||||
$strRq .= " LIMIT ".$intLimit;
|
||||
}
|
||||
|
||||
// Lancer la requête et récupérer les résultats
|
||||
return $this->_db->query($strRq)->fetchAll();
|
||||
}
|
||||
}
|
||||
25
app/models/image_model.php
Normal file
25
app/models/image_model.php
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
require_once('../config/database.php');
|
||||
|
||||
/**
|
||||
* Traitement de la requête pour les images
|
||||
* @author Laura
|
||||
*/
|
||||
|
||||
class ImageModel extends Connect{
|
||||
|
||||
public function findAllImage(int $intLimit=0):array{
|
||||
|
||||
// Ecrire la requête
|
||||
$strRq = "SELECT image.*
|
||||
FROM image";
|
||||
|
||||
|
||||
if ($intLimit > 0){
|
||||
$strRq .= " LIMIT ".$intLimit;
|
||||
}
|
||||
|
||||
// Lancer la requête et récupérer les résultats
|
||||
return $this->_db->query($strRq)->fetchAll();
|
||||
}
|
||||
}
|
||||
76
app/models/project_model.php
Normal file
76
app/models/project_model.php
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
<?php
|
||||
require_once('../config/database.php');
|
||||
|
||||
/**
|
||||
* Traitement des requêtes pour les projets
|
||||
* @author : Laura
|
||||
*/
|
||||
|
||||
class ProjectModel extends Connect{
|
||||
|
||||
public function findAll(int $intLimit=0, string $strKeywords='', int $intAuthor=0,
|
||||
int $intPeriod=0, string $strDate='', string $strStartDate='',
|
||||
string $strEndDate='', int $intCategory=0):array{
|
||||
|
||||
// Ecrire la requête
|
||||
$strRq = "SELECT project.*,
|
||||
CONCAT(user_firstname, ' ', user_name) AS 'project_creatorname',
|
||||
user_image
|
||||
FROM project
|
||||
INNER JOIN users ON user_id = project_user";
|
||||
|
||||
$strWhere = " WHERE ";
|
||||
// Recherche par mot clé
|
||||
if ($strKeywords != '') {
|
||||
$strRq .= " WHERE (project_title LIKE '%".$strKeywords."%'
|
||||
OR project_content LIKE '%".$strKeywords."%') ";
|
||||
|
||||
//$boolWhere = true;
|
||||
$strWhere = " AND ";
|
||||
}
|
||||
|
||||
// Recherche par auteur
|
||||
if ($intAuthor > 0){
|
||||
$strRq .= $strWhere." user_id = ".$intAuthor;
|
||||
$strWhere = " AND ";
|
||||
}
|
||||
|
||||
// Recherche par catégorie
|
||||
if ($intCategory > 0){
|
||||
$strRq .= $strWhere." project_category = ".$intCategory;
|
||||
$strWhere = " AND ";
|
||||
}
|
||||
|
||||
// Recherche par dates
|
||||
if ($intPeriod == 0){
|
||||
// Par date exacte
|
||||
if ($strDate != ''){
|
||||
$strRq .= $strWhere." project_creation_date = '".$strDate."'";
|
||||
}
|
||||
}else{
|
||||
// Par période de dates
|
||||
if ($strStartDate != '' && $strEndDate != ''){
|
||||
$strRq .= $strWhere." project_creation_date BETWEEN '".$strStartDate."' AND '".$strEndDate."'";
|
||||
}else{
|
||||
if ($strStartDate != ''){
|
||||
// A partir de
|
||||
$strRq .= $strWhere." project_creation_date >= '".$strStartDate."'";
|
||||
}else if ($strEndDate != ''){
|
||||
// Avant le
|
||||
$strRq .= $strWhere." project_creation_date <= '".$strEndDate."'";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$strRq .= " ORDER BY project_creation_date DESC";
|
||||
|
||||
|
||||
if ($intLimit > 0){
|
||||
$strRq .= " LIMIT ".$intLimit;
|
||||
}
|
||||
|
||||
// Lancer la requête et récupérer les résultats
|
||||
var_dump($strRq);
|
||||
return $this->_db->query($strRq)->fetchAll();
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,11 @@
|
|||
|
||||
<!-- Centrage horizontal du formulaire -->
|
||||
<div class="row justify-content-center">
|
||||
<!-- Contenu principal de la page -->
|
||||
<main class="container py-5">
|
||||
|
||||
<!-- Centrage horizontal du formulaire -->
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 col-md-8 col-lg-5">
|
||||
|
||||
<!-- Carte contenant le formulaire de connexion -->
|
||||
|
|
|
|||
17
app/views/home.php
Normal file
17
app/views/home.php
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<section class="container mt-5 p-5 d-flex flex-column align-items-center text-center">
|
||||
<h1 class="logo">Folliow</h1>
|
||||
<h2>Là où les talents rencontrent leur avenir</h2>
|
||||
<p class="col-6">Une plateforme de portfolio adapté à vos besoins et aux besoins des entreprises.
|
||||
Créer un portfolio réellement pertinent aux exigences du marché et rentrez
|
||||
directement en contact avec les entreprises.</p>
|
||||
</section>
|
||||
|
||||
<section aria-label="Articles récents">
|
||||
<h2 class="visually-hidden">Les 4 derniers articles</h2>
|
||||
<div class="row mb-2">
|
||||
<?php
|
||||
foreach($arrProjectToDiplay as $objProject){
|
||||
include("../app/views/partials/preview.php");
|
||||
}
|
||||
?>
|
||||
</section>
|
||||
|
|
@ -3,6 +3,11 @@
|
|||
|
||||
<!-- Centrage du formulaire -->
|
||||
<div class="row justify-content-center">
|
||||
<!-- Contenu principal de la page -->
|
||||
<main class="container py-5">
|
||||
|
||||
<!-- Centrage horizontal du formulaire -->
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 col-md-10 col-lg-6">
|
||||
|
||||
<!-- Carte Bootstrap contenant le formulaire -->
|
||||
|
|
@ -192,6 +197,119 @@
|
|||
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Champ : adresse e-mail -->
|
||||
<div class="col-12">
|
||||
<label class="form-label" for="user_mail">
|
||||
Adresse e-mail *
|
||||
</label>
|
||||
<input
|
||||
class="form-control"
|
||||
type="email"
|
||||
id="user_mail"
|
||||
name="user_mail"
|
||||
required
|
||||
>
|
||||
</div>
|
||||
|
||||
<!-- Champ : mot de passe -->
|
||||
<div class="col-12">
|
||||
<label class="form-label" for="user_password">
|
||||
Mot de passe *
|
||||
</label>
|
||||
<input
|
||||
class="form-control"
|
||||
type="password"
|
||||
id="user_password"
|
||||
name="user_password"
|
||||
required
|
||||
>
|
||||
</div>
|
||||
|
||||
<!-- Confirmation du mot de passe -->
|
||||
<div class="col-12">
|
||||
<label class="form-label" for="pwd_confirm">
|
||||
Confirmation du mot de passe *
|
||||
</label>
|
||||
<input
|
||||
class="form-control <?php if (isset($arrError['pwd_confirm'])) echo 'is-invalid'; ?>"
|
||||
type="password"
|
||||
id="pwd_confirm"
|
||||
name="pwd_confirm"
|
||||
required
|
||||
>
|
||||
</div>
|
||||
|
||||
<!-- Champ optionnel : numéro de téléphone -->
|
||||
<div class="col-12">
|
||||
<label class="form-label" for="user_phone">
|
||||
Téléphone
|
||||
</label>
|
||||
<input
|
||||
class="form-control"
|
||||
type="text"
|
||||
id="user_phone"
|
||||
name="user_phone"
|
||||
>
|
||||
</div>
|
||||
|
||||
<!-- Champ optionnel : profession de l'utilisateur -->
|
||||
<div class="col-12">
|
||||
<label class="form-label" for="user_work">
|
||||
Profession
|
||||
</label>
|
||||
<input
|
||||
class="form-control"
|
||||
type="text"
|
||||
id="user_work"
|
||||
name="user_work"
|
||||
>
|
||||
</div>
|
||||
|
||||
<!-- Champ optionnel : localisation de l'utilisateur -->
|
||||
<div class="col-12">
|
||||
<label class="form-label" for="user_location">
|
||||
Localisation
|
||||
</label>
|
||||
<input
|
||||
class="form-control"
|
||||
type="text"
|
||||
id="user_location"
|
||||
name="user_location"
|
||||
>
|
||||
</div>
|
||||
|
||||
<!-- Champ optionnel : phrase d'accroche / description courte -->
|
||||
<div class="col-12">
|
||||
<label class="form-label" for="user_description">
|
||||
Phrase d'accroche
|
||||
</label>
|
||||
<textarea
|
||||
class="form-control"
|
||||
id="user_description"
|
||||
name="user_description"
|
||||
rows="3"
|
||||
></textarea>
|
||||
</div>
|
||||
|
||||
<!-- Bouton de soumission du formulaire -->
|
||||
<div class="col-12 d-grid mt-2">
|
||||
<button type="submit" class="btn btn-primary btn-lg rounded-3">
|
||||
Créer mon compte
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Lien vers la page de connexion -->
|
||||
<div class="col-12 text-center">
|
||||
<small class="text-secondary">
|
||||
Déjà un compte ?
|
||||
<a href="connexion.php">Se connecter</a>
|
||||
</small>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
|
|
|
|||
23
app/views/login.php
Normal file
23
app/views/login.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<section aria-label="Se connecter">
|
||||
<?php if (count($arrError) > 0) {?>
|
||||
<div class="alert alert-danger">
|
||||
<?php foreach ($arrError as $strError){ ?>
|
||||
<p><?php echo $strError; ?></p>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<form method="post">
|
||||
<p>
|
||||
<label>Mail:</label>
|
||||
<input name="mail" value="<?php echo($strMail); ?>"
|
||||
class="form-control <?php if (isset($arrError['mail'])) { echo 'is-invalid'; } ?> " type="text" >
|
||||
</p>
|
||||
<p>
|
||||
<label>Mot de passe:</label>
|
||||
<input name="pwd" class="form-control <?php if (isset($arrError['pwd'])) { echo 'is-invalid'; } ?> " type="text" >
|
||||
</p>
|
||||
<p>
|
||||
<input class="form-control btn btn-primary" type="submit" >
|
||||
</p>
|
||||
</form>
|
||||
</section>
|
||||
32
app/views/partials/footer.php
Normal file
32
app/views/partials/footer.php
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
|
||||
<footer class="footer container-fluid d-flex justify-content-around">
|
||||
<div class="col-3">
|
||||
<ul>
|
||||
<li><a href="#">Découvrir</a>
|
||||
<li><a href="#">Customisation</a>
|
||||
<li><a href="#">Emploi</a>
|
||||
<li><a href="#">A propos</a>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<ul>
|
||||
<li><a href="#">Recruter</a>
|
||||
<li><a href="#">Partenariat</a>
|
||||
<li><a href="#">Blog</a>
|
||||
<li><a href="#">Aide et support</a>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<ul>
|
||||
<li><a href="#">Politique de confidentialité</a>
|
||||
<li><a href="#">Politique sur les données</a>
|
||||
<li><a href="#">CGU</a>
|
||||
<li><a href="#">CGV</a>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<p>Suivez-nous</p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
88
app/views/partials/header.php
Normal file
88
app/views/partials/header.php
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
<?php
|
||||
session_start();
|
||||
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="assests/css/style.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
|
||||
<title>Folliow</title>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-light">
|
||||
<div class="container-fluid">
|
||||
<!-- Logo -->
|
||||
<a class="navbar-brand d-flex align-items-center" href="#">
|
||||
<img src="assests/img/logo.png" alt="Logo" class="logo-image">
|
||||
</a>
|
||||
|
||||
<!-- Toggler pour mobile -->
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<!-- Menu de navigation -->
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav me-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="?ctrl=&action=">Découvrir</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="?ctrl=''&action=''">Customisation</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="?ctrl=''&action=''">Orientation</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="?ctrl=''&action=''">À propos</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="?ctrl=project&action=search">Rechercher</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Menu secondaire -->
|
||||
<nav class="col-4 d-flex justify-content-end align-items-center" aria-label="Connexion utilisateur">
|
||||
<?php if (!isset($_SESSION['user'])){ ?>
|
||||
<!--- Utilisateur non connecté -->
|
||||
<ul class="navbar-nav ">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="index.php?ctrl=user&action=signin" title="Créer un compte" aria-label="Créer un compte">
|
||||
S'inscrire
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item ">
|
||||
<a class="nav-link" href="index.php?ctrl=user&action=login" title="Se connecter" aria-label="Se connecter">
|
||||
Se connecter
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<?php }else{ ?>
|
||||
<!--- Utilisateur connecté -->
|
||||
<ul class="navbar-nav ">
|
||||
<li class="nav-item ">
|
||||
<a class="nav-link" href="edit_account.php" title="Modifier mon compte" aria-label="Modifier mon compte">
|
||||
<img src=".<?php echo $_SESSION["user"]["user_image"]; ?>"
|
||||
class="rounded-circle flex-shrink-0 mt-2 ml-5"
|
||||
style="width: 36px; height: 36px; object-fit: cover;"
|
||||
alt="Photo de profil">
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item ">
|
||||
<a class="nav-link" href="index.php?ctrl=user&action=logout" title="Se déconnecter" aria-label="Se déconnecter">
|
||||
Logout
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<?php } ?>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
38
app/views/partials/preview.php
Normal file
38
app/views/partials/preview.php
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<article class="col-md-3 mb-4">
|
||||
<div class="card h-100 shadow-sm article-card">
|
||||
|
||||
<!-- IMAGE (80%) -->
|
||||
<div class="ratio ratio-16x9">
|
||||
<img src=".<?php echo $objProject->getThumbnail(); ?>"
|
||||
class="w-100 h-100 object-fit-cover"
|
||||
alt=""
|
||||
loading="lazy">
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-start gap-3">
|
||||
|
||||
<!-- PHOTO DE PROFIL -->
|
||||
<img src=".<?php echo $objProject->getUser_image(); ?>"
|
||||
class="rounded-circle flex-shrink-0 mt-2 ml-5"
|
||||
style="width: 48px; height: 48px; object-fit: cover;"
|
||||
alt="Photo de profil">
|
||||
|
||||
<!-- INFOS -->
|
||||
<div class="flex-grow-1 card-body p-3">
|
||||
<h3 class="h6 mb-1"><?php echo $objProject->getTitle(); ?></h3>
|
||||
|
||||
<small class="text-body-secondary d-block mb-1">
|
||||
<time><?php echo $objProject->getCreation_date(); ?></time>
|
||||
– <?php echo $objProject->getCreatorname(); ?>
|
||||
</small>
|
||||
|
||||
<a href="?id=<?php echo $objProject->getId()?>"
|
||||
class="stretched-link small">
|
||||
Lire la suite →
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</article>
|
||||
31
app/views/project.php
Normal file
31
app/views/project.php
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
<body>
|
||||
<section class="container mt-5 p-5 d-flex flex-column align-items-center justify-content-center">
|
||||
<h2>Alimenter votre projet</h2>
|
||||
<div class="justify-content-center align-items-center">
|
||||
<button type="button" class="btn btn-primary rounded-circle d-flex justify-content-center align-items-center"><span class="fs-4 fw-bold text-white mb-2 ms-2 me-2">+</span></button>
|
||||
</div class="col-12">
|
||||
<div>
|
||||
<h3 class="fw-semibold fs-3 my-5">Description</h3>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<h3 class="fw-semibold fs-3 my-5">Photos behind the scene</h3>
|
||||
<div class="row my-2">
|
||||
<img class="bd-placeholder-img" width="200" height="250" src="<?= isset($objImage) ? '../../public/assets/img/'.$objImage->getName() : '' ?>" alt="<?php echo $objImage->getAlt(); ?>" loading="lazy">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<h3>Other projects</h3>
|
||||
<div class="row my-2">
|
||||
<?php
|
||||
foreach($arrProjectToDiplay as $objProject){
|
||||
include("../app/views/partials/preview.php");
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<section>
|
||||
</body>
|
||||
194
app/views/search.php
Normal file
194
app/views/search.php
Normal file
|
|
@ -0,0 +1,194 @@
|
|||
<section aria-label="Blog">
|
||||
<h2 class="visually-hidden">Rechercher parmi les articles</h2>
|
||||
<div class="row mb-2">
|
||||
<section class="mb-5" aria-labelledby="search-heading">
|
||||
<form name="formSearch" method="post" action="?ctrl=project&action=search" class="border rounded p-4 bg-light">
|
||||
<h3 id="search-heading" class="h4 mb-4">
|
||||
<i class="fas fa-search me-2" aria-hidden="true"></i>
|
||||
Rechercher des articles
|
||||
</h3>
|
||||
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<label for="keywords" class="form-label">Mots-clés</label>
|
||||
<input
|
||||
value=""
|
||||
type="text"
|
||||
class="form-control"
|
||||
id="keywords"
|
||||
name="keywords"
|
||||
placeholder="Ex: JavaScript, CSS..."
|
||||
aria-describedby="keywords-help">
|
||||
<small id="keywords-help" class="form-text text-muted">
|
||||
Recherchez dans les titres et contenus
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label for="author" class="form-label">Auteur</label>
|
||||
<select class="form-select" id="author" name="author">
|
||||
<option value="0" <?php echo ($intAuthor == 0)?'selected':''; ?>>Tous les auteurs</option>
|
||||
<?php
|
||||
foreach($arrUser as $arrDetUser){
|
||||
?>
|
||||
<option value="<?php echo $arrDetUser['user_id']; ?>"
|
||||
<?php echo ($intAuthor == $arrDetUser['user_id'])?'selected':''; ?>
|
||||
>
|
||||
<?php echo $arrDetUser['user_firstname'].' '.$arrDetUser['user_name']; ?>
|
||||
</option>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-6">
|
||||
<fieldset>
|
||||
<legend class="form-label">Type de recherche par date</legend>
|
||||
<div class="form-check form-check-inline">
|
||||
<input
|
||||
class="form-check-input"
|
||||
type="radio"
|
||||
name="period"
|
||||
id="period-exact"
|
||||
value="0"
|
||||
<?php echo ($intPeriod == 0)?'checked':'' ; ?>
|
||||
aria-controls="date-exact date-range">
|
||||
<label class="form-check-label" for="period-exact">
|
||||
Date exacte
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input
|
||||
class="form-check-input"
|
||||
type="radio"
|
||||
name="period"
|
||||
id="period-range"
|
||||
value="1"
|
||||
<?php echo ($intPeriod == 1)?'checked':'' ; ?>
|
||||
aria-controls="date-exact date-range">
|
||||
<label class="form-check-label" for="period-range">
|
||||
Période
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<!-- AJOUT RECHERCHE PAR CATEGORIE -->
|
||||
<div class="col-6">
|
||||
<fieldset>
|
||||
<legend class="form-label">Type de recherche par catégories</legend>
|
||||
<div class="col-md-6">
|
||||
<label for="author" class="form-label">Catégorie</label>
|
||||
<select class="form-select" id="category" name="category">
|
||||
<option value="0" <?php echo ($intCategory == 0)?'selected':''; ?>>Toutes les catégories</option>
|
||||
<?php
|
||||
foreach($arrCategory as $arrDetCategory){
|
||||
?>
|
||||
<option value="<?php echo $arrDetCategory['category_id']; ?>"
|
||||
<?php echo ($intCategory == $arrDetCategory['category_id'])?'selected':''; ?> >
|
||||
<?php echo $arrDetCategory['category_name']; ?>
|
||||
</option>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6" id="date-exact">
|
||||
<label for="date" class="form-label">Date</label>
|
||||
<input
|
||||
type="date"
|
||||
class="form-control"
|
||||
id="date"
|
||||
name="date"
|
||||
aria-describedby="date-help"
|
||||
value="<?php echo $strDate; ?>" >
|
||||
<small id="date-help" class="form-text text-muted">
|
||||
Format: JJ/MM/AAAA
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div id="date-range" style="display: none;">
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<label for="startdate" class="form-label">Date de début</label>
|
||||
<input
|
||||
type="date"
|
||||
class="form-control"
|
||||
id="startdate"
|
||||
name="startdate"
|
||||
value="<?php echo $strStartDate; ?>" >
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label for="enddate" class="form-label">Date de fin</label>
|
||||
<input
|
||||
type="date"
|
||||
class="form-control"
|
||||
id="enddate"
|
||||
name="enddate"
|
||||
value="<?php echo $strEndDate; ?>" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-search me-2" aria-hidden="true"></i>
|
||||
Rechercher
|
||||
</button>
|
||||
<button type="reset" class="btn btn-secondary ms-2">
|
||||
<i class="fas fa-redo me-2" aria-hidden="true"></i>
|
||||
Réinitialiser
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<!-- Liste des articles -->
|
||||
<section aria-labelledby="articles-heading">
|
||||
<h3 id="articles-heading" class="visually-hidden">Liste des projets</h3>
|
||||
<div class="row mb-2">
|
||||
<?php
|
||||
if (count($arrProject) == 0){
|
||||
?>
|
||||
<div class="alert alert-warning">
|
||||
<p>Pas de résultats</p>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
foreach($arrProjectToDisplay as $objProject){
|
||||
include("../app/views/partials/preview.php");
|
||||
} ?>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
<script>
|
||||
// Gestion de l'affichage des champs de date
|
||||
const periodRadios = document.querySelectorAll('input[name="period"]');
|
||||
const dateExact = document.getElementById('date-exact');
|
||||
const dateRange = document.getElementById('date-range');
|
||||
|
||||
function toggleDateFields() {
|
||||
const selectedPeriod = document.querySelector('input[name="period"]:checked').value;
|
||||
|
||||
if (selectedPeriod === '0') {
|
||||
dateExact.style.display = 'block';
|
||||
dateRange.style.display = 'none';
|
||||
} else {
|
||||
dateExact.style.display = 'none';
|
||||
dateRange.style.display = 'block';
|
||||
}
|
||||
}
|
||||
|
||||
periodRadios.forEach(radio => {
|
||||
radio.addEventListener('change', toggleDateFields);
|
||||
});
|
||||
|
||||
// Initialisation au chargement
|
||||
toggleDateFields();
|
||||
</script>
|
||||
Loading…
Add table
Add a link
Reference in a new issue