<?php
/**
* Created by PhpStorm.
* User: michael
* Date: 26/06/2019
* Time: 10:54
*/
namespace App\Controller\Front;
use App\Controller\Front\LandingPage\AbstractProspectCreationController;
use App\Entity\BlogAuthor;
use App\Entity\BlogPost;
use App\Entity\Prospect;
use App\Form\FilterBlogPostType;
use App\Form\Model\FilterBlogPostModel;
use App\Form\ProspectType;
use App\Repository\BlogCategoryRepository;
use App\Repository\BlogPostRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use Exception;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* Class BlogController
* @package App\Controller
*/
class BlogController extends AbstractProspectCreationController
{
/**
* @Route("/blog", name="blog_post_all")
* @param BlogPostRepository $blogPostRepository
* @param BlogCategoryRepository $blogCategoryRepository
* @param PaginatorInterface $paginator
* @param FormFactoryInterface $formFactory
* @param Request $request
* @return Response
* @throws NonUniqueResultException
*/
public function showAllPostAction(BlogPostRepository $blogPostRepository, BlogCategoryRepository $blogCategoryRepository, PaginatorInterface $paginator, FormFactoryInterface $formFactory, Request $request): Response
{
// filtre de recherche des articles
$filter = new FilterBlogPostModel();
$form = $formFactory->create(FilterBlogPostType::class, $filter);
$form->handleRequest($request);
$blogPosts = $blogPostRepository->getFilteredBlogPost($filter);
$lastedByCategory = [];
try {
$featuredCategory = $blogCategoryRepository->findRandomCategory();
} catch (Exception $e) {
$featuredCategory = $blogCategoryRepository->findBy(['id' => 1]);
}
if($featuredCategory) {
$lastedByCategory = $blogPostRepository->findBy(['blogCategory' => $featuredCategory->getId()], ['createdAt' => 'DESC'], 3);
}
$categories = $blogPostRepository->findCategoriesWithNoPillarArticles();
$randomPageCategory = [];
foreach ($categories as $category) {
$randomPageCategory[] = $blogPostRepository->findRandomNotPillarPageByCategory($category);
}
//check that page parameter is an integer
if (!is_numeric($request->query->get('page', 1))) {
throw $this->createNotFoundException('The page parameter must be an integer');
}
$pagination = $paginator->paginate(
$blogPosts,
$request->query->getInt('page', 1)
);
return $this->render('front_v4/mca/blog/list.html.twig', [
'pillarPages' => $blogPostRepository->findRandomPillarPages(3),
'randomPageByCategory' => $randomPageCategory,
'featuredCategory' => $featuredCategory,
'featuredLastedPostByCategory' => $lastedByCategory,
'pagination' => $pagination,
'form' => $form->createView(),
]);
}
/**
* @Route("/blog/{slug}", name="blog_post_show")
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param BlogPost $blogPost
* @param BlogPostRepository $blogPostRepository
* @return Response
*/
public function showPostAction(
Request $request,
EntityManagerInterface $entityManager,
BlogPost $blogPost,
BlogPostRepository $blogPostRepository
): ?Response
{
$prospect = new Prospect();
$this->prefiledProspectWithGetParam($request, $prospect);
$prospectForm = $this->createForm(ProspectType::class, $prospect);
$prospectForm->handleRequest($request);
if ($prospectForm->isSubmitted() && $prospectForm->isValid()) {
$this->get("security.csrf.token_manager")->refreshToken("prospect_token");
// already TYPE_CHECKUP on landing page
$prospect->setRequest(Prospect::TYPE_CHECKUP);
// create a prospect or redirect to a specific page if duplicate has been found
$redirection = $this->createProspectOrRedirect($prospect);
// apply redirection if one is returned
if (!is_null($redirection)) {
return $redirection;
}
$entityManager->flush();
unset($prospectForm);
return $this->redirectToSuccessPage($prospect, $request->getPathInfo());
}
return $this->render('front_v4/mca/blog/single.html.twig', [
'formProspect' => $prospectForm->createView(),
'blogPost' => $blogPost,
'relatedCategoryPosts' => $blogPostRepository->findByBlogCategory($blogPost->getBlogCategory(), ['createdAt' => 'ASC'], 3),
'pilarPosts' => $blogPostRepository->findRandomPillarPages(3, $blogPost->isIsPillarPage() ? $blogPost->getId() : null)
]);
}
/**
* @Route("/blog/auteur/{id}", name="blog_author_show", requirements={"page"="\d+"})
*/
public function showAuthorAction(Request $request, BlogAuthor $author, PaginatorInterface $paginator): Response
{
$pagination = $paginator->paginate(
$author->getBlogPosts(),
$request->query->getInt('page', 1)
);
return $this->render('front_v4/mca/author/single.html.twig', [
'author' => $author,
'pagination' => $pagination
]);
}
}