Ajout des experiences pro (fonctionnel)
This commit is contained in:
@@ -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
@@ -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'])){
|
||||
|
||||
@@ -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
|
||||
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') {
|
||||
|
||||
@@ -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