<?php
declare(strict_types=1);
namespace Hitso\Bundle\ContentBundle\Controller\Front;
use Doctrine\ORM\QueryBuilder;
use Hitso\Bundle\CommonBundle\Controller\Controller;
use Hitso\Bundle\ContentBundle\Entity\ArticleCategory;
use Hitso\Bundle\ContentBundle\Repository\ArticleRepository;
use Pagerfanta\Adapter\DoctrineORMAdapter;
use Pagerfanta\Pagerfanta;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use WhiteOctober\BreadcrumbsBundle\Model\Breadcrumbs;
/**
* Class ArticleCategoryController
*
* @Route("/", name="article_category_")
*/
class ArticleCategoryController extends Controller
{
const ARTICLE_LIMIT = 12;
/**
* @Route("/c", name="index")
*/
public function indexAction(ArticleRepository $repository, Breadcrumbs $breadcrumbs): Response
{
$breadcrumbs->addRouteItem('Articles', 'article_category_index');
$qb = $repository->getPublishedContentsQuery();
$cacheId = 'article_category_all';
$paginator = $this->getPaginator($qb, 1, $cacheId);
return $this->displayTemplate('index', [
'articles' => $paginator,
]);
}
/**
* @Route("/c/page/{page}/{slug}", name="page", defaults={"slug"=null})
*/
public function pageAction(
int $page = 1,
ArticleCategory $category = null,
ArticleRepository $repository,
Breadcrumbs $breadcrumbs
): Response {
$breadcrumbs->addRouteItem('Articles', 'article_category_index');
if ($category instanceof ArticleCategory) {
$breadcrumbs->addRouteItem($category->getName(), 'dynamic_' . $category->getRoute()->getId());
$cacheId = 'article_category_' . $category->getId();
$qb = $repository->getCategoryQuery($category);
} else {
$cacheId = 'article_category_all';
$qb = $repository->getPublishedContentsQuery();
}
$paginator = $this->getPaginator($qb, $page, $cacheId);
if ($category instanceof ArticleCategory) {
return $this->displayTemplate('show', [
'currentCategory' => $category,
'articles' => $paginator,
]);
} else {
return $this->displayTemplate('index', [
'articles' => $paginator,
]);
}
}
/**
* @Route("/c/paginate/{page}/{slug}", name="paginate", defaults={"_hittable"=true})
*/
public function paginateAction(int $page = 1, ArticleCategory $category = null, ArticleRepository $repository): Response
{
if ($category instanceof ArticleCategory) {
$cacheId = 'article_category_' . $category->getId();
$qb = $repository->getCategoryQuery($category);
} else {
$cacheId = 'article_category_all';
$qb = $repository->getPublishedContentsQuery();
}
$paginator = $this->getPaginator($qb, $page, $cacheId);
$html = $this->renderView('HitsoContentBundle:Front/ArticleCategory:entry_loop.html.twig', [
'articles' => $paginator,
]);
return $this->json($html);
}
/**
* @param ArticleRepository $repository
* @param ArticleCategory $category
* @param Breadcrumbs $breadcrumbs
*
* @return Response
*/
public function showAction(ArticleRepository $repository, ArticleCategory $category, Breadcrumbs $breadcrumbs): Response
{
$breadcrumbs->addRouteItem('Articles', 'article_category_index');
$breadcrumbs->addRouteItem($category->getName(), 'dynamic_' . $category->getRoute()->getId());
$qb = $repository->getCategoryQuery($category);
$cacheId = 'article_category_' . $category->getId();
$paginator = $this->getPaginator($qb, 1, $cacheId);
return $this->displayTemplate('show', [
'currentCategory' => $category,
'articles' => $paginator,
]);
}
/**
* @param QueryBuilder $queryBuilder
* @param int $page
* @param string $cacheId
*
* @return Pagerfanta
*/
protected function getPaginator(QueryBuilder $queryBuilder, int $page = 1, string $cacheId): Pagerfanta
{
$cacheId .= '_' . $this->getCurrentSite()->getId();
$adapter = new DoctrineORMAdapter($queryBuilder, $cacheId);
return (new Pagerfanta($adapter))
->setMaxPerPage(self::ARTICLE_LIMIT)
->setCurrentPage($page);
}
}