Ajout des experiences pro (fonctionnel)

This commit is contained in:
Esteban
2026-06-03 18:32:59 +02:00
parent 4eeb0d7dfc
commit 2e3ac1718b
6 changed files with 237 additions and 3 deletions
+13
View File
@@ -34,6 +34,19 @@ CREATE TABLE IF NOT EXISTS projects (
PRIMARY KEY (id)
);
-- Création de la table projects : (Généré par Beekeeper Studio)
CREATE TABLE IF NOT EXISTS experiences (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
xptype VARCHAR(100) NOT NULL,
tags VARCHAR(255) NULL,
description TEXT NOT NULL,
duration VARCHAR(100) NOT NULL,
image_url VARCHAR(255) NOT NULL, -- Stockage de l'image par URL (exemple : par CDN)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
-- Compte de test
INSERT INTO users (username, password, role)
VALUES ('admin', 'admin', 'admin');
+4 -2
View File
@@ -7,10 +7,11 @@
// Ajout ici d'un démarrage de session : header étant dans toutes les pages
session_start();
// Ajout du CSS Primaire (fait par IA)
?>
<!-- Ajout du CSS Primaire (fait par IA) -->
<link rel="stylesheet" href="../styles/primary_css.css">
@@ -23,6 +24,7 @@ session_start();
<nav>
<a href="./../index.php">Accueil</a>
<a href="./projects.php">Projets</a>
<a href="./xp.php">Expériences</a>
<a href="./contact.php">Contact</a>
<?php
if (isset($_SESSION['user_id'])){
+95
View File
@@ -0,0 +1,95 @@
<?php
// Ajout de connexion a la bdd
require_once('../functions/databaseConnection.php');
// Fonction qui va faire une requête SQL afin de collecter toutes les experiences
function listeXP() {
// Préparation de la variable
global $dbh;
// Essayer
try {
// Requête SQL qui récupère titre, type, tags, description, durée, image_url
$stmt = $dbh->prepare('SELECT title, xptype, tags, description, duration, image_url FROM experiences ORDER BY id DESC');
// Execution de la requête SQL
$stmt->execute();
// Retourne toutes les données collectés dans un ARRAY
return $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) { // En cas d'erreur
die("Erreur de connexion à la base de donnée portfolio :".$e->getMessage());
return [];
}
}
// Fonction qui va afficher les experiences
function afficherXP() {
// Récupération de la liste des experiences
$experiences = listeXP();
// Ajout de la class pour la liste des experiences FUTUR CSS
echo '<div class="projects-list">';
// Pour chaque experience dans le ARRAY
foreach ($experiences as $experience) {
// On récupère le titre, le type, la description, la durée et l'image et le tableau avec les tags
$titre = htmlspecialchars($experience['title']);
$xptype = htmlspecialchars($experience['xptype']);
$description = nl2br(htmlspecialchars($experience['description']));
$duration = htmlspecialchars($experience['duration']);
$image = htmlspecialchars($experience['image_url']);
$tags = [];
// S'il y a des tags alors on les sépares grâce à la virgule que l'user à ajouté dans le champs (tags1,tags2,etcc...)
if (!empty($experience['tags'])) {
$tags = array_filter(array_map('trim', explode(',', $experience['tags'])));
}
echo '<article class="project-card">';
// Si la donnée avec l'image n'est pas null alors on l'affiche
if (!empty($image)) {
echo '<div class="project-banner">';
echo '<img src="' . $image . '" alt="Image de l experience ' . $titre . '">';
echo '</div>';
}
// Ajout de la class project-content et du titre
echo '<div class="project-content">';
echo '<h2>' . $titre . '</h2>';
echo '<p><strong>Type :</strong> ' . $xptype . '</p>';
echo '<p><strong>Durée :</strong> ' . $duration . '</p>';
// Si les tags ne sont pas vides alors afficher
if (!empty($tags)) {
echo '<div class="project-tags">';
foreach ($tags as $tag) {
echo '<span class="tag">' . htmlspecialchars($tag) . '</span>';
}
echo '</div>';
}
// Ajout de la description et fin des classes
echo '<p>' . $description . '</p>';
echo '</div>';
echo '</article>';
}
echo '</div>';
}
+68
View File
@@ -0,0 +1,68 @@
<?php
// Page affichant les différentes expériences pro (stages etc...)
// On ajoute le header
require_once('../elements/header.php');
// On vérifie si l'utilisateur est admin avant d'afficher le formulaire
if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin') { ?>
<!-- Message de confirmation que l'experience à été créer -->
<?php if (isset($message)) { echo "<p style='color: white; text-align: center;'>$message</p>"; } ?>
<!-- Formulaire de création de l'experience -->
<!-- J'ai récupéré le CSS de projets par pur flemme -->
<div class="project-container">
<div class="project-form-card">
<div class="project-header">
<h2>Nouvelle expérience</h2>
</div>
<!-- en envoie les données à addXP.php -->
<form method="POST" action="../scripts/addXP.php">
<label>Titre *</label>
<input type="text" name="title" required>
<!-- type : stage alternance ou autre -->
<label>Type *</label>
<textarea name="xptype" required></textarea>
<label>Tags (virgules)</label>
<input type="text" name="tags">
<label>Description *</label>
<textarea name="description" required></textarea>
<!-- durée par exemple date - 2 semaines -->
<label>Durée *</label>
<textarea name="duration" required></textarea>
<label>Lien de l'image *</label>
<!-- URL Pour un potentiel Lien image/CDN -->
<input type="url" name="image_url" placeholder="https://..." required>
<!-- Le bouton qui déclenche le PHP en haut de page -->
<input type="submit" name="submit_xp" value="+ Ajouter l'experience" class="btn-submit">
</form>
</div>
</div>
<?php }
// Affichages des projets
?>
<p class="projects-title">Liste des expériences professionnelles</p>
<?php
require_once('../functions/listXP.php');
// Appel de ma fonction dans Functions/listXP.php
afficherXP();
?>
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
session_start();
require_once 'databaseConnection.php';
require_once '../functions/databaseConnection.php';
// Pour faire cette fonction l'utilisateur doit être administrateur
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
+56
View File
@@ -0,0 +1,56 @@
<?php
session_start();
require_once '../functions/databaseConnection.php';
// Pour faire cette fonction l'utilisateur doit être administrateur
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Location: ../pages/home.php');
exit;
}
// La requête doit être un POST sinon on l'a refuse
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Récupération des données dans la requete POST
$title = $_POST['title'] ?? '';
$xptype = $_POST['xptype'] ?? '';
$tags = $_POST['tags'] ?? '';
$description = $_POST['description'] ?? '';
$duration = $_POST['duration'] ?? '';
$image_url = $_POST['image_url'] ?? '';
// On vérifie que les champs obligatoires ne sont pas vide
if (!empty($title) && !empty($description) && !empty($image_url)) {
try {
// On prépare la requête SQL pour insérer la nouvelle experience
$stmt = $dbh->prepare('INSERT INTO experiences (title, xptype, tags, description, duration, image_url) VALUES (:title, :xptype, :tags, :description, :duration, :image_url)');
// On execute la requete préparée
$stmt->execute([
':title' => $title,
':xptype' => $xptype,
':tags' => $tags,
':description' => $description,
':duration' => $duration,
':image_url' => $image_url
]);
// Redirection vers xp.php ds que la requete est executée
header('Location: ../pages/xp.php');
exit;
} catch (PDOException $e) {
// En cas d'erreur :
echo "Erreur pendant l'ajout de l'experience : " . $e->getMessage();
exit;
}
} else {
echo "Veuillez remplir tous les champs obligatoires.";
exit;
}
} else {
// Si on y accède de façon peu légitime sans requête POST on refuse
header('Location: ../pages/xp.php');
exit;
}
?>