Ajout de la modifications des XP/Projets en admin (fonctionnel)

This commit is contained in:
Esteban
2026-06-05 16:43:04 +02:00
parent c582f68c1d
commit 0cc9abb92f
10 changed files with 419 additions and 42 deletions
+69 -1
View File
@@ -11,7 +11,7 @@ function listeProjets() {
// Essayer
try {
// Requête SQL qui récupère titre, tags, description, image_url
$stmt = $dbh->prepare('SELECT title, tags, description, image_url FROM projects');
$stmt = $dbh->prepare('SELECT id, title, tags, description, image_url FROM projects ORDER BY id DESC');
// Execution de la requête SQL
$stmt->execute();
// Retourne toutes les données collectés dans un ARRAY
@@ -22,6 +22,22 @@ function listeProjets() {
}
}
// Fonction qui permet de récupérer les projets par id et donc de modifier une xp en particulier en ciblant l'id
function recupererProjetParId($id) {
global $dbh;
try {
$stmt = $dbh->prepare('SELECT id, title, tags, description, image_url FROM projects WHERE id = :id');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
// En cas d'erreur retourner false et envoyer un message d'erreur avec l'erreur
} catch (PDOException $e) {
die("Erreur de connexion à la base de donnée portfolio :" . $e->getMessage());
return false;
}
}
// Fonction qui va afficher les projets
function afficherProjets() {
// Récupération de la liste des projets
@@ -75,3 +91,55 @@ function afficherProjets() {
echo '</div>';
}
// Fonction identique à celle en haut mais ajout de bouton
function afficherProjetsAdmin() {
$projets = listeProjets();
echo '<div class="projects-list">';
foreach ($projets as $projet) {
$id = (int) $projet['id'];
$titre = htmlspecialchars($projet['title']);
$description = nl2br(htmlspecialchars($projet['description']));
$image = htmlspecialchars($projet['image_url']);
$tags = [];
if (!empty($projet['tags'])) {
$tags = array_filter(array_map('trim', explode(',', $projet['tags'])));
}
echo '<article class="project-card">';
if (!empty($image)) {
echo '<div class="project-banner">';
echo '<img src="' . $image . '" alt="Image du projet ' . $titre . '">';
echo '</div>';
}
echo '<div class="project-content">';
echo '<h2>' . $titre . '</h2>';
if (!empty($tags)) {
echo '<div class="project-tags">';
foreach ($tags as $tag) {
echo '<span class="tag">' . htmlspecialchars($tag) . '</span>';
}
echo '</div>';
}
echo '<p>' . $description . '</p>';
// Boutons qui vont permettrent la modification / Suppresion
echo '<div class="admin-actions">';
echo '<a class="btn-submit btn-edit" href="./admin.php?edit_project=' . $id . '">Modifier</a>';
echo '<a class="btn-submit btn-delete" href="../scripts/removeProject.php?id=' . $id . '" onclick="return confirm(\'Voulez-vous vraiment supprimer ce projet ?\');">Supprimer</a>';
echo '</div>';
echo '</div>';
echo '</article>';
}
echo '</div>';
}
+73 -1
View File
@@ -14,7 +14,7 @@ function listeXP() {
// 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');
$stmt = $dbh->prepare('SELECT id, 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
@@ -25,6 +25,23 @@ function listeXP() {
}
}
// Fonction qui permet de récupérer les experiences par id et donc de modifier une xp en particulier en ciblant l'id
function recupererXPParId($id) {
global $dbh;
try {
// Préparation de la requête préparée
$stmt = $dbh->prepare('SELECT id, title, xptype, tags, description, duration, image_url FROM experiences WHERE id = :id');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
// En cas d'erreur => renvoyer un message avec l'erreur
} catch (PDOException $e) {
die("Erreur de connexion à la base de donnée portfolio :" . $e->getMessage());
// Retourner false en cas d'eerreur
return false;
}
}
// Fonction qui va afficher les experiences
function afficherXP() {
@@ -91,5 +108,60 @@ function afficherXP() {
}
echo '</div>';
}
// Fonction identique à celle en haut mais ajout de bouton
function afficherXPAdmin() {
$experiences = listeXP();
echo '<div class="projects-list">';
foreach ($experiences as $experience) {
$id = (int) $experience['id'];
$titre = htmlspecialchars($experience['title']);
$xptype = htmlspecialchars($experience['xptype']);
$description = nl2br(htmlspecialchars($experience['description']));
$duration = htmlspecialchars($experience['duration']);
$image = htmlspecialchars($experience['image_url']);
$tags = [];
if (!empty($experience['tags'])) {
$tags = array_filter(array_map('trim', explode(',', $experience['tags'])));
}
echo '<article class="project-card">';
if (!empty($image)) {
echo '<div class="project-banner">';
echo '<img src="' . $image . '" alt="Image de l experience ' . $titre . '">';
echo '</div>';
}
echo '<div class="project-content">';
echo '<h2>' . $titre . '</h2>';
echo '<p><strong>Type :</strong> ' . $xptype . '</p>';
echo '<p><strong>Durée :</strong> ' . $duration . '</p>';
if (!empty($tags)) {
echo '<div class="project-tags">';
foreach ($tags as $tag) {
echo '<span class="tag">' . htmlspecialchars($tag) . '</span>';
}
echo '</div>';
}
echo '<p>' . $description . '</p>';
// Boutons qui vont permettrent la modification / Suppresion
echo '<div class="admin-actions">';
echo '<a class="btn-submit btn-edit" href="./admin.php?edit_xp=' . $id . '">Modifier</a>';
echo '<a class="btn-submit btn-delete" href="../scripts/removeXP.php?id=' . $id . '" onclick="return confirm(\'Voulez-vous vraiment supprimer cette expérience ?\');">Supprimer</a>';
echo '</div>';
echo '</div>';
echo '</article>';
}
echo '</div>';
}
+53 -23
View File
@@ -5,82 +5,112 @@ require_once('./../elements/header.php');
// Ajout de la base de donnée
require_once '../functions/databaseConnection.php';
require_once('../functions/listProject.php');
require_once('../functions/listXP.php');
// L'utilisateur doit être administrateur
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Location: ../pages/home.php');
exit;
}
// On met les variables à null ici pour éviter qu'il garde les options en premier chargement
$projetAModifier = null;
$xpAModifier = null;
// Si on modifie XP ou Projets
if (isset($_GET['edit_project']) && is_numeric($_GET['edit_project'])) {
$projetAModifier = recupererProjetParId((int) $_GET['edit_project']);
}
if (isset($_GET['edit_xp']) && is_numeric($_GET['edit_xp'])) {
$xpAModifier = recupererXPParId((int) $_GET['edit_xp']);
}
// Page du panneau d'administration
?>
<?php if (isset($message)) { echo "<p style='color: white; text-align: center;'>$message</p>"; } ?>
<div class="admin-forms">
<!-- Formulaire de création de projet -->
<div class="project-container">
<div class="project-form-card">
<div class="project-header">
<h2>Nouveau projet</h2>
<h2><?php echo $projetAModifier ? 'Modifier le projet' : 'Nouveau projet'; ?></h2>
</div>
<!-- en envoie les données à addProject.php -->
<form method="POST" action="../scripts/addProject.php">
<form method="POST" action="<?php echo $projetAModifier ? '../scripts/updateProject.php' : '../scripts/addProject.php'; ?>">
<?php if ($projetAModifier): ?>
<input type="hidden" name="id" value="<?php echo (int) $projetAModifier['id']; ?>">
<?php endif; ?>
<label>Titre *</label>
<input type="text" name="title" required>
<input type="text" name="title" required value="<?php echo $projetAModifier ? htmlspecialchars($projetAModifier['title']) : ''; ?>">
<label>Tags (virgules)</label>
<input type="text" name="tags">
<input type="text" name="tags" value="<?php echo $projetAModifier ? htmlspecialchars($projetAModifier['tags']) : ''; ?>">
<label>Description *</label>
<textarea name="description" required></textarea>
<textarea name="description" required><?php echo $projetAModifier ? htmlspecialchars($projetAModifier['description']) : ''; ?></textarea>
<label>Lien de l'image *</label>
<!-- URL Pour un potentiel Lien image/CDN -->
<input type="url" name="image_url" placeholder="https://..." required>
<input type="url" name="imageurl" placeholder="https://..." required value="<?php echo $projetAModifier ? htmlspecialchars($projetAModifier['image_url']) : ''; ?>">
<!-- Le bouton qui déclenche le PHP en haut de page -->
<input type="submit" name="submit_project" value="+ Ajouter le projet" class="btn-submit">
<input type="submit" name="submitproject" value="<?php echo $projetAModifier ? 'Modifier le projet' : '+ Ajouter le projet'; ?>" class="btn-submit">
</form>
</div>
</div>
<!-- Formulaire de création d'expérience -->
<div class="project-container">
<div class="project-form-card">
<div class="project-header">
<h2>Nouvelle expérience</h2>
<h2><?php echo $xpAModifier ? 'Modifier l\'experience' : 'Nouvelle expérience'; ?></h2>
</div>
<!-- en envoie les données à addXP.php -->
<form method="POST" action="../scripts/addXP.php">
<form method="POST" action="<?php echo $xpAModifier ? '../scripts/updateXP.php' : '../scripts/addXP.php'; ?>">
<?php if ($xpAModifier): ?>
<input type="hidden" name="id" value="<?php echo (int) $xpAModifier['id']; ?>">
<?php endif; ?>
<label>Titre *</label>
<input type="text" name="title" required>
<input type="text" name="title" required value="<?php echo $xpAModifier ? htmlspecialchars($xpAModifier['title']) : ''; ?>">
<!-- type : stage alternance ou autre -->
<label>Type *</label>
<textarea name="xptype" required></textarea>
<textarea name="xptype" required><?php echo $xpAModifier ? htmlspecialchars($xpAModifier['xptype']) : ''; ?></textarea>
<label>Tags (virgules)</label>
<input type="text" name="tags">
<input type="text" name="tags" value="<?php echo $xpAModifier ? htmlspecialchars($xpAModifier['tags']) : ''; ?>">
<label>Description *</label>
<textarea name="description" required></textarea>
<textarea name="description" required><?php echo $xpAModifier ? htmlspecialchars($xpAModifier['description']) : ''; ?></textarea>
<!-- durée par exemple date - 2 semaines -->
<label>Durée *</label>
<textarea name="duration" required></textarea>
<textarea name="duration" required><?php echo $xpAModifier ? htmlspecialchars($xpAModifier['duration']) : ''; ?></textarea>
<label>Lien de l'image *</label>
<!-- URL Pour un potentiel Lien image/CDN -->
<input type="url" name="image_url" placeholder="https://..." required>
<input type="url" name="imageurl" placeholder="https://..." required value="<?php echo $xpAModifier ? htmlspecialchars($xpAModifier['image_url']) : ''; ?>">
<!-- Le bouton qui déclenche le PHP en haut de page -->
<input type="submit" name="submit_xp" value="+ Ajouter l'experience" class="btn-submit">
<input type="submit" name="submitxp" value="<?php echo $xpAModifier ? 'Modifier l\'experience' : '+ Ajouter l\'experience'; ?>" class="btn-submit">
</form>
</div>
</div>
</div>
<?php
// Liste des projets / xps => en gros on pourra supprimer, et modifier à la vollée sans aller dans la bdd
?>
<h2 class="projects-title">Gérer les projets</h2>
<?php afficherProjetsAdmin(); ?>
<h2 class="projects-title">Gérer les experiences</h2>
<?php afficherXPAdmin(); ?>
+4
View File
@@ -6,6 +6,10 @@
// On ajoute le header
require_once('../elements/header.php');
// Ajout d'un message indiquant si l'utilisateur est admin qu'il peut modifier ces projets
if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin') {
echo "<p style='color: white; text-align: center;'>Vous êtes administrateur, vous pouvez modifier les projets <a href='/admin.php'>ici</a>.</p>";
}
// Affichages des projets
?>
+5
View File
@@ -5,6 +5,11 @@
// On ajoute le header
require_once('../elements/header.php');
// Ajout d'un message indiquant si l'utilisateur est admin qu'il peut modifier ces expériences
if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin') {
echo "<p style='color: white; text-align: center;'>Vous êtes administrateur, vous pouvez modifier les experiences <a href='/admin.php'>ici</a>.</p>";
}
// Affichages des projets
?>
+31
View File
@@ -0,0 +1,31 @@
<?php
// On démarre la session
session_start();
// On ajoute la DB
require_once('../functions/databaseConnection.php');
// Si l'utilisateur n'est pas admin il ne peut pas executer le reste du script
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Location: ../pages/home.php');
exit;
}
//L'id doit être collecté sinon l'utilisateur ne peux pas executer le reste du script
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
header('Location: ../pages/admin.php');
exit;
}
// On collecte l'id et on le met en variable locale
$id = (int) $_GET['id'];
try { // On essaie d'executer une requête qui est préparée
$stmt = $dbh->prepare('DELETE FROM projects WHERE id = :id');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute(); // Sinon on renvoie l'erreur
} catch (PDOException $e) {
die("Erreur lors de la suppression du projet :" . $e->getMessage());
}
// On renvoie l'utilisateur sur admin.php
header('Location: ../pages/admin.php');
exit;
+31
View File
@@ -0,0 +1,31 @@
<?php
// On démarre la session
session_start();
// On ajoute la DB
require_once('../functions/databaseConnection.php');
// Si l'utilisateur n'est pas admin il ne peut pas executer le reste du script
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Location: ../pages/home.php');
exit;
}
//L'id doit être collecté sinon l'utilisateur ne peux pas executer le reste du script
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
header('Location: ../pages/admin.php');
exit;
}
// On collecte l'id et on le met en variable locale
$id = (int) $_GET['id'];
try { // On essaie d'executer une requête qui est préparée
$stmt = $dbh->prepare('DELETE FROM experiences WHERE id = :id');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute(); // Sinon on renvoie l'erreur
} catch (PDOException $e) {
die("Erreur lors de la suppression de l experience :" . $e->getMessage());
}
// On renvoie l'utilisateur sur admin.php
header('Location: ../pages/admin.php');
exit;
+47
View File
@@ -0,0 +1,47 @@
<?php
// On démarre la session
session_start();
// On ajoute la DB
require_once('../functions/databaseConnection.php');
// Si l'utilisateur n'est pas admin il ne peut pas executer le reste du script
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Location: ../pages/home.php');
exit;
}
if ( // Si les champs sont vides on renvoie vers admin.php
!isset($_POST['id']) || !is_numeric($_POST['id']) ||
empty($_POST['title']) ||
empty($_POST['description']) ||
empty($_POST['imageurl'])
) {
header('Location: ../pages/admin.php');
exit;
}
// On récupère les données pour les mettres en variables locales
$id = (int) $_POST['id'];
$title = trim($_POST['title']);
$tags = trim($_POST['tags'] ?? '');
$description = trim($_POST['description']);
$imageurl = trim($_POST['imageurl']);
try { // On essaie d'executer une requête qui est préparée
$stmt = $dbh->prepare('
UPDATE projects
SET title = :title, tags = :tags, description = :description, image_url = :image_url
WHERE id = :id
');
$stmt->bindValue(':title', $title, PDO::PARAM_STR);
$stmt->bindValue(':tags', $tags, PDO::PARAM_STR);
$stmt->bindValue(':description', $description, PDO::PARAM_STR);
$stmt->bindValue(':image_url', $imageurl, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute(); // Sinon on renvoie l'erreur
} catch (PDOException $e) {
die("Erreur lors de la modification du projet :" . $e->getMessage());
}
// On renvoie l'utilisateur sur admin.php
header('Location: ../pages/admin.php');
exit;
+54
View File
@@ -0,0 +1,54 @@
<?php
// On démarre la session
session_start();
// On ajoute la DB
require_once('../functions/databaseConnection.php');
// Si l'utilisateur n'est pas admin il ne peut pas executer le reste du script
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Location: ../pages/home.php');
exit;
}
// Si le formulaire à un champ vide
if (
!isset($_POST['id']) || !is_numeric($_POST['id']) ||
empty($_POST['title']) ||
empty($_POST['xptype']) ||
empty($_POST['description']) ||
empty($_POST['duration']) ||
empty($_POST['imageurl'])
) { // On renvoie sur admin.php
header('Location: ../pages/admin.php');
exit;
}
//On récupère les données pour les mettres en variables locales
$id = (int) $_POST['id'];
$title = trim($_POST['title']);
$xptype = trim($_POST['xptype']);
$tags = trim($_POST['tags'] ?? '');
$description = trim($_POST['description']);
$duration = trim($_POST['duration']);
$imageurl = trim($_POST['imageurl']);
try { // On essaie d'executer une requête qui est préparée
$stmt = $dbh->prepare('
UPDATE experiences
SET title = :title, xptype = :xptype, tags = :tags, description = :description, duration = :duration, image_url = :image_url
WHERE id = :id
');
$stmt->bindValue(':title', $title, PDO::PARAM_STR);
$stmt->bindValue(':xptype', $xptype, PDO::PARAM_STR);
$stmt->bindValue(':tags', $tags, PDO::PARAM_STR);
$stmt->bindValue(':description', $description, PDO::PARAM_STR);
$stmt->bindValue(':duration', $duration, PDO::PARAM_STR);
$stmt->bindValue(':image_url', $imageurl, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute(); // Sinon on renvoie l'erreur
} catch (PDOException $e) {
die("Erreur lors de la modification de l experience :" . $e->getMessage());
}
// On renvoie l'utilisateur sur admin.php
header('Location: ../pages/admin.php');
exit;
+37 -2
View File
@@ -38,6 +38,11 @@ nav a {
border-radius: 8px;
}
nav a:hover {
background-color: #1a1a24;
color: white;
}
/* ---- PAGE LOGIN ---- */
/* Centre la carte au milieu de la page */
@@ -117,7 +122,7 @@ nav a {
.project-container {
display: flex;
justify-content: center;
padding: 40px 20px;
padding: 10px 20px;
}
.project-form-card {
@@ -126,10 +131,12 @@ nav a {
border-radius: 12px;
padding: 30px;
width: 800px;
max-width: 100%;
}
.project-header h2 {
margin-top: 0;
margin-bottom: 20px;
font-size: 20px;
display: flex;
align-items: center;
@@ -173,10 +180,12 @@ nav a {
border-radius: 6px;
color: white;
padding: 12px;
margin-bottom: 16px;
box-sizing: border-box;
}
.project-card textarea {
/* Correction ici : project-form-card au lieu de project-card */
.project-form-card textarea {
min-height: 100px;
resize: vertical;
}
@@ -279,3 +288,29 @@ nav a {
font-size: 13px;
font-weight: bold;
}
/* ---- Panel admin ---- */
.admin-actions {
display: flex;
gap: 12px;
margin-top: 20px;
flex-wrap: wrap;
}
.admin-actions .btn-submit {
display: inline-block;
text-decoration: none;
}
.btn-edit {
background-color: #6c63ff;
}
.btn-delete {
background-color: #a12c2f;
}
.btn-delete:hover {
background-color: #7e2023;
}