last changes

evenements
Clément Verdoire 1 year ago
commit 28c2d704c8

BIN
.DS_Store vendored

Binary file not shown.

479
.gitignore vendored

@ -0,0 +1,479 @@
##### Windows
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
##### Linux
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
##### MacOS
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
##### Backup
*.bak
*.gho
*.ori
*.orig
*.tmp
##### GPG
secring.*
##### Dropbox
# Dropbox settings and caches
.dropbox
.dropbox.attr
.dropbox.cache
##### SynopsysVCS
# Waveform formats
*.vcd
*.vpd
*.evcd
*.fsdb
# Default name of the simulation executable. A different name can be
# specified with this switch (the associated daidir database name is
# also taken from here): -o <path>/<filename>
simv
# Generated for Verilog and VHDL top configs
simv.daidir/
simv.db.dir/
# Infrastructure necessary to co-simulate SystemC models with
# Verilog/VHDL models. An alternate directory may be specified with this
# switch: -Mdir=<directory_path>
csrc/
# Log file - the following switch allows to specify the file that will be
# used to write all messages from simulation: -l <filename>
*.log
# Coverage results (generated with urg) and database location. The
# following switch can also be used: urg -dir <coverage_directory>.vdb
simv.vdb/
urgReport/
# DVE and UCLI related files.
DVEfiles/
ucli.key
# When the design is elaborated for DirectC, the following file is created
# with declarations for C/C++ functions.
vc_hdrs.h
##### SVN
.svn/
##### Mercurial
.hg/
.hgignore
.hgsigs
.hgsub
.hgsubstate
.hgtags
##### Bazaar
.bzr/
.bzrignore
##### CVS
/CVS/*
**/CVS/*
.cvsignore
*/.cvsignore
##### TortoiseGit
# Project-level settings
/.tgitconfig
##### PuTTY
# Private key
*.ppk
##### Vim
# Swap
[._]*.s[a-v][a-z]
!*.svg # comment out if you don't need vector files
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Session
Session.vim
Sessionx.vim
# Temporary
.netrwhist
*~
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~
##### Emacs
# -*- mode: gitignore; -*-
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*
# Org-mode
.org-id-locations
*_archive
# flymake-mode
*_flymake.*
# eshell files
/eshell/history
/eshell/lastdir
# elpa packages
/elpa/
# reftex files
*.rel
# AUCTeX auto folder
/auto/
# cask packages
.cask/
dist/
# Flycheck
flycheck_*.el
# server auth directory
/server/
# projectiles files
.projectile
# directory configuration
.dir-locals.el
# network security
/network-security.data
##### SublimeText
# Cache files for Sublime Text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
# Workspace files are user-specific
*.sublime-workspace
# Project files should be checked into the repository, unless a significant
# proportion of contributors will probably not be using Sublime Text
# *.sublime-project
# SFTP configuration file
sftp-config.json
sftp-config-alt*.json
# Package control specific files
Package Control.last-run
Package Control.ca-list
Package Control.ca-bundle
Package Control.system-ca-bundle
Package Control.cache/
Package Control.ca-certs/
Package Control.merged-ca-bundle
Package Control.user-ca-bundle
oscrypto-ca-bundle.crt
bh_unicode_properties.cache
# Sublime-github package stores a github token in this file
# https://packagecontrol.io/packages/sublime-github
GitHub.sublime-settings
##### Notepad++
# Notepad++ backups #
*.bak
##### TextMate
*.tmproj
*.tmproject
tmtags
##### VisualStudioCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
##### NetBeans
**/nbproject/private/
**/nbproject/Makefile-*.mk
**/nbproject/Package-*.bash
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
##### JetBrains
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
##### Eclipse
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# PyDev specific (Python IDE for Eclipse)
*.pydevproject
# CDT-specific (C/C++ Development Tooling)
.cproject
# CDT- autotools
.autotools
# Java annotation processor (APT)
.factorypath
# PDT-specific (PHP Development Tools)
.buildpath
# sbteclipse plugin
.target
# Tern plugin
.tern-project
# TeXlipse plugin
.texlipse
# STS (Spring Tool Suite)
.springBeans
# Code Recommenders
.recommenders/
# Annotation Processing
.apt_generated/
.apt_generated_test/
# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet
# Uncomment this line if you wish to ignore the project description file.
# Typically, this file would be tracked if it contains build/dependency configurations:
#.project
##### Dreamweaver
# DW Dreamweaver added files
_notes
_compareTemp
configs/
dwsync.xml
dw_php_codehinting.config
*.mno
##### CodeKit
# General CodeKit files to ignore
config.codekit
config.codekit3
/min
##### Gradle
.gradle
**/build/
!src/**/build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Cache of project
.gradletasknamecache
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
# gradle/wrapper/gradle-wrapper.properties
##### Composer
composer.phar
/vendor/
# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
composer.lock
##### PHP CodeSniffer
# gitignore for the PHP Codesniffer framework
# website: https://github.com/squizlabs/PHP_CodeSniffer
#
# Recommended template: PHP.gitignore
/wpcs/*
##### SASS
.sass-cache/
*.css.map
*.sass.map
*.scss.map
php/.idea/
##### Images :
php/public/uploads/

BIN
php/.DS_Store vendored

Binary file not shown.

@ -1,7 +1,8 @@
{
"require": {
"twig/twig": "^3.0",
"ext-pdo": "*"
"ext-pdo": "*",
"ext-fileinfo": "*"
},
"autoload": {
"psr-4": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

@ -0,0 +1,102 @@
.three-body {
--uib-size: 500px;
--uib-speed: 0.8s;
--uib-color: #00DBFF;
position: relative;
display: inline-block;
height: var(--uib-size);
width: var(--uib-size);
animation: spin78236 calc(var(--uib-speed) * 2.5) infinite linear;
}
.three-body__dot {
position: absolute;
height: 100%;
width: 30%;
}
.three-body__dot:after {
content: '';
position: absolute;
height: 0;
width: 100%;
padding-bottom: 100%;
background-color: var(--uib-color);
border-radius: 50%;
}
.three-body__dot:nth-child(1) {
bottom: 5%;
left: 0;
transform: rotate(60deg);
transform-origin: 50% 85%;
}
.three-body__dot:nth-child(1)::after {
bottom: 0;
left: 0;
animation: wobble1 var(--uib-speed) infinite ease-in-out;
animation-delay: calc(var(--uib-speed) * -0.3);
}
.three-body__dot:nth-child(2) {
bottom: 5%;
right: 0;
transform: rotate(-60deg);
transform-origin: 50% 85%;
}
.three-body__dot:nth-child(2)::after {
bottom: 0;
left: 0;
animation: wobble1 var(--uib-speed) infinite
calc(var(--uib-speed) * -0.15) ease-in-out;
}
.three-body__dot:nth-child(3) {
bottom: -5%;
left: 0;
transform: translateX(116.666%);
}
.three-body__dot:nth-child(3)::after {
top: 0;
left: 0;
animation: wobble2 var(--uib-speed) infinite ease-in-out;
}
@keyframes spin78236 {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes wobble1 {
0%,
100% {
transform: translateY(0%) scale(1);
opacity: 1;
}
50% {
transform: translateY(-66%) scale(0.65);
opacity: 0.8;
}
}
@keyframes wobble2 {
0%,
100% {
transform: translateY(0%) scale(1);
opacity: 1;
}
50% {
transform: translateY(66%) scale(0.65);
opacity: 0.8;
}
}

@ -0,0 +1,53 @@
img
{
border-radius: 10px;
}
body{
margin: 0;
padding:0;
}
#titleDiv
{
background-image:url('../assets/deb.webp');
width: 100%;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
background-position: center;
color :white;
}
#title p
{
background-color: grey;
border-radius: 5px;
}
#title
{
font-size: 20px;
padding: 20px;
height: 70%;
align-items: center;
color: white;
background-color: #00DBFF;
}
#key {
display: flex;
justify-content: center;
color: black;
}
#key p
{
background-color: grey;
border-radius: 3px;
padding:10%;
}

@ -0,0 +1,51 @@
.offre-container {
margin-bottom: 5%;
}
.offre-img {
max-width: 100%;
}
#titrePrincipal {
padding-bottom: 10px;
border-bottom: 1px solid black;
margin-bottom: 30px;
}
.custom-button {
background-color: #00DBFF;
border-color: #00DBFF;
color: #fff;
}
.row1
{
display: flex;
align-items: center;
}
.row1 h4
{
margin-left: 20px;
}
.row1 img
{
width: 20%;
}
.authorDate
{
color: #00DBFF;
margin: 1%;
}
.row3 {
width: 30%;
display: flex;
justify-content: flex-start;
align-items: center;
}
.row3 img {
align-self: flex-start;
}

@ -4,7 +4,7 @@
/** Chargement config */
require_once __DIR__ . '/../src/config/config.php';
require __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/../src/TwigExtensions.php';
require_once __DIR__ . '/../src/TwigExtensions.php'; // utile pour les images à supprimer sinon
/** Configuration twig */
$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/../templates');
@ -12,6 +12,5 @@ $twig = new \Twig\Environment($loader, [
'cache' => false,
'debug' => true
]);
$twig->addExtension(new \Twig\Extension\DebugExtension());
$cont = new \App\controleur\FrontControleur();

@ -1,6 +1,9 @@
<?php
namespace App\config;
use App\modele\ImageModele;
use App\modele\OffreModele;
class Validation
{
public static function val_action($action)
@ -56,7 +59,7 @@ class Validation
* @param string $str
* @return bool
*/
public function verifierEmail(string $str):bool{
public static function verifierEmail(string $str):bool{
return filter_var($str, FILTER_VALIDATE_EMAIL);
}
@ -91,4 +94,53 @@ class Validation
}
return false;
}
public static function validateNumber($number) : bool
{
if(preg_match("/^[0-9]{10}$/", $number))
{
return true;
}
return false;
}
public static function checkUrl($url) : bool
{
if(preg_match("/^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}$/", $url))
{
return true;
}
return false;
}
public static function validateTypeContract($typeContrat) : bool
{
$contrats = ["CDI","CDD","Stage","Alternance"];
return in_array($typeContrat,$contrats);
}
public static function validateExperience($exp): bool
{
$experiences = ["Junior","Senior","Indifférent"];
return in_array($exp,$experiences);
}
public static function validateTypeStudies($level) : bool
{
$studies = ["Bac+2","Bac+3","Bac+5","Indifférent"];
return in_array($level,$studies);
}
public static function ValidateEntry($entry, $nbChars): bool
{
if(!empty($entry))
{
return strlen($entry)>= $nbChars;
}
return false;
}
}

@ -6,7 +6,13 @@ $rep = __DIR__ . '/php/';
// liste des modules à inclure
$dConfig['includes']= array('controleur/Validation.php');
static $OffersByPage = 5;
// Variables connexion à la base : à modifier en fonction de la base de chacun
define('DB_HOST', 'mysql:host=localhost;dbname=dbAlica');
define('DB_USER', 'Dev');
define('DB_PASS', 'Dev');
//BD
$dsn = 'mysql:host=localhost;dbname=dbAlica';
$username = 'test';
$password = 'test';
// $dsn = 'mysql:host=localhost;dbname=dbAlica';
// $username = 'test';
// $password = 'test';

@ -16,10 +16,11 @@ class FrontControleur
//TODO
],
"Membre" => [
"deconnexion","proposerOffre","consulterProfil","modifierProfil","signaler"
"deconnexion","proposerOffre","consulterProfil","modifierProfil","signaler",
],
"Utilisateur" => [
"connection", "inscription", "accueil","consulterProfilLimite","listerEvenement", "creerEvenement", "supprimerEvenement", "avoirDetailEvenement", "rechercherEvenement"
"connexion", "inscription", "accueil", "consulterProfilLimite", "publierOffre", "listerEvenement", "creerEvenement", "supprimerEvenement", "avoirDetailEvenement", "rechercherEvenement"
]
);
@ -41,7 +42,7 @@ class FrontControleur
}
}
else if(in_array($action,$actions['Membre'])) {
if (!isset($_SESSION["login"])) {
if (!isset($_SESSION["utilisateur"])) {
$dVueErreur[] = 'Veuillez vous connecter';
echo $twig->render('erreur.html', ['dVueErreur' => $dVueErreur]);
} else{

@ -34,7 +34,9 @@ class MembreControleur extends UtilisateurControleur
protected function deconnexion()
{
//TODO
session_destroy();
header('Location: index.php?action=accueil');
exit();
}
protected function proposerOffre()

@ -1,16 +1,16 @@
<?php
namespace App\controleur;
use App\config;
use App\config\Validation;
use App\gateway\Connection;
use App\gateway\ImageSaver;
use App\gateway\OffreGateway;
use App\modele\OffreModele;
use App\modele\ImageModele;
use App\modele\UtilisateurModele;
class UtilisateurControleur
{
public function __construct()
{
global $twig;
@ -25,20 +25,29 @@ class UtilisateurControleur
case "accueil":
$this->accueil();
break;
case "inscription_success":
$this->inscription_success();
break;
case "connection":
$this->connection();
break;
case "consulterOffres":
$this->consulterOffres();
case "inscription":
$this->inscription();
break;
case "consultOffers":
$this->consultOffers();
break;
case "consulterProfilLimite":
$this->consulterProfilLimite();
break;
case "creerOffre":
$this->creerOffre();
case "createOffer":
$this->createOffer();
break;
case "createOfferForm":
$this->createOfferForm();
break;
case "testAction":
$this->testAction();
case "displayOffer":
$this->displayOffer();
break;
case "listerEvenement":
$this->listerEvenement();
@ -56,65 +65,278 @@ class UtilisateurControleur
$this->rechercherEvenement();
break;
default:
$dVueErreur[] ="Action inconnue ou non autorisée";
echo $twig->render("erreur.html",['dVueErreur' => $dVueErreur]);
$dVueErreur[] = "Action inconnue ou non autorisée";
echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]);
}
}
protected function connection()
{
global $twig;
echo $twig->render('connexion.html', []);
$dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant
$userModel = new \App\modele\UtilisateurModele();
if (isset($_POST['email'], $_POST['password'])) {
$email = \App\config\Validation::nettoyerString($_POST['email']);
$motDePasse = \App\config\Validation::nettoyerString($_POST['password']);
$utilisateur = $userModel->connection($email, $motDePasse);
if ($utilisateur instanceof \App\metier\Alumni) {
$_SESSION['utilisateur'] = $utilisateur;
header('Location: index.php?action=accueil');
exit();
} else {
$dVueErreur[] = "L'adresse email ou le mot de passe est incorrect.";
}
}
echo $twig->render('connection.html', ['dVueErreur' => $dVueErreur]);
}
protected function inscription()
{
global $twig;
$dVueErreur = []; // Tableau pour stocker les erreurs, le cas échéant
$userModel = new \App\modele\UtilisateurModele();
if (isset($_POST['firstname'],$_POST['name'], $_POST['email'], $_POST['password'])) {
$nom = \App\config\Validation::nettoyerString($_POST['name']);
$prenom = \App\config\Validation::nettoyerString($_POST['firstname']);
$email = \App\config\Validation::nettoyerString($_POST['email']);
$motDePasse = \App\config\Validation::nettoyerString($_POST['password']);
$hash = password_hash($motDePasse, PASSWORD_DEFAULT);
// 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 \App\metier\Alumni) {
$dVueErreur[] = "L'adresse email est déjà utilisée.";
}
}
$nouvelUtilisateur = $userModel->inscription($prenom,$nom,$email, $hash);
// <<<<<<< HEAD
// // Validez les données d'inscription, par exemple, vérifiez si l'email est unique
// // Vous pouvez également effectuer d'autres validations nécessaires
// $userModel = new \App\modele\UtilisateurModele();
// $nouvelUtilisateur = $userModel->inscription($email, $motDePasse);
// // Si l'inscription a réussi, redirigez l'utilisateur vers une page de confirmation
// // Vous pouvez également gérer les erreurs ici en cas d'échec de l'inscription
// if ($nouvelUtilisateur instanceof \App\metier\Alumni) {
// // L'inscription a réussi, redirigez l'utilisateur vers une page de confirmation
// // par exemple :
// =======
if ($nouvelUtilisateur instanceof \App\metier\Alumni) {
header('Location: index.php?action=inscription_success');
exit();
} else {
$dVueErreur[] = "L'inscription a échoué, veuillez réessayer.";
}
}
echo $twig->render('inscription.html', ['dVueErreur' => $dVueErreur]);
}
protected function accueil()
{
global $twig;
echo $twig->render('accueil.html', []);
// Ajout d'un var_dump pour déboguer
if (isset($_SESSION['utilisateur']) && $_SESSION['utilisateur'] instanceof \App\metier\Alumni) {
$prenom = $_SESSION['utilisateur']->getPrenom();
$nom = $_SESSION['utilisateur']->getNom();
}
else{
$prenom = null;
$nom = null;
}
//aller sur la page d'accueil avec le nom et prenom de l'utilisateur
echo $twig->render('accueil.html', ['prenom' => $prenom, 'nom' => $nom]);
}
protected function inscription_success()
{
global $twig;
echo $twig->render('inscription_success.html');
}
protected function consulterProfilLimite()
{
//TODO
}
protected function consulterOffres()
protected function consultOffers()
{
$offerMdl = new OffreModele();
global $twig;
echo $twig->render('offres.html', []);
$niveauEtudes=null;
$typeContrat=null;
$exp = null;
$nbOffers = 5 ;
if(isset($_GET["niveauEtudes"]) && Validation::validateTypeStudies($_GET["niveauEtudes"])) {
$niveauEtudes = $_GET["niveauEtudes"];
}
protected function creerOffre()
if(isset($_GET["typeContrat"]) && Validation::validateTypeContract($_GET["typeContrat"])) {
$typeContrat = $_GET["typeContrat"];
}
if(isset($_GET["experience"]) && Validation::validateExperience($_GET["experience"])) {
$exp = $_GET["experience"];
}
if ($niveauEtudes == null && $typeContrat == null && $exp == null) {
$totalOffers = $offerMdl->getNbOffers();
} else {
$params = array(
'typeContrat' => $typeContrat,
'exp' => $exp,
'niveauEtudes' => $niveauEtudes,
);
$offers = $offerMdl->getOffersWithFilters($params);
$totalOffers = count($offers);
}
$numberPages = ceil($totalOffers / 5);
if($numberPages == 0 )
{
echo $twig->render("erreur.html",['dVueErreur' => ['Aucune Offre Trouvée']]);
return;
}
if (isset($_GET["page"]) && intval($_GET["page"]) != null) {
$page = intval($_GET["page"]);
if ($page > $numberPages || $page < 1) {
$dVueErreur[] = "Page introuvable";
echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]);
return;
}
} else {
$page = 1;
}
$start = intval(($page - 1) * 5);
if ($niveauEtudes == null && $typeContrat == null && $exp == null) {
$offers = $offerMdl->getOfferLimit($start, $nbOffers);
} else {
$params['start'] = $start;
$params['nbOffers'] = 5;
$offers = $offerMdl->getOffersWithFilters($params);
}
/* echo "filtre :".$niveauEtudes."<br>";
echo "filtre :".$typeContrat."<br>";
echo "filtre :".$exp."<br>";*/
echo $twig->render('OffersList.html', [
'offres' => $offers,
'numberPages' => $numberPages,
'currentPage' => $page,
'typeContrat' => (($typeContrat != null ? $typeContrat : "")),
'experience' => (($exp != null ? $exp : "")),
'niveauEtudes' => (($niveauEtudes != null ? $niveauEtudes : "")),
'valContrat' => (($typeContrat != null ? "&typeContrat=".$typeContrat : "")),
'valExp' => (($exp != null ? "&experience=".$exp : "")),
'valEtudes' => (($niveauEtudes != null ? "&niveauEtudes=".$niveauEtudes : ""))
]);
}
protected function createOfferForm()
{
global $twig;
echo $twig->render('CreerOffre.html', []);
echo $twig->render("CreerOffre.html", []);
}
protected function createOffer()
{
global $twig;
$taberror = [];
// echo '<img src="data:image/jpg;base64,' . base64_encode($imglist[0]->getBlob() ). '" height="100" width="100" alt="mon image" title="image"/>';*/
$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("CreerOffre.html", ['tabError' => $taberror ]);
return;
}
protected function publierOffre()
if(!Validation::verifierEmail($_POST["mail"]))
{
$imgMdl = new ImageModele;
//echo $twig->render("CreerOffre.html", ['errMsg' => "Email non valide !" ]);
$taberror[] = "Email non valide !";
}
if(!Validation::validateNumber($_POST["num"]))
{
$taberror[] = "Numero non valide !";
//echo $twig->render("CreerOffre.html", ['errMsg' => "Numero non valide !" ]);
}
if (!Validation::validateImage("image"))
{
if(isset($_FILES['image']['name'])) {$taberror[] = "Image non valide !";}
else {$taberror[] = "Inserez une image !";}
}
if(!Validation::validateImage("logo")) {
if(isset($_FILES['logo']['name'])) {$taberror[] = "Logo non valide !";}
else {$taberror[] = "Inserez un logo !";}
return;
}
if(count($taberror) > 0)
{
echo $twig->render("CreerOffre.html", ['tabError' => $taberror ]);
}
else{
$saveImg1 = ImageSaver::SaveImage("image");
$saveImg2 = ImageSaver::SaveImage("logo");
if($saveImg1[0] && $saveImg2[0]) {
$offreMdl = new OffreModele();
$img = $imgMdl->publierImage();
$offreMdl->publierOffre($img);
global $twig;
echo $twig->render('Offres.html', [$offreMdl->obtenirOffres()]);
$offre = $offreMdl->publishOffer($saveImg1[1], $saveImg2[1]);
echo $twig->render("OffreDetailTest.html", ['offre' => $offre]);
}
else
{
$taberror[] = "Erreur lors de l'upload des images";
echo $twig->render("CreerOffre.html", ['tabError' => $taberror ]);
}
}
}
protected function testAction()
public function displayOffer()
{
echo "test action ";
$con = new Connection("mysql:host=localhost;dbname=dbAlica",'test','test');
$offreGw = new OffreGateway($con);
global $twig;
if($offreGw->getMaxid() == NULL)
echo "max id == NULL";
else echo "max id != NULL";
if (isset($_GET["id"]) && intval($_GET["id"]) != null)
{
$offreMdl = new OffreModele();
$offre = $offreMdl->getOfferFromId(intval($_GET["id"]));
if($offre != NULL)
{
echo $twig->render("OffreDetailTest.html",['offre' => $offre]);
return;
}
}
$dVueErreur[] = "Erreur, Offre introuvable";
echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]);
}
protected function listerEvenement()
@ -147,7 +369,6 @@ class UtilisateurControleur
}
}
protected function supprimerEvenement()
{
$mdl = new UtilisateurModele();

@ -4,6 +4,8 @@ use PDO;
use App\metier\Alumni;
use App\metier\Role;
use App\metier\Alumni;
class AlumniGateway
{
private \App\gateway\Connection $con;
@ -25,14 +27,6 @@ class AlumniGateway
}
public function updateEmail(int $id, string $newEmail){
$query='UPDATE Alumni SET email=:new WHERE id=:i';
$this->con->executeQuery($query, array(
':i' => array($id, PDO::PARAM_INT),
':new' => array($newEmail, PDO::PARAM_STR)
));
}
public function updateMotDePasse(int $id, string $password){
$query='UPDATE Alumni SET motDePasse=:new WHERE id=:i';
$this->con->executeQuery($query, array(
@ -41,22 +35,8 @@ class AlumniGateway
));
}
public function updateRole(int $id, Role $newRole){
$query='UPDATE Alumni SET role=:new WHERE id=:i';
$this->con->executeQuery($query, array(
':i' => array($id, PDO::PARAM_INT),
':new' => array($newRole, PDO::PARAM_STR)
));
}
public function delete(int $id){
$query='DELETE FROM Alumni WHERE id=:i';
$this->con->executeQuery($query, array(
':i' => array($id, PDO::PARAM_INT)
));
}
public function findById(int $id){
public function ObtenirById(int $id) : array
{
$query = 'SELECT * FROM Alumni WHERE id=:i';
$this->con->executeQuery($query, array(
':i' => array($id, PDO::PARAM_INT)
@ -65,14 +45,21 @@ class AlumniGateway
}
public function findByEmail(string $email){
$query='SELECT * FROM Alumni WHERE email=:e';
$query = 'SELECT Alumni.mail, Alumni.mdp, Alumni.role, Profil.nom, Profil.prenom
FROM Alumni
LEFT JOIN Profil ON Alumni.id = Profil.alumni
WHERE Alumni.mail = :e';
$this->con->executeQuery($query, array(
':e' => array($email, PDO::PARAM_STR),
));
$res=$this->con->getResults();
return new Alumni($res[0]['mail'],$res[0]['id'],$res[0]['mdp'],$res[0]['role']);
$res = $this->con->getResults();
if (count($res) == 0) {
return null;
}
return new \App\metier\Alumni($res[0]['mail'], $res[0]['mdp'], $res[0]['role'], $res[0]['nom'], $res[0]['prenom']);
}
public function getAll(){
$query='SELECT * FROM Alumni';
$this->con->executeQuery($query);
@ -83,4 +70,14 @@ class AlumniGateway
}
return $array;
}
public function getID(string $email)
{
$query = 'SELECT id FROM Alumni WHERE mail=:e';
$this->con->executeQuery($query, array(
':e' => array($email, PDO::PARAM_STR),
));
$res = $this->con->getResults();
return $res[0]['id'];
}
}

@ -21,16 +21,12 @@ class ImageGateway
public function insertImage(Image $img)
{
$query = "INSERT INTO Image (`nom`, `taille`, `type`, `blob`) VALUES ( :n, :t, :ty, :b)";
try {
$this->con->executeQuery($query, array(
':n' => array($img->getName(), PDO::PARAM_STR),
':t' => array($img->getTaille(), PDO::PARAM_STR),
':ty' => array($img->getType(), PDO::PARAM_STR),
':b' => array($img->getBlob(), PDO::PARAM_STR)
));
} catch (\PDOException $e) {
echo $e->getMessage();
}
}
public function delete(int $id)
@ -41,7 +37,7 @@ class ImageGateway
));
}
public function obtenirParId(int $id) : array
public function getFromId(int $id) : array
{
$query = 'SELECT * FROM Image WHERE id=:i';
$this->con->executeQuery($query, array(
@ -50,16 +46,6 @@ class ImageGateway
return $this->con->getResults();
}
public function trouverParNom(string $nom)
{
$query = 'SELECT * FROM Image WHERE nom=:n';
$this->con->executeQuery($query, array(
':n' => array($nom, PDO::PARAM_STR)
));
return $this->con->getResults();
}
public function getNewId() : int
{
$query = 'SELECT MAX(id) FROM Image';

@ -28,4 +28,3 @@ class ImageSaver
}
}
}

@ -14,12 +14,7 @@ class OffreGateway
$this->con = $con;
}
public function insert(){
$query='INSERT INTO Offre VALUES ()';
$this->con->executeQuery($query, array());
}
public function getMaxid() : int
public function getNewId() : int
{
$query = 'SELECT MAX(id) FROM Offre';
$this->con->executeQuery($query, array());
@ -30,38 +25,109 @@ class OffreGateway
return intval($res[0]['MAX(id)'])+1;
}
public function ajouterOffre(Offre $offre)
public function getNbOffers(): int
{
$query = 'INSERT INTO Offre VALUES (:i, :o, :t, :d, :img, :ty, :v, :e, :desc, :pro, :exp, :niv, :mail, :num, :web, :remote)';
$query = 'SELECT COUNT(*) FROM Offre';
$this->con->executeQuery($query, array());
$res = $this->con->getResults();
return intval($res[0]['COUNT(*)']);
}
public function getOfferLimit($start, $nbOffers): array
{
$query = 'SELECT * FROM Offre LIMIT :s, :nb';
$this->con->executeQuery($query, array(
':s' => array($start, \PDO::PARAM_INT),
':nb' => array($nbOffers, \PDO::PARAM_INT)
));
//echo "start : " . $start . "<br> end : " . $end . "<br>";
//echo "Number of results: " . count($this->con->getResults()) . "<br>";
return $this->con->getResults();
}
public function addOffers(Offre $offre)
{
$query = 'INSERT INTO Offre VALUES (:i, :o, :t, :d, :img, :logo, :ty, :v, :e, :desc, :pro, :exp, :niv, :mail, :num, :web, :remote, :date)';
$this->con->executeQuery($query, array(
':i' => array($offre->getId(), \PDO::PARAM_INT),
':o' => array($offre->getOffreurId(), \PDO::PARAM_STR),
//':o' => array($offre->getOffreurId(), \PDO::PARAM_STR),
':o' => array(1,\PDO::PARAM_INT),
':t' => array($offre->getNom(), \PDO::PARAM_STR),
':d' => array($offre->getDescription(), \PDO::PARAM_STR),
'img' => array($offre->getImg(), \PDO::PARAM_STR),
'logo' => array($offre->getLogo(), \PDO::PARAM_STR),
':ty' => array($offre->getTypeContrat(), \PDO::PARAM_STR),
':v' => array($offre->getVille(), \PDO::PARAM_STR),
':e' => array($offre->getEntreprise(), \PDO::PARAM_STR),
':desc' => array($offre->getDescriptifPoste(), \PDO::PARAM_STR),
':pro' => array($offre->getProfil(), \PDO::PARAM_STR),
':pro' => array($offre->getProfilSearched(), \PDO::PARAM_STR),
':exp' => array($offre->getExperience(), \PDO::PARAM_STR),
':niv' => array($offre->getNiveauEtudes(), \PDO::PARAM_STR),
':mail' => array($offre->getMailContact(), \PDO::PARAM_STR),
':num' => array($offre->getNumero(), \PDO::PARAM_STR),
':web' => array($offre->getSiteUrl(), \PDO::PARAM_STR),
':remote' => array($offre->isRemote(), \PDO::PARAM_BOOL)
':remote' => array($offre->isRemote(), \PDO::PARAM_BOOL),
':date' => array($offre->getDateString(), \PDO::PARAM_STR)
));
}
public function getOffers() : array
{
$query = 'SELECT * FROM offre';
$this->con->executeQuery($query, array());
return $this->con->getResults();
}
public function getOfferFromId($id) : array
{
$query = "SELECT * FROM offre WHERE id=:id";
$this->con->executeQuery($query, array(
':id' => array($id, \PDO::PARAM_INT)
));
return $this->con->getResults();
}
public function getOffersWithFilters($filters) : array
{
$typeContrat = $filters['typeContrat'];
$exp = $filters['exp'];
$niveauEtudes = $filters['niveauEtudes'];
$query = "SELECT * FROM Offre WHERE";
$params = array();
if ($typeContrat != null) {
$query .= " typeContrat = :type";
$params[':type'] = array($typeContrat, \PDO::PARAM_STR);
}
if ($exp != null) {
$query .= ($typeContrat != null ? " AND" : "") . " experience = :exp";
$params[':exp'] = array($exp, \PDO::PARAM_STR);
}
public function obtenirOffres() : array
if ($niveauEtudes != null) {
$query .= (($typeContrat != null || $exp != null) ? " AND" : "") . " niveauEtudes = :lvl";
$params[':lvl'] = array($niveauEtudes, \PDO::PARAM_STR);
}
if(isset($filters['start']) && isset($filters['nbOffers']))
{
$alGw = new AlumniGateway($this->con);
$imgGw = new ImageGateway($this->con);
$query .= " LIMIT :s, :nb";
$params[':s'] = array($filters['start'], \PDO::PARAM_INT);
$params[':nb'] = array($filters['nbOffers'], \PDO::PARAM_INT);
}
$query = 'SELECT * FROM Offre';
$this->con->executeQuery($query, array());
$res = $this->con->getResults();
return $res;
$this->con->executeQuery($query, $params);
return $this->con->getResults();
}
}

@ -0,0 +1,36 @@
<?php
namespace App\gateway;
use PDO;
class ProfilGateway
{
private \App\gateway\Connection $con;
/**
* @param Connection $con
*/
public function __construct(\App\gateway\Connection $con)
{
$this->con = $con;
}
public function insert(int $alumni,string $nom, string $prenom, string $email)
{
$query = 'INSERT INTO Profil (alumni,nom, prenom,email) VALUES (:alumni,:nom, :prenom,:email)';
return $this->con->executeQuery($query, array(
':alumni' => array($alumni, PDO::PARAM_INT),
':nom' => array($nom, PDO::PARAM_STR),
':prenom' => array($prenom, PDO::PARAM_STR),
':email' => array($email, PDO::PARAM_STR)
));
}
public function getProfilById($id)
{
$query = 'SELECT * FROM Profil WHERE Alumni=:i';
$this->con->executeQuery($query, array(
':i' => array($id, PDO::PARAM_INT)
));
return $this->con->getResults();
}
}

@ -4,8 +4,6 @@ namespace App\metier;
class Alumni{
private int $id;
/**
* @var string Email
*/
@ -21,17 +19,21 @@ class Alumni{
*/
private String $role;
private Profil $profil;
/**
* @param string $email
* @param string $motDePasse
* @param String $role
* @param Profil $profil
*/
public function __construct(int $id,string $email, string $motDePasse, String $role)
public function __construct(string $email, string $motDePasse, String $role, string $nom, string $prenom)
{
$this->id = $id;
$this->email = $email;
$this->motDePasse = $motDePasse;
$this->role = $role;
$this->profil = new Profil($nom, $prenom, $email, "","", "", "");
}
/**
@ -42,6 +44,10 @@ class Alumni{
return $this->email;
}
public function getProfil() : Profil
{
return $this->profil;
}
/**
* @return string
*/
@ -55,8 +61,19 @@ class Alumni{
return $this->role;
}
public function getId() : int
public function getPassword(): string
{
return $this->motDePasse;
}
public function getPrenom()
{
return $this->profil->getPrenom();
}
public function getNom()
{
return $this->id;
return $this->profil->getNom();
}
}

@ -1,5 +1,5 @@
<?php
namespace App\modele;
namespace App\metier;
class Article
{

@ -35,9 +35,8 @@ class Evenement
private int $nbPlaceMax;
/**
* @var Image Image de l'evenement
* @var string Image de l'evenement
*/
//private Image $image;
private string $image;
/**
@ -116,6 +115,4 @@ class Evenement
{
return $this->image;
}
}

@ -1,5 +1,5 @@
<?php
namespace App\modele;
namespace App\metier;
class Experience
{

@ -1,5 +1,5 @@
<?php
namespace App\modele;
namespace App\metier;
class Formation
{

@ -3,6 +3,28 @@ namespace App\metier;
use App\metier\Alumni;
use App\metier\Profil;
use DateTime;
class TypeContrat {
const CDI = "CDI";
const CDD = "CDD";
const Alternance = "Alternance";
const Stage = "Stage";
}
enum ProfilRecherche : string
{
case Junior = "Junior";
case Senior = "Senior";
case Indifferent = "Indifferent";
}
enum NiveauEtudes: string
{
case Bac2 = "Bac+2";
case Bac3 = "Bac+3";
case Bac5 = "Bac+5";
case Indifferent = "Indifferent";
}
class Offre
{
@ -54,7 +76,7 @@ class Offre
* @var \App\metier\ProfilRecherche Profil recherché
*/
//private \App\metier\ProfilRecherche $profil;
private string $profil;
private string $profilSearched;
/**
* @var string Experience
*/
@ -66,7 +88,11 @@ class Offre
//private \App\metier\NiveauEtudes $niveauEtudes;
private string $niveauEtudes;
private Image $img;
private string $img;
private string $logo;
private DateTime $date;
/**
* @var string Email de contact
@ -90,11 +116,13 @@ class Offre
* @param string $nom
* @param string $description
* @param string $imageUrl
* @param \App\metier\TypeContrat $typeContrat
* @param string $ville
* @param string $entreprise
* @param string $descriptifPoste
* @param Profil $profil
* @param string $experience
* @param \App\metier\NiveauEtudes $niveauEtudes
* @param string $mailContact
* @param string $numero
* @param string $siteUrl
@ -103,7 +131,8 @@ class Offre
Alumni $offreur,
string $nom,
string $description,
Image $img,
string $img,
string $logo,
string $typeContrat,
string $ville,
string $entreprise,
@ -114,24 +143,27 @@ class Offre
string $mailContact,
string $numero,
string $siteUrl,
bool $remote)
bool $remote,
DateTime $date)
{
$this->id = $id;
$this->offreur = $offreur;
$this->nom = $nom;
$this->description = $description;
$this->img = $img;
$this->logo = $logo;
$this->typeContrat = $typeContrat;
$this->ville = $ville;
$this->entreprise = $entreprise;
$this->descriptifPoste = $descriptifPoste;
$this->profil = $profil;
$this->profilSearched = $profil;
$this->experience = $experience;
$this->niveauEtudes = $niveauEtudes;
$this->mailContact = $mailContact;
$this->numero = $numero;
$this->siteUrl = $siteUrl;
$this->remote = $remote;
$this->date = $date;
}
public function getId(): int
@ -149,6 +181,11 @@ class Offre
return $this->offreur->getId();
}
public function getLogo(): string
{
return $this->logo;
}
public function getNom(): string
{
return $this->nom;
@ -159,19 +196,16 @@ class Offre
return $this->description;
}
public function getImgId(): int
{
return $this->img->getId();
}
public function getImg() : Image
public function getImg() : string
{
return $this->img;
}
public function getBlob() : string
public function getTypeContrat(): string
{
return $this->img->getBlob();
return $this->typeContrat;
}
public function getVille(): string
@ -189,11 +223,21 @@ class Offre
return $this->descriptifPoste;
}
public function getProfilSearched(): string
{
return $this->profilSearched;
}
public function getExperience(): string
{
return $this->experience;
}
public function getNiveauEtudes(): string
{
return $this->niveauEtudes;
}
public function getMailContact(): string
{
return $this->mailContact;
@ -214,8 +258,29 @@ class Offre
return $this->siteUrl;
}
public function setImgId(int $imgId): void
{
$this->imgId = $imgId;
}
public function toString() : string
{
return "Offre :,{$this->nom}, {$this->typeContrat},{$this->ville} {$this->entreprise}";
}
public function getDate(): DateTime
{
return $this->date;
}
public function getDateString() : string
{
return $this->date->format('Y-m-d');
}
public function getDateStringFr()
{
return $this->date->format('d/m/Y');
}
}

@ -1,5 +1,5 @@
<?php
namespace App\modele;
namespace App\metier;
class Profil
{
@ -8,10 +8,6 @@ class Profil
*/
private int $id;
/**
* @var Alumni Compte
*/
private Alumni $alumni;
/**
* @var string CV
@ -28,6 +24,7 @@ class Profil
*/
private string $prenom;
private string $email;
/**
* @var string Url linkedin
*/
@ -44,8 +41,6 @@ class Profil
private string $portfolioUrl;
/**
* @param int $id
* @param Alumni $alumni
* @param string $cv
* @param string $nom
* @param string $prenom
@ -53,27 +48,18 @@ class Profil
* @param string $githubUrl
* @param string $portfolioUrl
*/
public function __construct(int $id, Alumni $alumni, string $cv, string $nom, string $prenom, string $linkedinUrl, string $githubUrl, string $portfolioUrl)
public function __construct(string $nom, string $prenom, string $email, string $cv, string $linkedinUrl, string $githubUrl, string $portfolioUrl)
{
$this->id = $id;
$this->alumni = $alumni;
$this->cv = $cv;
$this->nom = $nom;
$this->prenom = $prenom;
$this->email = $email;
$this->cv = $cv;
$this->linkedinUrl = $linkedinUrl;
$this->githubUrl = $githubUrl;
$this->portfolioUrl = $portfolioUrl;
}
public function getId(): int
{
return $this->id;
}
public function getAlumni(): Alumni
{
return $this->alumni;
}
public function getCv(): string
{
@ -100,6 +86,10 @@ class Profil
return $this->githubUrl;
}
public function getEmail(): string
{
return $this->email;
}
public function getPortfolioUrl(): string
{
return $this->portfolioUrl;

@ -2,13 +2,15 @@
namespace App\modele;
use App\metier\Alumni;
class AdminModele extends MembreModele
{
/**
* @description supprimer un compte
* @param Alumni $account compte à supprimer
*/
public function deleteAccount(\App\modele\Alumni $account)
public function deleteAccount(\App\metier\Alumni $account)
{
// TO DO
}

@ -1,53 +0,0 @@
<?php
namespace App\modele;
use App\gateway\Connection;
use App\metier\Image;
use App\gateway\ImageGateway;
class ImageModele
{
private ImageGateway $gw;
public function __construct()
{
$this->gw = new ImageGateway(new Connection("mysql:host=localhost;dbname=dbAlica","test","test"));
}
public function publierImage() : Image
{
$img = new Image($this->gw->getNewId(),
$_FILES["image"]["name"],
$_FILES["image"]["size"],
$_FILES["image"]["type"],
file_get_contents($_FILES["image"]["tmp_name"]));
$this->gw->insertImage($img);
return $img;
}
public function insertImage(Image $img)
{
$this->gw->insertImage($img);
}
public function obtenirParId(int $id)
{
$this->gw->obtenirParId($id);
$res = $this->gw->obtenirToutesImages();
return new Image($id ,$res[0]['nom'], $res[0]['taille'], $res[0]['type'], $res[0]['blob']);
}
public function obtenirToutesImages() : array
{
$this->gw->obtenirToutesImages();
$res = $this->gw->obtenirToutesImages();
foreach ($res as $r) {
$array[] = new Image($this->gw->getNewId(),$r['nom'], $r['taille'], $r['type'], $r['blob']);
}
return $array;
}
}

@ -6,23 +6,23 @@ 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("mysql:host=localhost;dbname=dbAlica", "test", "test"));
$this->offreGw = new OffreGateway(new Connection(DB_HOST,DB_USER,DB_PASS));
}
public function publierOffre(Image $img)
public function publishOffer(string $img, string $logo)
{
$desc = $_POST["description"];
$descposte = $_POST["descriptPoste"];
$nom = $_POST["name"];
@ -33,37 +33,23 @@ class OffreModele
$num = $_POST["num"];
$site = $_POST["site"];
$exp = $_POST["choixExp"];
$typeContrat = $_POST["typeContrat"];
/* $typeContrat = match ($_POST["typeContrat"]) {
"Stage" => TypeContrat::Stage,
"CDI" => TypeContrat::CDI,
"CDD" => TypeContrat::CDD,
"Alternance" => TypeContrat::Alternance,
default => TypeContrat::CDD,
};*/
$niveauEtudes = $_POST["education"];
/* $niveauEtudes = match ($_POST["education"]) {
"Bac+2" => NiveauEtudes::Bac2,
"Bac+3" => NiveauEtudes::Bac3,
"Bac+5" => NiveauEtudes::Bac5,
default => NiveauEtudes::Indifferent,
};*/
$date = new \DateTime();
if(isset($_POST["fullRemote"]))
{
$remote = true;
}
else {
$remote = false;
}
else $remote = false;
// à la place de NULL passer id utilisateur créateur offre
$offre = new Offre($this->offreGw->getMaxid(),
new Alumni(12,"test.mail@icloud.fr","password","admin"),
$offre = new Offre($this->offreGw->getNewId(),
new Alumni("test.mail@icloud.fr","password","admin","prenom","nom"),
$nom,
$desc,
$img,
$logo,
$typeContrat,
$ville,
$entreprise,
@ -74,30 +60,52 @@ class OffreModele
$mail,
$num,
$site,
$remote);
$this->offreGw->ajouterOffre($offre);
$remote,
$date);
$this->offreGw->addOffers($offre);
return $offre;
}
public function obtenirOffres() : array
public function getOffers() : array
{
$alGw = new AlumniGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test"));
$imgGw = new ImageGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test"));
$res = $this->offreGw->obtenirOffres();
$offres=[];
$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)
{
$res = $imgGw->obtenirParId($row['image']);
$img = new Image(intval($res[0]["id"]),$res[0]['nom'], $res[0]['taille'], $res[0]['type'], $res[0]['blob']);
$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"]);
$resal = $alGw->findById($row['offreur']);
$alumni = new Alumni($resal[0]['id'],$resal[0]['mail'],$resal[0]['mdp'],$resal[0]['role']);
$date = \DateTime::createFromFormat('Y-m-d', $row['date']);
$offres[]= new Offre($row['id'],
$offers[]=new Offre(
$row['id'],
$alumni,
$row['titre'],
$row['description'],
$img,
$row["image"],
$row["logo"],
$row['typeContrat'],
$row['ville'],
$row["entreprise"],
@ -108,12 +116,30 @@ class OffreModele
$row['mailContact'],
$row['numero'],
$row['websiteURL'],
$row['remote']);
$row['remote'],
$date);
}
return $offres;
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);
}
}

@ -12,8 +12,80 @@ class UtilisateurModele
public function __construct()
{
global $dsn, $username, $password;
$this->con = new Connection($dsn, $username, $password);
$this->con = new Connection(DB_HOST,DB_USER,DB_PASS);
}
/**
* @description se connecter
* @param string email
* @param string hash
* @return \App\metier\Alumni
*/
public function connection(string $email, string $mdp) : ? \App\metier\Alumni
{
$con = new \App\gateway\Connection(DB_HOST,DB_USER,DB_PASS);
$gate = new \App\gateway\AlumniGateway($con);
// Récupérez l'utilisateur avec l'email donné en utilisant AlumniGateway
$utilisateur = $gate->findByEmail($email);
if ($utilisateur instanceof \App\metier\Alumni) {
// L'utilisateur existe, vérifiez le mot de passe
if (password_verify($mdp, $utilisateur->getPassword())) {
// Le mot de passe est correct, retournez l'utilisateur
session_start();
return $utilisateur;
} else {
// Le mot de passe est incorrect, renvoyez null
return null;
}
} else {
// L'utilisateur n'existe pas, renvoyez null
return null;
}
}
/**
* @description s'inscrire
* @param string email
* @param string hash
* @param string $pseudo
* @return \Alumni chargé
*/
public function inscription(string $prenom, string $nom,string $email, string $hashpassword):? \App\metier\Alumni
{
$role = "Membre";
$con = new \App\gateway\Connection(DB_HOST,DB_USER,DB_PASS);
$gate = new \App\gateway\AlumniGateway($con);
$profilGate = new \App\gateway\ProfilGateway($con);
// Insérez le nouvel utilisateur dans la base de données en utilisant AlumniGateway
if ($gate->insert($email, $hashpassword, $role)) {
$alumni = $gate->getID($email);
if($profilGate->insert($alumni,$nom, $prenom,$email)){
// L'insertion a réussi, retournez le nouvel utilisateur
$nouvelUtilisateur = new \App\metier\Alumni($email, $hashpassword, $role,$nom,$prenom);
return $nouvelUtilisateur;
}
return null;
} else {
// L'insertion a échoué, renvoyez un utilisateur vide pour indiquer l'échec
return null;
}
}
public function getUtilisateurByEmail(string $email)
{
$con = new \App\gateway\Connection(DB_HOST,DB_USER,DB_PASS);
$gate = new \App\gateway\AlumniGateway($con);
// Récupérez l'utilisateur avec l'email donné en utilisant AlumniGateway
$utilisateur = $gate->findByEmail($email);
if ($utilisateur instanceof \App\metier\Alumni) {
// L'utilisateur existe, retournez-le
return $utilisateur;
} else {
// L'utilisateur n'existe pas, renvoyez null
return null;
}
}
public function getEvenement() : array

@ -0,0 +1,125 @@
<!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,145 @@
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>Alica - Offres</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/offres.css">
</head>
<body>
<header>
{% include "menu.html" %}
</header>
<div class="container mt-4 d-flex align-content-center ">
<div>
<a href="index.php?action=createOfferForm" type="button" class="btn btn-outline-success mb-4">Publier une offre</a>
</div>
<div class="container mt-4">
<div class="d-flex flex-column align-items-center">
<form action="index.php" method="get" class="form-inline flex-wrap mb-4">
<h2 class="mr-3">Filtrer les offres</h2>
<div class="form-group mr-3 flex-column justify-content-left">
<label for="typeContrat" class="text-left">Type de contrat :</label>
<div class="form-check ml-0">
<input class="form-check-input" type="radio" name="typeContrat" id="cdd" value="CDD" {% if typeContrat == "CDD" %}checked{% endif %}>
<label class="form-check-label" for="cdd">CDD</label>
</div>
<div class="form-check ml-0">
<input class="form-check-input" type="radio" name="typeContrat" id="cdi" value="CDI" {% if typeContrat == "CDI" %}checked{% endif %}>
<label class="form-check-label" for="cdi">CDI</label>
</div>
<div class="form-check ml-0">
<input class="form-check-input" type="radio" name="typeContrat" id="alternance" value="Alternance" {% if "Alternance" == typeContrat %}checked{% endif %}>
<label class="form-check-label" for="alternance">Alternance</label>
</div>
<div class="form-check ml-0">
<input class="form-check-input" type="radio" name="typeContrat" id="stage" value="Stage" {% if "Stage" == typeContrat %}checked{% endif %}>
<label class="form-check-label" for="stage">Stage</label>
</div>
</div>
<div class="form-group mr-3 flex-column">
<label for="experience">Expérience :</label>
<div class="form-check">
<input class="form-check-input" type="radio" name="experience" id="junior" value="Junior" {% if "Junior" == experience %}checked{% endif %}>
<label class="form-check-label" for="junior">Junior</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="experience" id="senior" value="Senior" {% if "Senior" == experience %}checked{% endif %}>
<label class="form-check-label" for="senior">Senior</label>
</div>
</div>
<div class="form-group flex-column">
<label for="niveauEtudes">Niveau d'études :</label>
<div class="form-check">
<input class="form-check-input" type="radio" name="niveauEtudes" id="bac2" value="Bac+2" {% if "Bac+2" == niveauEtudes %}checked{% endif %}>
<label class="form-check-label" for="bac2">Bac+2</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="niveauEtudes" id="bac3" value="Bac+3" {% if "Bac+3" == niveauEtudes %}checked{% endif %}>
<label class="form-check-label" for="bac3">Bac+3</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="niveauEtudes" id="bac5" value="Bac+5" {% if "Bac+5" == niveauEtudes %}checked{% endif %}>
<label class="form-check-label" for="bac5">Bac+5</label>
</div>
</div>
<button type="submit" class="btn btn-primary">Filtrer</button>
</form>
</div>
</div>
<div>
<a href="index.php?action=consultOffers" class="btn btn-info">Réinitialiser les filtres</a>
</div>
</div>
<h1 id="titrePrincipal">Offres d'emploi</h1>
<div class="col-md-8 offset-md-2">
{% for offre in offres %}
<article class="mb-4">
<div class="row1">
<img src="uploads/{{offre.getLogo()}}" class="img-fluid rounded" alt="logo"> <!-- Ajoutez la classe "rounded" pour arrondir les coins -->
<h4>{{ offre.getNom() }}</h4>
</div>
<div class="row2">
<p class="authorDate"><strong>Julien Martin | {{ offre.getDateStringFr()}}</strong></p>
<p>{{ offre.getDescription() }}</p>
</div>
<div class="row3">
<img src="assets/location.png" alt="location">
<p>{{offre.getVille()}}</p>
</div>
<button type="button" class="btn btn-outline-primary btn-sm mb-2 custom-button"
onclick="window.location.href = 'index.php?action=displayOffer&id={{offre.getId()}}';">En savoir plus >
</button>
</article>
{% endfor %}
<nav style="text-align: center;">
<nav style="text-align: center;">
{% if numberPages is defined %}
{% if currentPage is defined %}
{% for i in 1..numberPages %}
{% if i == currentPage %}
<!--
index.php?action=consultOffers&page={{ i }}&typeContrat={{ typeContrat }}&experience={{ experience }}&niveauEtudes={{ niveauEtudes }}
-->
<a href="index.php?action=consultOffers&page={{ i }}&{{valContrat}}{{valExp}}{{ValEtudes}}" class="active bg-danger">{{ i }}</a>
{% else %}
<a href="index.php?action=consultOffers&page={{ i }}&{{valContrat}}{{valExp}}{{ValEtudes}}">{{ i }}</a>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
</nav>
</nav>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/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,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Offre {{ offre.getNom() }}</title>
</head>
<body>
</body>
</html>

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Détails de l'Offre {{ offre.getNom() }}</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<header>
<!-- Add your logo here -->
{% include "menu.html" %}
</header>
<div class="container mt-5">
<h1 class="display-4">Détails de l'Offre</h1>
<ul class="list-group">
<!-- Add an image related to the offer -->
<li class="list-group-item"></li><img src="uploads/{{offre.getLogo()}}" alt="Logo" class="img-thumbnail" style="max-height: 50px; max-width: 50px;"</li>
<li class="list-group-item"><img src="uploads/{{offre.getImg()}}" alt="Offer Image" class="img-fluid"></li>
<!--<li class="list-group-item"><strong>ID:</strong> {{ offre.getId() }}</li> -->
<li class="list-group-item"><strong>Offreur:</strong> {{ offre.getOffreur().getNom() }}</li>
<li class="list-group-item"><strong>Nom de l'offre:</strong> {{ offre.getNom() }}</li>
<li class="list-group-item"><strong>Entreprise :</strong> {{ offre.getEntreprise() }}</li>
<li class="list-group-item"><strong>Description:</strong> {{ offre.getDescription() }}</li>
<li class="list-group-item"><strong>Type de contrat:</strong> {{ offre.getTypeContrat() }}</li>
<li class="list-group-item"><strong>Niveau d'études :</strong> {{ offre.getNiveauEtudes() }}</li>
<li class="list-group-item"><strong>Ville:</strong> {{ offre.getVille() }}</li>
<li class="list-group-item"><strong>Date de publication:</strong> {{ offre.getDateStringFr() }}</li>
<li class="list-group-item"><strong>Descriptif Poste :</strong> {{ offre.getDescriptifPoste() }}</li>
<li class="list-group-item"><strong>Profil recherché :</strong> {{ offre.getProfilSearched() }}</li>
<li class="list-group-item"><strong>Site de L'annonce :</strong> {{ offre.getSiteUrl() }}</li>
<li class="list-group-item"><strong>Mail de Contact : :</strong> {{ offre.getMailContact() }}</li>
<li class="list-group-item"><strong>Numéro de Contact :</strong> {{ offre.getNumero() }}</li>
<li class="list-group-item">
<strong>Full Remote :</strong>
{% if offre.isRemote() %}
Oui
{% else %}
Non
{% endif %}
</li>
</ul>
</div>
<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>

@ -3,21 +3,37 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="../public/css/accueil.css">
<link rel="stylesheet" type="text/css" href="css/accueil.css">
<title>Alica - Accueil</title>
</head>
<body>
<header>
{% include 'menu.html' %}
</header>
<h1>Accueil</h1>
<!-- Bienvenu suivie du mail des informations sessions de l'utilisateur -->
<p>{% if prenom and nom %}
Bienvenue, {{ prenom }} {{ nom }}!
{% else %}
Bienvenue, invité!
{% endif %}</p>
<p>Vous êtes sur la page d'accueil</p>
<p>Vous pouvez vous connecter ou vous inscrire</p>
<p>Vous pouvez aussi consulter les articles</p>
<p>Vous pouvez aussi consulter les annonces</p>
<p>Connexion :</p>
<form action="../public/index.php?action=connection" method="POST">
<input type="submit" value="Se connecter">
</form>
{% if dVueErreur is not empty %}
<div class="CadreInput">
<div class="box">
<div class="error">
<ul>
{% for erreur in dVueErreur %}
<li>{{ erreur }}</li>
{% endfor %}
</ul>
</div>
</div>
</div>
{% endif %}
</body>
</html>

@ -16,7 +16,7 @@
<div class="icon">
<ion-icon name="person"></ion-icon>
</div>
<input type="text" name="username" required>
<input type="text" name="email" required>
</div>
</div>
<div class="CadreInput">
@ -42,6 +42,19 @@
</form>
</div>
</div>
{% if dVueErreur is not empty %}
<div class="CadreInput">
<div class="box">
<div class="error">
<ul>
{% for erreur in dVueErreur %}
<li>{{ erreur }}</li>
{% endfor %}
</ul>
</div>
</div>
</div>
{% endif %}
</div>
<script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
<script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>

@ -9,43 +9,52 @@
<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=publierOffre" method="post">
<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é">
<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">
<input type="text" class="form-control" id="entreprise" name="entreprise" placeholder="Entreprise" maxlength="64" required>
</div>
<div class="form-group">
<label for="description">Description*</label>
<textarea class="form-control" id="description" name="description" placeholder="Description rapide"></textarea>
<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">
<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">
<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">CDI</option>
<option value="CDI" selected>CDI</option>
<option value="CDD">CDD</option>
<option value="Alternance">Alternance</option>
<option value="Stage">Stage</option>
@ -54,74 +63,63 @@
<div class="form-group">
<label for="descriptPoste">Descriptif du Poste :*</label>
<textarea class="form-control" id="descriptPoste" name="descriptPoste" placeholder="Description du Poste"></textarea>
<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é"></textarea>
<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">
<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>
<option value="Indifférent">Indifferent</option>
</select>
</div>
<label>Niveau d'études :*</label>
<div class="form-check-inline">
<input type="radio" class="form-check-input" id="indifferent" name="education" checked>
<label class="form-check-label" for="indifferent">Indifférent</label>
</div>
<div class="form-check-inline">
<input type="radio" class="form-check-input" id="bac2" name="education">
<label class="form-check-label" for="bac2">Bac +2</label>
</div>
<div class="form-check-inline">
<input type="radio" class="form-check-input" id="bac5" name="education">
<label class="form-check-label" for="bac5">Bac +3</label>
</div>
<div class="form-check-inline">
<input type="radio" class="form-check-input" id="bac8" name="education">
<label class="form-check-label" for="bac8">Bac +5</label>
<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">
<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">
<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">
<input type="text" class="form-control" id="site" name="site" placeholder="Adresse web" maxlength="40" required>
</div>
<input type="file" name="image" id="image">
<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>
<script src="../scripts/creerOffre.js"></script>
</body>
</html>

@ -7,8 +7,15 @@
<title>Alica - Erreur</title>
</head>
<style>
body{
text-align: center;
}
</style>
{% include "menu.html" %}
<body>
<h1>Page d'erreur</h1>
<h1>Erreur</h1>
{% if dVueErreur is defined %}
{% for value in dVueErreur %}
<p>{{value}}</p>

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Footer</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="d-flex justify-content-around">
<div style="background-color:#00DBFF">div 1</div>
<div style="background-color:#00DBFF">
<h3>Association</h3>
</div>
<div style="background-color:#00DBFF">
<h3>Aide</h3>
</div>
</div>
<p class="text-center">© Copyright 2023, All Rights Reserved by Alica</p>
</body>
</html>

@ -11,12 +11,25 @@
<form action="" method="POST">
<h3>S'inscrire</h3>
<div class="CadreInput">
<span>Identifiant</span>
<span>Prénom :</span>
<div class="box">
<div class="icon">
<ion-icon name="person"></ion-icon>
</div>
<input type="text" name="username" required>
<label>
<input type="text" name="firstname" required>
</label>
</div>
</div>
<div class="CadreInput">
<span>Nom :</span>
<div class="box">
<div class="icon">
<ion-icon name="person"></ion-icon>
</div>
<label>
<input type="text" name="name" required>
</label>
</div>
</div>
<div class="CadreInput">
@ -25,7 +38,9 @@
<div class="icon">
<ion-icon name="mail-outline"></ion-icon>
</div>
<label>
<input type="email" name="email" required>
</label>
</div>
</div>
<div class="CadreInput">
@ -34,7 +49,9 @@
<div class="icon">
<ion-icon name="lock-closed"></ion-icon>
</div>
<label>
<input type="password" name="password" required>
</label>
</div>
</div>
<div class="CadreInput">
@ -50,6 +67,19 @@
</form>
</div>
</div>
{% if dVueErreur is not empty %}
<div class="CadreInput">
<div class="box">
<div class="error">
<ul>
{% for erreur in dVueErreur %}
<li>{{ erreur }}</li>
{% endfor %}
</ul>
</div>
</div>
</div>
{% endif %}
</div>
<script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
<script noModule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Success</title>
<link rel="stylesheet" type="text/css" href="../public/css/inscription_success.css">
</head>
<body>
<h1>Inscription effectuée avec succès, vous pouvez désormais vous connecter</h1>
<p>Vous allez être redirigé vers la page de connexion dans 5 secondes</p>
<div class="three-body">
<div class="three-body__dot"></div>
<div class="three-body__dot"></div>
<div class="three-body__dot"></div>
</div>
<script>
setTimeout(function () {
window.location.href = "../public/index.php?action=connection";
}, 5000);
</script>
</body>
</html>

@ -2,6 +2,7 @@
<html lang="fr">
<head>
<link rel="stylesheet" type="text/css" href="css/menu.css">
</head>
<nav class="navbar-container">
<div class="logo-container">
@ -17,14 +18,22 @@
<ul class="nav-items">
<li class="nav-link"><a href="#">A propos</a></li>
<li class="nav-link"><a href="#">Evenements</a></li>
<li class="nav-link"><a href="#">Offres</a></li>
<li class="nav-link"><a href="index.php?action=consultOffers">Offres</a></li>
<li class="nav-link"><a href="#">Nous contacter</a></li>
</ul>
<ul class="nav-items">
<!-- Afficher boutons de connexion et d'inscription -->
{% if nom and prenom %}
<!-- Afficher bouton de déconnexion -->
<a href="index.php?action=deconnexion" class="button">Déconnexion</a>
{% else %}
<div class="login-register">
<a href="index.php?action=connection" class="button">Connexion</a>
<a href="index.php?action=inscription" class="button button2">Inscription</a>
</div>
{% endif %}
</ul>
</nav>
</html>

@ -0,0 +1,52 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Offre Detail</title>
<link rel="stylesheet" href="css/offreDetail.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<header>
{% include "menu.html" %}
</header>
<div id="titleDiv" class="jumbotron text-center">
<img src="assets/michelin.png" alt="Logo" height="70px">
<h1>Developpeur Fullstack</h1>
<img src="assets/location.png">
<p>Paris</p>
<div id="key" class="row justify-content-center">
<div class="col-md-2">
<p>CDI</p>
</div>
<div class="col-md-3">
<p>Experience: Non spécifié</p>
</div>
<div class="col-md-3">
<p>Etudes: Bac+2</p>
</div>
</div>
</div>
<p>Offre Proposée par marvin marbout</p>
<p>Publiée le 15/17/2023</p>
<h3>Description de l'offre</h3>
<div id="description" class="container">
<p>
Accompagné(e) par nos experts au sein d'une équipe pluridisciplinaire, tu conçois et développes des solutions innovantes répondant aux besoins de nos clients.
A ce titre, tu utilises les langages, frameworks et outils actuels.
Les méthodes agiles ainsi que les pratiques DevOps, l'intégration et le déploiement continu sont ton quotidien.
Tu interviens dans un environnement technique très riche. Rejoindre CGI dans le cadre de ton stage de fin détudes,
cest intervenir sur des projets denvergure et variés en lien avec ta formation tout en bénéficiant dun accompagnement de proximité pour construire ta carrière.
Cest aussi sinvestir auprès dune entreprise responsable qui propose de nombreux avantages (prise en charge jusquà 100% des transports en commun) et partager des moments de convivialité pour ensuite nous rejoindre en CDI !
</p>
</div>
<!-- Include Bootstrap JS and jQuery -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.min.js"></script>
</body>
</html>

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Alica - Offres</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<style>
.offre-container {
margin-bottom: 5%;
}
.offre-img {
max-width: 100%;
}
#titrePrincipal {
padding-bottom: 10px;
border-bottom: 1px solid black;
margin-bottom: 30px;
}
.custom-button {
background-color: #00DBFF;
border-color: #00DBFF;
color: #fff;
}
</style>
</head>
<body>
<header>
{% include "menu.html" %}
</header>
<div class="container mt-4">
<h1 id="titrePrincipal">Offres d'emploi</h1>
{% for offre in offers %}
<div class="offre-container">
<div class="row">
<!-- Première ligne -->
<div class="col-12 col-md-3">
<img src="data:image/png;base64,{{ offre.getImg().getBlob() | base64 }}" class="offre-img">
</div>
<div class="col-12 col-md-9">
<h3>{{ offre.getNom() }}</h3>
<p>Julien Martin</p>
</div>
</div>
<div class="row">
<div class="col-12">
<p class="text-left">{{ offre.getDescription() }}</p>
</div>
</div>
<!-- Quatrième ligne (Localisation) -->
<div class="row">
<div class="col-1">
<img src="assets/location.png" class="img-fluid" title="ville">
</div>
<div class="col-11">
<p>{{ offre.getVille() }}</p>
</div>
</div>
<div class="row">
<div class="col-12">
<button type="button" class="btn btn-outline-primary btn-sm mb-2 custom-button"
onclick="window.location.href = 'index.php?action=displayOffer&id={{offre.getId()}}';">En savoir plus ></button>
</div>
</div>
</div>
{% endfor %}
{% if pages is defined %}
{% for page in pages %}
<a href="index.php?action=displayOffers&page={{page}}">{{page}}</a>
{% endfor %}
{% endif %}
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/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,21 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test Img</title>
</head>
<body>
<form name="form" action="index.php?action=publierOffre" method="post" enctype="multipart/form-data">
<label>Image:</label>
<input type="file" name="image" id="image">
<input type="submit" value="Publier L'annonce" name="submit">
</form>
</body>
</html>

@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'ca79f102cff2316dd789a28ba980fe14643acaa0',
'reference' => '5e0d7c0f8d2b99afe354727af9c141da9b1ae5a1',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'ca79f102cff2316dd789a28ba980fe14643acaa0',
'reference' => '5e0d7c0f8d2b99afe354727af9c141da9b1ae5a1',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),

Loading…
Cancel
Save