From 5b37d2bcd844ceb4c39301f23d867755ccd27b39 Mon Sep 17 00:00:00 2001 From: julien Date: Mon, 9 Mar 2026 15:31:16 +0100 Subject: [PATCH] Added slug db column --- public/index.php | 1 + src/Controllers/PostController.php | 42 ++++++++++++++++-------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/public/index.php b/public/index.php index 4a46250..d1d5f94 100644 --- a/public/index.php +++ b/public/index.php @@ -65,6 +65,7 @@ $db->pdo->exec(" id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT NOT NULL, + slug TEXT UNIQUE NOT NULL DEFAULT '', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ) diff --git a/src/Controllers/PostController.php b/src/Controllers/PostController.php index d16ca3d..46f262a 100644 --- a/src/Controllers/PostController.php +++ b/src/Controllers/PostController.php @@ -37,23 +37,14 @@ class PostController { $slug = (string)($args['slug'] ?? ''); - // Récupérer tous les posts et chercher celui qui correspond au slug - $rows = $this->db->select('post', '*', ['ORDER' => ['id' => 'DESC']]); - $post = null; + $row = $this->db->get('post', '*', ['slug' => $slug]); - foreach ($rows ?: [] as $row) { - $postObj = Post::fromArray($row); - if ($postObj->getSlug() === $slug) { - $post = $postObj; - break; - } - } - - if (!$post) { + if (!$row) { $res->getBody()->write('Article non trouvé'); return $res->withStatus(404); } + $post = Post::fromArray($row); return $this->view->render($res, 'pages/post_detail.twig', ['post' => $post]); } @@ -101,18 +92,16 @@ class PostController $title = trim((string)($data['title'] ?? '')); $content = trim((string)($data['content'] ?? '')); - // Créer un objet Post pour valider - try { - $post = new Post(0, $title, $content); - } catch (\InvalidArgumentException) { - // Validation échouée, retour à l'admin - return $res->withHeader('Location', '/admin')->withStatus(302); - } + $post = new Post(0, $title, $content); + $slug = $post->getSlug(); + + // Gérer les collisions + $slug = $this->ensureUniqueSlug($slug); - // Persister en DB $this->db->insert('post', [ 'title' => $post->getTitle(), 'content' => $post->getContent(), + 'slug' => $slug, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]); @@ -120,6 +109,19 @@ class PostController return $res->withHeader('Location', '/admin')->withStatus(302); } + private function ensureUniqueSlug(string $slug): string + { + $original = $slug; + $counter = 1; + + while ($this->db->get('post', 'id', ['slug' => $slug])) { + $slug = $original . '-' . $counter; + $counter++; + } + + return $slug; + } + /** * Met à jour un article existant. */