220 lines
8.0 KiB
PHP
220 lines
8.0 KiB
PHP
<?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 {
|
|
// On liste les colonnes explicitement (pas de SELECT *) : le PDF (pdf_data) est
|
|
// stocké à part dans experience_pdfs (voir migration Juillet 2026 (6)), on ne
|
|
// récupère ici que son nom de fichier via LEFT JOIN, sans jamais charger son contenu
|
|
// binaire (jusqu'à 15 Mo par PDF) en mémoire pour une simple liste d'expériences
|
|
$stmt = $dbh->prepare('
|
|
SELECT e.id, e.title, e.status, e.xptype, e.tags, e.description, e.duration, e.image_url, e.markdown, e.link_url, e.created_at,
|
|
ep.pdf_filename
|
|
FROM experiences e
|
|
LEFT JOIN experience_pdfs ep ON ep.experience_id = e.id
|
|
ORDER BY e.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 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 {
|
|
// Même principe que listeXP() : le PDF est joint pour son nom de fichier
|
|
// uniquement, jamais son contenu binaire
|
|
$stmt = $dbh->prepare('
|
|
SELECT e.id, e.title, e.status, e.xptype, e.tags, e.description, e.duration, e.image_url, e.markdown, e.link_url, e.created_at,
|
|
ep.pdf_filename
|
|
FROM experiences e
|
|
LEFT JOIN experience_pdfs ep ON ep.experience_id = e.id
|
|
WHERE e.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() {
|
|
// 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
|
|
$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']);
|
|
$status = htmlspecialchars($experience['status'] ?? '');
|
|
$markdown = trim($experience['markdown'] ?? '');
|
|
$lien = trim($experience['link_url'] ?? '');
|
|
$pdf = trim($experience['pdf_filename'] ?? '');
|
|
$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 . '">';
|
|
|
|
if (!empty($status)) {
|
|
echo '<div class="project-state">' . $status . '</div>';
|
|
}
|
|
|
|
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>';
|
|
|
|
// Indicateur de page détaillée : markdown > PDF > lien externe > rien
|
|
// Le lien rend toute la carte cliquable (voir CSS .card-link)
|
|
if ($markdown !== '') {
|
|
echo '<a class="card-link" href="./details.php?type=experience&id=' . $id . '"><i class="fa-solid fa-file-lines"></i> Voir la page détaillée</a>';
|
|
} elseif ($pdf !== '') {
|
|
echo '<a class="card-link" href="./details.php?type=experience&id=' . $id . '"><i class="fa-solid fa-file-pdf"></i> Voir le PDF</a>';
|
|
} elseif ($lien !== '') {
|
|
echo '<a class="card-link" href="' . $lien . '" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-arrow-up-right-from-square"></i> Voir le lien externe</a>';
|
|
} else {
|
|
echo '<span class="card-link card-link-none"><i class="fa-solid fa-eye-slash"></i> Pas de page détaillée</span>';
|
|
}
|
|
|
|
echo '</div>';
|
|
|
|
|
|
echo '</article>';
|
|
}
|
|
|
|
|
|
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']);
|
|
$status = htmlspecialchars($experience['status'] ?? '');
|
|
$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 . '">';
|
|
|
|
if (!empty($status)) {
|
|
echo '<div class="project-state">' . $status . '</div>';
|
|
}
|
|
|
|
echo '</div>';
|
|
}
|
|
|
|
echo '<div class="project-content">';
|
|
echo '<h2>' . $titre . '</h2>';
|
|
|
|
// Si le status n'est pas vide alors on l'affiche
|
|
if (!empty($status)) {
|
|
echo '<div class="project-state">' . $status . '</div>';
|
|
}
|
|
|
|
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 . '#admin-experiences">Modifier</a>';
|
|
echo '<a class="btn-submit btn-delete" href="../scripts/removeXP.php?id=' . $id . '&csrf_token=' . urlencode(csrfToken()) . '" onclick="return confirm(\'Voulez-vous vraiment supprimer cette expérience ?\');">Supprimer</a>';
|
|
echo '</div>';
|
|
|
|
echo '</div>';
|
|
echo '</article>';
|
|
}
|
|
|
|
echo '</div>';
|
|
} |