<?php
namespace App\Controller;
use App\Service\NewsFilterService;
use Doctrine\DBAL\Query\QueryBuilder;
use Exception;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Model\Document\Listing;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class NewsController extends DefaultFrontendController
{
/**
* @Template
* @Route("{locale}{path}{productname}~p{product}", name="category-detail", defaults={"path"=""}, requirements={"path"=".*?", "productname"="[\w-]+", "product"="\d+"})
*
* @param Request $request
*
* @return array
* @throws Exception
*/
public function singleAction(Request $request): array
{
/*
* Worthwhile noting that the getEditable relation returns an object, and not the page object.
*/
$projectObjects = $this->document->getEditable('relatedProjects');
$productCategoryObjects = $this->document->getEditable('relatedProductCategories');
$sectorObjects = $this->document->getEditable('relatedSectors');
$relatedNewsType = $this->document->getEditable('relatedNewsType');
return $this->data($request, [
'projectObjects' => $projectObjects?->getData(),
'productCategoryObjects' => $productCategoryObjects?->getData(),
'sectorObjects' => $sectorObjects?->getData(),
'relatedNewsType' => $relatedNewsType?->getData(),
]);
}
/**
* @Template
* @Route("{locale}{path}{productname}~p{product}", name="category-detail", defaults={"path"=""}, requirements={"path"=".*?", "productname"="[\w-]+", "product"="\d+"})
* @param Request $request
* @return array
*/
public function archiveAction(Request $request, PaginatorInterface $paginator, NewsFilterService $newsFilterService): array
{
$listing = new Listing();
$listing->addConditionParam('documents.type = :type', ['type' => $this->document->getType()]);
$listing->addConditionParam('path LIKE :path', ['path' => $this->document->getFullPath() . '%']);
$relatedProductCategories = $request->query->get('solutions');
$relatedSectors = $request->query->get('industries');
$relatedNewsType = $request->query->get('type');
$listing->onCreateQueryBuilder(function (QueryBuilder $queryBuilder) use ($relatedSectors, $relatedProductCategories, $relatedNewsType) {
$tableName = $queryBuilder->getQueryParts()['from'][0]['table'] ?? null;
if ($relatedProductCategories) {
$queryBuilder->leftJoin(
$tableName,
'documents_editables',
'categoryRelation',
'categoryRelation.documentId = documents.id'
);
$queryBuilder->andWhere($queryBuilder->expr()->and(
$queryBuilder->expr()->eq('categoryRelation.name', '"relatedProductCategories"'),
$queryBuilder->expr()->like('categoryRelation.data', 'CONCAT(\'%"id";i:\',' . (int)$relatedProductCategories . ',\';%\')',),
));
}
if ($relatedSectors) {
$queryBuilder->leftJoin(
$tableName,
'documents_editables',
'sectorRelation',
'sectorRelation.documentId = documents.id'
);
$queryBuilder->andWhere($queryBuilder->expr()->and(
$queryBuilder->expr()->eq('sectorRelation.name', '"relatedSectors"'),
$queryBuilder->expr()->like('sectorRelation.data', 'CONCAT(\'%"id";i:\',' . (int)$relatedSectors . ',\';%\')',),
));
}
if ($relatedNewsType) {
$queryBuilder->leftJoin(
$tableName,
'documents_editables',
'typeRelation',
'typeRelation.documentId = documents.id'
);
$queryBuilder->andWhere($queryBuilder->expr()->and(
$queryBuilder->expr()->eq('typeRelation.name', '"relatedNewsType"'),
$queryBuilder->expr()->like('typeRelation.data', 'CONCAT(\'%"id";i:\',' . (int)$relatedNewsType . ',\';%\')',),
));
}
#todo: groupBy causes difference between count and actual data
if ($relatedProductCategories || $relatedSectors || $relatedNewsType) {
$queryBuilder->groupBy('documents.id');
}
return $queryBuilder;
});
$listing->setOrderKey('index');
$listing->setOrder('ASC');
$pagination = $paginator->paginate(
$listing,
max(1, (int)$request->get('page', 1)),
min(100, max(11, (int)$request->get('pageSize', 11))), /** 12 items shown on page, one is hardcoded */
);
return $this->data($request, [
'pagination' => $pagination,
'paginationVariables' => $pagination->getPaginationData(),
'filters' => [
'type' => $newsFilterService->getTypesFilterOptions($this->document, $request->getLocale()),
'industries' => $newsFilterService->getSolutionsFilterOptions($this->document, $request->getLocale()),
'solutions' => $newsFilterService->getIndustriesFilterOptions($this->document, $request->getLocale()),
],
]);
}
}