Ajout des experiences pro (fonctionnel)
This commit is contained in:
@@ -34,6 +34,19 @@ CREATE TABLE IF NOT EXISTS projects (
|
|||||||
PRIMARY KEY (id)
|
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
|
-- Compte de test
|
||||||
INSERT INTO users (username, password, role)
|
INSERT INTO users (username, password, role)
|
||||||
VALUES ('admin', 'admin', 'admin');
|
VALUES ('admin', 'admin', 'admin');
|
||||||
+4
-2
@@ -7,10 +7,11 @@
|
|||||||
|
|
||||||
// Ajout ici d'un démarrage de session : header étant dans toutes les pages
|
// Ajout ici d'un démarrage de session : header étant dans toutes les pages
|
||||||
session_start();
|
session_start();
|
||||||
|
|
||||||
|
|
||||||
|
// Ajout du CSS Primaire (fait par IA)
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|
||||||
<!-- Ajout du CSS Primaire (fait par IA) -->
|
|
||||||
<link rel="stylesheet" href="../styles/primary_css.css">
|
<link rel="stylesheet" href="../styles/primary_css.css">
|
||||||
|
|
||||||
|
|
||||||
@@ -23,6 +24,7 @@ session_start();
|
|||||||
<nav>
|
<nav>
|
||||||
<a href="./../index.php">Accueil</a>
|
<a href="./../index.php">Accueil</a>
|
||||||
<a href="./projects.php">Projets</a>
|
<a href="./projects.php">Projets</a>
|
||||||
|
<a href="./xp.php">Expériences</a>
|
||||||
<a href="./contact.php">Contact</a>
|
<a href="./contact.php">Contact</a>
|
||||||
<?php
|
<?php
|
||||||
if (isset($_SESSION['user_id'])){
|
if (isset($_SESSION['user_id'])){
|
||||||
|
|||||||
@@ -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>';
|
||||||
|
}
|
||||||
@@ -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,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
session_start();
|
session_start();
|
||||||
require_once 'databaseConnection.php';
|
require_once '../functions/databaseConnection.php';
|
||||||
|
|
||||||
// Pour faire cette fonction l'utilisateur doit être administrateur
|
// Pour faire cette fonction l'utilisateur doit être administrateur
|
||||||
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
|
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
?>
|
||||||
Reference in New Issue
Block a user