Added slug db column
This commit is contained in:
@@ -65,6 +65,7 @@ $db->pdo->exec("
|
|||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
title TEXT NOT NULL,
|
title TEXT NOT NULL,
|
||||||
content TEXT NOT NULL,
|
content TEXT NOT NULL,
|
||||||
|
slug TEXT UNIQUE NOT NULL DEFAULT '',
|
||||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -37,23 +37,14 @@ class PostController
|
|||||||
{
|
{
|
||||||
$slug = (string)($args['slug'] ?? '');
|
$slug = (string)($args['slug'] ?? '');
|
||||||
|
|
||||||
// Récupérer tous les posts et chercher celui qui correspond au slug
|
$row = $this->db->get('post', '*', ['slug' => $slug]);
|
||||||
$rows = $this->db->select('post', '*', ['ORDER' => ['id' => 'DESC']]);
|
|
||||||
$post = null;
|
|
||||||
|
|
||||||
foreach ($rows ?: [] as $row) {
|
if (!$row) {
|
||||||
$postObj = Post::fromArray($row);
|
|
||||||
if ($postObj->getSlug() === $slug) {
|
|
||||||
$post = $postObj;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$post) {
|
|
||||||
$res->getBody()->write('Article non trouvé');
|
$res->getBody()->write('Article non trouvé');
|
||||||
return $res->withStatus(404);
|
return $res->withStatus(404);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$post = Post::fromArray($row);
|
||||||
return $this->view->render($res, 'pages/post_detail.twig', ['post' => $post]);
|
return $this->view->render($res, 'pages/post_detail.twig', ['post' => $post]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,18 +92,16 @@ class PostController
|
|||||||
$title = trim((string)($data['title'] ?? ''));
|
$title = trim((string)($data['title'] ?? ''));
|
||||||
$content = trim((string)($data['content'] ?? ''));
|
$content = trim((string)($data['content'] ?? ''));
|
||||||
|
|
||||||
// Créer un objet Post pour valider
|
$post = new Post(0, $title, $content);
|
||||||
try {
|
$slug = $post->getSlug();
|
||||||
$post = new Post(0, $title, $content);
|
|
||||||
} catch (\InvalidArgumentException) {
|
// Gérer les collisions
|
||||||
// Validation échouée, retour à l'admin
|
$slug = $this->ensureUniqueSlug($slug);
|
||||||
return $res->withHeader('Location', '/admin')->withStatus(302);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Persister en DB
|
|
||||||
$this->db->insert('post', [
|
$this->db->insert('post', [
|
||||||
'title' => $post->getTitle(),
|
'title' => $post->getTitle(),
|
||||||
'content' => $post->getContent(),
|
'content' => $post->getContent(),
|
||||||
|
'slug' => $slug,
|
||||||
'created_at' => date('Y-m-d H:i:s'),
|
'created_at' => date('Y-m-d H:i:s'),
|
||||||
'updated_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);
|
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.
|
* Met à jour un article existant.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user