{{ post.title }}
+ + + + + {% if post.updatedAt != post.createdAt %} ++ +
diff --git a/.gitignore b/.gitignore index 3058b57..9ba6f13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,20 @@ -# Environnement local +# ============================================ +# Environnement & Configuration +# ============================================ .env -# Composer +# ============================================ +# Dépendances Composer +# ============================================ /vendor/ composer.lock -# Base de données SQLite -/database/*.sqlite -/database/*.db +# ============================================ +# Base de données +# ============================================ +/database/ -# Cache et logs -/var/ \ No newline at end of file +# ============================================ +# Cache & Logs +# ============================================ +/var/ diff --git a/composer.json b/composer.json index 1bb45c4..554cdd2 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,8 @@ "slim/psr7": "*", "twig/twig": "*", "slim/twig-view": "^3.4", - "catfan/medoo": "2.*" + "catfan/medoo": "2.*", + "vlucas/phpdotenv": "^5.6" }, "autoload": { "psr-4": { @@ -25,4 +26,4 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^3.94" } -} \ No newline at end of file +} diff --git a/public/index.php b/public/index.php index 175f214..4a46250 100644 --- a/public/index.php +++ b/public/index.php @@ -4,6 +4,12 @@ declare(strict_types=1); require __DIR__ . '/../vendor/autoload.php'; +use Dotenv\Dotenv; + +// Charger les variables d'environnement +$dotenv = Dotenv::createImmutable(__DIR__ . '/..'); +$dotenv->load(); + use Slim\Factory\AppFactory; use Slim\Views\TwigMiddleware; use Slim\Views\Twig; @@ -18,9 +24,12 @@ $env = $_ENV['APP_ENV'] ?? 'production'; $isDev = strtolower($env) === 'development'; // Dossier de cache Twig (false en dev, chemin en prod) -$twigCache = $isDev ? false : __DIR__ . '/../var/cache/twig'; -if ($twigCache && !is_dir($twigCache)) { - @mkdir($twigCache, 0755, true); +$twigCache = false; +if (!$isDev) { + $twigCache = __DIR__ . '/../var/cache/twig'; + if (!is_dir($twigCache)) { + @mkdir($twigCache, 0755, true); + } } // Chemin base de données @@ -76,6 +85,7 @@ $app->add(TwigMiddleware::create($app, $twig)); $controller = new PostController($twig, $db); $app->get('/', [$controller, 'index']); +$app->get('/article/{slug}', [$controller, 'show']); $app->get('/admin', [$controller, 'admin']); $app->get('/admin/edit/{id}', [$controller, 'form']); $app->post('/admin/create', [$controller, 'create']); diff --git a/src/Controllers/PostController.php b/src/Controllers/PostController.php index f7fb1ed..d16ca3d 100644 --- a/src/Controllers/PostController.php +++ b/src/Controllers/PostController.php @@ -30,6 +30,33 @@ class PostController return $this->view->render($res, 'pages/home.twig', ['posts' => $posts]); } + /** + * Affiche un article complet par son slug. + */ + public function show(Request $req, Response $res, array $args): Response + { + $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; + + foreach ($rows ?: [] as $row) { + $postObj = Post::fromArray($row); + if ($postObj->getSlug() === $slug) { + $post = $postObj; + break; + } + } + + if (!$post) { + $res->getBody()->write('Article non trouvé'); + return $res->withStatus(404); + } + + return $this->view->render($res, 'pages/post_detail.twig', ['post' => $post]); + } + /** * Affiche la page d'administration. */ diff --git a/src/Models/Post.php b/src/Models/Post.php index 1fbbe62..47cadfe 100644 --- a/src/Models/Post.php +++ b/src/Models/Post.php @@ -135,18 +135,6 @@ final class Post return trim($slug, '-'); } - /** - * Indique si l'article a été créé récemment. - * - * @param int $days Nombre de jours - * @return bool - */ - public function isRecent(int $days = 7): bool - { - $limit = new DateTime("-{$days} days"); - return $this->createdAt > $limit; - } - /** * Retourne les données prêtes à persister en DB. * diff --git a/views/pages/admin.twig b/views/pages/admin.twig index c97dc95..d119006 100644 --- a/views/pages/admin.twig +++ b/views/pages/admin.twig @@ -25,9 +25,6 @@
{{ post.getExcerpt(200) }}
diff --git a/views/pages/post_detail.twig b/views/pages/post_detail.twig new file mode 100644 index 0000000..b35b9ca --- /dev/null +++ b/views/pages/post_detail.twig @@ -0,0 +1,29 @@ +{% extends "layout.twig" %} + +{% block title %}{{ post.title }} – Mon Blog{% endblock %} + +{% block content %} +