152 lines
4.9 KiB
PHP
152 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace App\Controller;
|
|
|
|
use App\Entity\Comment;
|
|
use App\Entity\Post;
|
|
use App\Form\CommentType;
|
|
use App\Form\PostType;
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
use Symfony\Component\Form\FormInterface;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\Routing\Annotation\Route;
|
|
use Symfony\Component\String\Slugger\AsciiSlugger;
|
|
|
|
class PostController extends AbstractController
|
|
{
|
|
/**
|
|
* @Route("/{page}", name="home")
|
|
* @param int $page
|
|
* @return Response
|
|
*/
|
|
public function index(int $page = 0): Response
|
|
{
|
|
$repo = $this->getDoctrine()->getRepository(Post::class);
|
|
$pages = (int) round(count($repo->getPublished())/5, 0, PHP_ROUND_HALF_UP);
|
|
if ($page < 0) {
|
|
$page = 0;
|
|
} else if ($page > $pages) {
|
|
$page = $pages;
|
|
}
|
|
return $this->render('home/index.html.twig', [
|
|
'posts' => $repo->getPublished($page*5, 5),
|
|
'pages' => $pages-1,
|
|
'page' => $page
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @Route("/post/{slug}", name="post")
|
|
* @param Request $request
|
|
* @param string $slug
|
|
* @return Response
|
|
*/
|
|
public function post(Request $request, string $slug): Response
|
|
{
|
|
$post = $this->getDoctrine()->getRepository(Post::class)->findOneBy(array('slug' => $slug));
|
|
if (!$post) {
|
|
throw $this->createNotFoundException("Post not found");
|
|
}
|
|
$form = $this->commentFormGenerator($post);
|
|
$form->handleRequest($request);
|
|
if ($form->isSubmitted() && $form->isValid()) {
|
|
$comment = $form->getData();
|
|
$comment->setCreatedAt(new \DateTime());
|
|
$manager = $this->getDoctrine()->getManager();
|
|
$manager->persist($comment);
|
|
$manager->flush();
|
|
$form = $this->commentFormGenerator($post);
|
|
}
|
|
return $this->render('post/index.html.twig', [
|
|
'post' => $post,
|
|
'form' => $form->createView()
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @Route("/admin/posts", name="posts")
|
|
*/
|
|
public function posts(): Response
|
|
{
|
|
return $this->render('post/posts.html.twig', [
|
|
'posts' => $this->getDoctrine()->getRepository(Post::class)->findBy(array(), array('publishedAt' => 'DESC'))
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @Route("/admin/posts/add", name="post-add")
|
|
* @param Request $request
|
|
* @return Response
|
|
*/
|
|
public function add(Request $request): Response
|
|
{
|
|
$post = new Post();
|
|
$form = $this->createForm(PostType::class, $post);
|
|
$form->handleRequest($request);
|
|
if ($form->isSubmitted() && $form->isValid()) {
|
|
$post = $form->getData();
|
|
$post->setSlug((new AsciiSlugger())->slug($post->getTitle()));
|
|
$manager = $this->getDoctrine()->getManager();
|
|
$manager->persist($post);
|
|
$manager->flush();
|
|
return $this->redirectToRoute('posts');
|
|
}
|
|
return $this->render('post/posts-form.html.twig', [
|
|
'form' => $form->createView(),
|
|
'title' => 'Add new post'
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @Route("/admin/posts/edit/{slug}", name="post-edit")
|
|
* @param Request $request
|
|
* @param string $slug
|
|
* @return Response
|
|
*/
|
|
public function edit(Request $request, string $slug): Response
|
|
{
|
|
$manager = $this->getDoctrine()->getManager();
|
|
$post = $manager->getRepository(Post::class)->findOneBy(array('slug' => $slug));
|
|
if (!$post) {
|
|
throw $this->createNotFoundException("Post not found");
|
|
}
|
|
$form = $this->createForm(PostType::class, $post);
|
|
$form->handleRequest($request);
|
|
if ($form->isSubmitted() && $form->isValid()) {
|
|
$post = $form->getData();
|
|
$post->setUpdatedAt(new \DateTime());
|
|
$post->setSlug((new AsciiSlugger())->slug($post->getTitle()));
|
|
$manager->flush();
|
|
return $this->redirectToRoute('posts');
|
|
}
|
|
return $this->render('post/posts-form.html.twig', [
|
|
'form' => $form->createView(),
|
|
'title' => 'Edit '.$post->getTitle()
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @Route("/admin/posts/remove/{slug}", name="post-remove")
|
|
* @param string $slug
|
|
* @return Response
|
|
*/
|
|
public function remove(string $slug): Response
|
|
{
|
|
$manager = $this->getDoctrine()->getManager();
|
|
$post = $manager->getRepository(Post::class)->findOneBy(array('slug' => $slug));
|
|
if (!$post) {
|
|
throw $this->createNotFoundException("Post not found");
|
|
}
|
|
$manager->remove($post);
|
|
$manager->flush();
|
|
return $this->redirectToRoute('posts');
|
|
}
|
|
|
|
private function commentFormGenerator(Post $post) : FormInterface
|
|
{
|
|
$comment = new Comment();
|
|
$comment->setPost($post);
|
|
return $this->createForm(CommentType::class, $comment);
|
|
}
|
|
}
|