savegarde et récuperation d'images fonctionnelle plus page offre fonctionnelle

offres2
Baptiste D 1 year ago
parent 265d12d88f
commit 2f2b7b7ed7

BIN
.DS_Store vendored

Binary file not shown.

BIN
php/.DS_Store vendored

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

@ -67,17 +67,19 @@ class Validation
{ {
if(isset($_FILES[$img])) if(isset($_FILES[$img]))
{ {
$typesMime = array('image/jpeg', 'image/png','image/jpg','image/gif', 'image/bmp','image/webp'); $typesMime = array('image/jpeg', 'image/png','image/jpg', 'image/bmp','image/webp');
$file = $_FILES[$img]["tmp_name"]; $file = $_FILES[$img]["tmp_name"];
$mime = mime_content_type($file);
if (in_array($mime, $typesMime)) { $mime = mime_content_type($file);
$maxFileSize = 10 * 1024 * 1024; // 10MB
if (in_array($mime, $typesMime) && $_FILES[$img]["size"] <= $maxFileSize) {
return true; return true;
} }
} }
return false; return false;
} }
public static function checkNumber($number) : bool public static function checkNumber($number) : bool
{ {
if(preg_match("/^[0-9]{10}$/", $number)) if(preg_match("/^[0-9]{10}$/", $number))

@ -5,6 +5,7 @@ namespace App\controleur;
use App\config\Validation; use App\config\Validation;
use App\gateway\Connection; use App\gateway\Connection;
use App\gateway\ImageGateway; use App\gateway\ImageGateway;
use App\gateway\ImageSaver;
use App\gateway\OffreGateway; use App\gateway\OffreGateway;
use App\metier\Image; use App\metier\Image;
use App\modele\OffreModele; use App\modele\OffreModele;
@ -13,6 +14,7 @@ use App\TwigExtensions;
class UtilisateurControleur class UtilisateurControleur
{ {
public function __construct() public function __construct()
{ {
global $twig; global $twig;
@ -110,13 +112,37 @@ class UtilisateurControleur
{ {
$offerMdl = new OffreModele(); $offerMdl = new OffreModele();
global $twig; global $twig;
$twig->addExtension(new TwigExtensions()); // Ajouter l'extension personnalisée à l'environnement Twig
$offers = $offerMdl->getOffers(); // Nombre total de pages
$numberPages = ceil($offerMdl->getNbOffers() / 5);
// Gestion de la page actuelle
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);
$end = 5;
$offers = $offerMdl->getOfferLimit($start, $end);
echo $twig->render('OffersList.html', ['offres' => $offers]); // Affichage du template avec les données
echo $twig->render('OffersList.html', [
'offres' => $offers,
'numberPages' => $numberPages,
'currentPage' => $page
]);
} }
protected function createOfferForm() protected function createOfferForm()
{ {
global $twig; global $twig;
@ -126,16 +152,23 @@ class UtilisateurControleur
protected function createOffer() protected function createOffer()
{ {
global $twig; global $twig;
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $taberror = [];
$requiredFields = ['name', 'entreprise', 'description','typeContrat', 'descriptPoste', 'profilRecherche', 'choixExp', 'education', 'mail', 'num']; $requiredFields = ['name', 'entreprise', 'description','typeContrat', 'descriptPoste', 'profilRecherche', 'choixExp', 'education', 'mail', 'num'];
$error = false;
foreach ($requiredFields as $field) { foreach ($requiredFields as $field) {
if (empty($_POST[$field])) { if (empty($_POST[$field])) {
echo $twig->render("creerOffre.html", ['errMsg' => $field]); $error = true;
$taberror[] = "Le champ {$field} est requis !";
} }
} }
if($error)
{
echo $twig->render("CreerOffre.html", ['tabError' => $taberror ]);
return;
} }
$taberror = [];
if(!Validation::verifierEmail($_POST["mail"])) if(!Validation::verifierEmail($_POST["mail"]))
{ {
//echo $twig->render("CreerOffre.html", ['errMsg' => "Email non valide !" ]); //echo $twig->render("CreerOffre.html", ['errMsg' => "Email non valide !" ]);
@ -151,45 +184,38 @@ class UtilisateurControleur
if (!Validation::validateImage("image")) if (!Validation::validateImage("image"))
{ {
if(isset($_FILES['image']['name'])) if(isset($_FILES['image']['name'])) {$taberror[] = "Image non valide !";}
{ else {$taberror[] = "Inserez une image !";}
$taberror[] = "Image non valide !";
//echo $twig->render("CreerOffre.html", ['errMsg' => "Image {$imgName} non valide !" ]);
}
else {
//echo $twig->render("CreerOffre.html", ['errMsg' => "Inserez une image" ]);
$taberror[] = "Inserez une image !";
}
} }
if(!Validation::validateImage("logo")) { if(!Validation::validateImage("logo")) {
if(isset($_FILES['logo']['name'])) if(isset($_FILES['logo']['name'])) {$taberror[] = "Logo non valide !";}
{ else {$taberror[] = "Inserez un logo !";}
$taberror[] = "Logo non valide !";
//echo $twig->render("CreerOffre.html", ['errMsg' => "Image {$imgName} non valide !" ]);
}
else
{
$taberror[] = "Inserez un logo !";
//echo $twig->render("CreerOffre.html", ['errMsg' => "Inserez un logo" ]);
}
return; return;
} }
if(count($taberror) > 0) if(count($taberror) > 0)
{ {
echo $twig->render("CreerOffre.html", ['tabError' => $taberror ]); echo $twig->render("CreerOffre.html", ['tabError' => $taberror ]);
} }
else{ else{
$imgMdl = new ImageModele(); $saveImg1 = ImageSaver::SaveImage("image");
$img = $imgMdl->publierImage("image"); $saveImg2 = ImageSaver::SaveImage("logo");
$logo = $imgMdl->publierImage("logo"); if($saveImg1[0] && $saveImg2[0]) {
$offreMdl = new OffreModele(); $offreMdl = new OffreModele();
$offre = $offreMdl->publishOffers($img, $logo);
for($i=0;$i<100;$i++)
{
$offre = $offreMdl->publishOffers($saveImg1[1], $saveImg2[1]);
}
echo $twig->render("OffreDetailTest.html", ['offre' => $offre]); echo $twig->render("OffreDetailTest.html", ['offre' => $offre]);
} }
else
{
$taberror[] = "Erreur lors de l'upload des images";
echo $twig->render("CreerOffre.html", ['tabError' => $taberror ]);
}
}
} }
public function displayOffer() public function displayOffer()
@ -199,7 +225,6 @@ class UtilisateurControleur
if (isset($_GET["id"]) && intval($_GET["id"]) != null) if (isset($_GET["id"]) && intval($_GET["id"]) != null)
{ {
$offreMdl = new OffreModele(); $offreMdl = new OffreModele();
$offre = $offreMdl->getOfferFromId(intval($_GET["id"])); $offre = $offreMdl->getOfferFromId(intval($_GET["id"]));
if($offre != NULL) if($offre != NULL)
{ {
@ -210,4 +235,5 @@ class UtilisateurControleur
$dVueErreur[] = "Erreur, Offre introuvable"; $dVueErreur[] = "Erreur, Offre introuvable";
echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]); echo $twig->render("erreur.html", ['dVueErreur' => $dVueErreur]);
} }
} }

@ -0,0 +1,30 @@
<?php
namespace App\gateway;
class ImageSaver
{
public static function getId() : int
{
return rand(10000,19999);
}
public static function SaveImage(string $filename) : array
{
try {
$return=[];
$name = substr($_FILES[$filename]["name"], 0, 45);
$name = self::getId().$name;
move_uploaded_file($_FILES[$filename]['tmp_name'], "../public/uploads/$name");
$return[]=true;
$return[]=$name;
return $return;
} catch (\Exception $e) {
$return[] = false;
$return[] = "";
return $return;
}
}
}

@ -14,7 +14,7 @@ class OffreGateway
$this->con = $con; $this->con = $con;
} }
public function getMaxid() : int public function getNewId() : int
{ {
$query = 'SELECT MAX(id) FROM Offre'; $query = 'SELECT MAX(id) FROM Offre';
$this->con->executeQuery($query, array()); $this->con->executeQuery($query, array());
@ -25,16 +25,39 @@ class OffreGateway
return intval($res[0]['MAX(id)'])+1; return intval($res[0]['MAX(id)'])+1;
} }
public function getNbOffers(): int
{
$query = 'SELECT COUNT(*) FROM Offre';
$this->con->executeQuery($query, array());
$res = $this->con->getResults();
return intval($res[0]['COUNT(*)']);
}
public function getOfferLimit($start, $end): array
{
$query = 'SELECT * FROM Offre LIMIT :s, :e';
$this->con->executeQuery($query, array(
':s' => array($start, \PDO::PARAM_INT),
':e' => array($end, \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) 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)'; $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( $this->con->executeQuery($query, array(
':i' => array($offre->getId(), \PDO::PARAM_INT), ':i' => array($offre->getId(), \PDO::PARAM_INT),
':o' => array($offre->getOffreurId(), \PDO::PARAM_STR), ':o' => array($offre->getOffreurId(), \PDO::PARAM_STR),
':t' => array($offre->getNom(), \PDO::PARAM_STR), ':t' => array($offre->getNom(), \PDO::PARAM_STR),
':d' => array($offre->getDescription(), \PDO::PARAM_STR), ':d' => array($offre->getDescription(), \PDO::PARAM_STR),
'img' => array($offre->getImgId(), \PDO::PARAM_INT), 'img' => array($offre->getImg(), \PDO::PARAM_STR),
'logo' => array($offre->getLogoId(), \PDO::PARAM_INT), 'logo' => array($offre->getLogo(), \PDO::PARAM_STR),
':ty' => array($offre->getTypeContrat(), \PDO::PARAM_STR), ':ty' => array($offre->getTypeContrat(), \PDO::PARAM_STR),
':v' => array($offre->getVille(), \PDO::PARAM_STR), ':v' => array($offre->getVille(), \PDO::PARAM_STR),
':e' => array($offre->getEntreprise(), \PDO::PARAM_STR), ':e' => array($offre->getEntreprise(), \PDO::PARAM_STR),
@ -45,11 +68,11 @@ class OffreGateway
':mail' => array($offre->getMailContact(), \PDO::PARAM_STR), ':mail' => array($offre->getMailContact(), \PDO::PARAM_STR),
':num' => array($offre->getNumero(), \PDO::PARAM_STR), ':num' => array($offre->getNumero(), \PDO::PARAM_STR),
':web' => array($offre->getSiteUrl(), \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 public function getOffers() : array
{ {
$query = 'SELECT * FROM offre'; $query = 'SELECT * FROM offre';

@ -3,7 +3,7 @@ namespace App\metier;
use App\metier\Alumni; use App\metier\Alumni;
use App\metier\Profil; use App\metier\Profil;
use DateTime;
class TypeContrat { class TypeContrat {
const CDI = "CDI"; const CDI = "CDI";
const CDD = "CDD"; const CDD = "CDD";
@ -88,9 +88,11 @@ class Offre
//private \App\metier\NiveauEtudes $niveauEtudes; //private \App\metier\NiveauEtudes $niveauEtudes;
private string $niveauEtudes; private string $niveauEtudes;
private Image $img; private string $img;
private string $logo;
private Image $logo; private DateTime $date;
/** /**
* @var string Email de contact * @var string Email de contact
@ -129,8 +131,8 @@ class Offre
Alumni $offreur, Alumni $offreur,
string $nom, string $nom,
string $description, string $description,
Image $img, string $img,
Image $logo, string $logo,
string $typeContrat, string $typeContrat,
string $ville, string $ville,
string $entreprise, string $entreprise,
@ -138,11 +140,11 @@ class Offre
string $profil, string $profil,
string $experience, string $experience,
string $niveauEtudes, string $niveauEtudes,
//\App\metier\NiveauEtudes $niveauEtudes,
string $mailContact, string $mailContact,
string $numero, string $numero,
string $siteUrl, string $siteUrl,
bool $remote) bool $remote,
DateTime $date)
{ {
$this->id = $id; $this->id = $id;
$this->offreur = $offreur; $this->offreur = $offreur;
@ -161,6 +163,7 @@ class Offre
$this->numero = $numero; $this->numero = $numero;
$this->siteUrl = $siteUrl; $this->siteUrl = $siteUrl;
$this->remote = $remote; $this->remote = $remote;
$this->date = $date;
} }
public function getId(): int public function getId(): int
@ -178,16 +181,11 @@ class Offre
return $this->offreur->getId(); return $this->offreur->getId();
} }
public function getLogo(): Image public function getLogo(): string
{ {
return $this->logo; return $this->logo;
} }
public function setLogo(Image $logo): void
{
$this->logo = $logo;
}
public function getNom(): string public function getNom(): string
{ {
return $this->nom; return $this->nom;
@ -203,24 +201,11 @@ class Offre
return $this->img->getId(); return $this->img->getId();
} }
public function getImg() : Image public function getImg() : string
{ {
return $this->img; return $this->img;
} }
public function getImgId() : int
{
return $this->img->getId();
}
public function getLogoId() : int
{
return $this->logo->getId();
}
public function getBlob() : string
{
return $this->img->getBlob();
}
public function getTypeContrat(): string public function getTypeContrat(): string
{ {
@ -286,4 +271,20 @@ class Offre
{ {
return "Offre :,{$this->nom}, {$this->typeContrat},{$this->ville} {$this->entreprise}"; 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');
}
} }

@ -20,7 +20,7 @@ class OffreModele
$this->offreGw = new OffreGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test")); $this->offreGw = new OffreGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test"));
} }
public function publishOffers(Image $img,Image $logo) public function publishOffers(string $img,string $logo)
{ {
$desc = $_POST["description"]; $desc = $_POST["description"];
$descposte = $_POST["descriptPoste"]; $descposte = $_POST["descriptPoste"];
@ -34,6 +34,7 @@ class OffreModele
$exp = $_POST["choixExp"]; $exp = $_POST["choixExp"];
$typeContrat = $_POST["typeContrat"]; $typeContrat = $_POST["typeContrat"];
$niveauEtudes = $_POST["education"]; $niveauEtudes = $_POST["education"];
$date = new \DateTime();
if(isset($_POST["fullRemote"])) if(isset($_POST["fullRemote"]))
{ {
@ -42,7 +43,7 @@ class OffreModele
else $remote = false; else $remote = false;
// à la place de NULL passer id utilisateur créateur offre // à la place de NULL passer id utilisateur créateur offre
$offre = new Offre($this->offreGw->getMaxid(), $offre = new Offre($this->offreGw->getNewId(),
new Alumni(12,"test.mail@icloud.fr","password","admin"), new Alumni(12,"test.mail@icloud.fr","password","admin"),
$nom, $nom,
$desc, $desc,
@ -58,7 +59,9 @@ class OffreModele
$mail, $mail,
$num, $num,
$site, $site,
$remote); $remote,
$date);
$this->offreGw->addOffers($offre); $this->offreGw->addOffers($offre);
return $offre; return $offre;
@ -83,24 +86,22 @@ class OffreModele
public function CreateOffers($res) : array public function CreateOffers($res) : array
{ {
$alGw = new AlumniGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test")); $alGw = new AlumniGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test"));
$imgGw = new ImageGateway(new Connection("mysql:host=localhost;dbname=dbAlica", "test", "test"));
$offers=[]; $offers=[];
foreach ($res as $row) foreach ($res as $row)
{ {
$imgRaw = $imgGw->getFromId($row['image']);
$logoRaw = $imgGw->getFromId($row['logo']);
$img = new Image(intval($imgRaw[0]["id"]),$imgRaw[0]['nom'], $imgRaw[0]['taille'], $imgRaw[0]['type'], $imgRaw[0]['blob']);
$logo = new Image(intval($logoRaw[0]["id"]),$logoRaw[0]['nom'], $logoRaw[0]['taille'], $logoRaw[0]['type'], $logoRaw[0]['blob']);
$resal = $alGw->ObtenirParId($row['offreur']); $resal = $alGw->ObtenirParId($row['offreur']);
$alumni = new Alumni($resal[0]['id'],$resal[0]['mail'],$resal[0]['mdp'],$resal[0]['role']); $alumni = new Alumni($resal[0]['id'],$resal[0]['mail'],$resal[0]['mdp'],$resal[0]['role']);
$offers[]=new Offre($row['id'], $date = \DateTime::createFromFormat('Y-m-d', $row['date']);
$offers[]=new Offre(
$row['id'],
$alumni, $alumni,
$row['titre'], $row['titre'],
$row['description'], $row['description'],
$img, $row["image"],
$logo, $row["logo"],
$row['typeContrat'], $row['typeContrat'],
$row['ville'], $row['ville'],
$row["entreprise"], $row["entreprise"],
@ -111,15 +112,23 @@ class OffreModele
$row['mailContact'], $row['mailContact'],
$row['numero'], $row['numero'],
$row['websiteURL'], $row['websiteURL'],
$row['remote']); $row['remote'],
$date);
} }
return $offers; return $offers;
} }
public function getOfferLimit($start, $end): array
{
$res = $this->offreGw->getOfferLimit($start, $end);
return $this->CreateOffers($res);
}
public function getNbOffers() : int
{
return $this->offreGw->getNbOffers();
}
} }

@ -116,11 +116,12 @@
<input type="text" class="form-control" id="site" name="site" placeholder="Adresse web" maxlength="40" required> <input type="text" class="form-control" id="site" name="site" placeholder="Adresse web" maxlength="40" required>
</div> </div>
<label for="image">Image</label> <label for="image">Image*</label>
<input type="file" name="image" id="image" required> <input type="file" name="image" id="image" required>
<label for="logo">Logo d'entreprise</label> <label for="logo">Logo d'entreprise*</label>
<input type="file" name="logo" id="logo" required> <input type="file" name="logo" id="logo" required>
<input type="submit" value="Publier L'annonce" name="submit" id="submit"> <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> </form>
</main> </main>

@ -4,6 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Alica - Offres</title> <title>Alica - Offres</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> <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"> <link rel="stylesheet" href="css/offres.css">
</head> </head>
<body> <body>
@ -15,13 +16,13 @@
<h1 id="titrePrincipal">Offres d'emploi</h1> <h1 id="titrePrincipal">Offres d'emploi</h1>
{% for offre in offres %} {% for offre in offres %}
<article> <article >
<div class="row1"> <div class="row1">
<img src="data:image/png;base64,{{ offre.getImg().getBlob() | base64 }}"> <img src="uploads/{{offre.getLogo()}}" class="img-fluid" alt="logo">
<h4>{{ offre.getNom() }}</h4> <h4>{{ offre.getNom() }}</h4>
</div> </div>
<div class="row2"> <div class="row2">
<p class="authorDate"><strong>Julien Martin | 15/11/23</strong></p> <p class="authorDate"><strong>Julien Martin | {{ offre.getDateStringFr()}}</strong></p>
<p>{{ offre.getDescription() }}</p> <p>{{ offre.getDescription() }}</p>
</div> </div>
@ -35,9 +36,29 @@
</article> </article>
{% endfor %} {% endfor %}
<nav style="text-align: center;">
{% if numberPages is defined %}
{% if currentPage is defined %}
{% for i in 1..numberPages %}
{% if i == currentPage %}
<a href="index.php?action=consultOffers&page={{i}}" class="active bg-danger">{{ i }}</a>
{% else %}
<a href="index.php?action=consultOffers&page={{i}}">{{ i }}</a>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
</nav>
</div> </div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<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://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> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body> </body>

@ -19,7 +19,7 @@
<li class="list-group-item">Description: {{ offre.getDescription() }}</li> <li class="list-group-item">Description: {{ offre.getDescription() }}</li>
<li class="list-group-item">Type de contrat: {{ offre.getTypeContrat() }}</li> <li class="list-group-item">Type de contrat: {{ offre.getTypeContrat() }}</li>
<li class="list-group-item">Ville: {{ offre.getVille() }}</li> <li class="list-group-item">Ville: {{ offre.getVille() }}</li>
<!-- Ajoutez d'autres propriétés ici en utilisant les classes Bootstrap --> <li class="list-group-item">Date de publication: {{ offre.getDateString() }}</li>
</ul> </ul>
</div> </div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>

@ -21,7 +21,6 @@
<p>{{value}}</p> <p>{{value}}</p>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
<form action="../public/index.php" method="POST"> <form action="../public/index.php" method="POST">
<input type="submit" value="Retourner à l'accueil"> <input type="submit" value="Retourner à l'accueil">
</form> </form>

@ -34,7 +34,7 @@
<div class="container mt-4"> <div class="container mt-4">
<h1 id="titrePrincipal">Offres d'emploi</h1> <h1 id="titrePrincipal">Offres d'emploi</h1>
{% for offre in offres %} {% for offre in offers %}
<div class="offre-container"> <div class="offre-container">
<div class="row"> <div class="row">
<!-- Première ligne --> <!-- Première ligne -->
@ -70,6 +70,15 @@
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
{% if pages is defined %}
{% for page in pages %}
<a href="index.php?action=displayOffers&page={{page}}">{{page}}</a>
{% endfor %}
{% endif %}
</div> </div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>

Loading…
Cancel
Save