Files
2026-07-03 02:02:13 +02:00

192 lines
7.2 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 tous les projets
function listeProjets() {
// 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 project_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 de projets
$stmt = $dbh->prepare('
SELECT p.id, p.title, p.status, p.tags, p.description, p.image_url, p.markdown, p.link_url, p.created_at,
pp.pdf_filename
FROM projects p
LEFT JOIN project_pdfs pp ON pp.project_id = p.id
ORDER BY p.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 projets par id et donc de modifier une xp en particulier en ciblant l'id
function recupererProjetParId($id) {
global $dbh;
try {
// Même principe que listeProjets() : le PDF est joint pour son nom de fichier
// uniquement, jamais son contenu binaire
$stmt = $dbh->prepare('
SELECT p.id, p.title, p.status, p.tags, p.description, p.image_url, p.markdown, p.link_url, p.created_at,
pp.pdf_filename
FROM projects p
LEFT JOIN project_pdfs pp ON pp.project_id = p.id
WHERE p.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
$projets = listeProjets();
// Ajout de la class pour la liste des projets FUTUR CSS
echo '<div class="projects-list">';
// Pour chaque projet dans le ARRAY
foreach ($projets as $projet) {
// On récupère le titre, la description et l'image et le tableau avec les tags
$id = (int) $projet['id'];
$titre = htmlspecialchars($projet['title']);
$description = nl2br(htmlspecialchars($projet['description']));
$image = htmlspecialchars($projet['image_url']);
$status = htmlspecialchars($projet['status'] ?? '');
$markdown = trim($projet['markdown'] ?? '');
$lien = trim($projet['link_url'] ?? '');
$pdf = trim($projet['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($projet['tags'])) {
$tags = array_filter(array_map('trim', explode(',', $projet['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 du projet ' . $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>';
// 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=projet&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=projet&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 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']);
$status = htmlspecialchars($projet['status'] ?? '');
$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 . '">';
if (!empty($status)) {
echo '<div class="project-state">' . $status . '</div>';
}
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 . '#admin-projets">Modifier</a>';
echo '<a class="btn-submit btn-delete" href="../scripts/removeProject.php?id=' . $id . '&csrf_token=' . urlencode(csrfToken()) . '" onclick="return confirm(\'Voulez-vous vraiment supprimer ce projet ?\');">Supprimer</a>';
echo '</div>';
echo '</div>';
echo '</article>';
}
echo '</div>';
}