src/Controller/NewsController.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\NewsFilterService;
  4. use Doctrine\DBAL\Query\QueryBuilder;
  5. use Exception;
  6. use Knp\Component\Pager\PaginatorInterface;
  7. use Pimcore\Model\Document\Listing;
  8. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. class NewsController extends DefaultFrontendController
  12. {
  13.     /**
  14.      * @Template
  15.      * @Route("{locale}{path}{productname}~p{product}", name="category-detail", defaults={"path"=""}, requirements={"path"=".*?", "productname"="[\w-]+", "product"="\d+"})
  16.      *
  17.      * @param Request $request
  18.      *
  19.      * @return array
  20.      * @throws Exception
  21.      */
  22.     public function singleAction(Request $request): array
  23.     {
  24.         /*
  25.          * Worthwhile noting that the getEditable relation returns an object, and not the page object.
  26.          */
  27.         $projectObjects $this->document->getEditable('relatedProjects');
  28.         $productCategoryObjects $this->document->getEditable('relatedProductCategories');
  29.         $sectorObjects $this->document->getEditable('relatedSectors');
  30.         $relatedNewsType $this->document->getEditable('relatedNewsType');
  31.         return $this->data($request, [
  32.             'projectObjects' => $projectObjects?->getData(),
  33.             'productCategoryObjects' => $productCategoryObjects?->getData(),
  34.             'sectorObjects' => $sectorObjects?->getData(),
  35.             'relatedNewsType' => $relatedNewsType?->getData(),
  36.         ]);
  37.     }
  38.     /**
  39.      * @Template
  40.      * @Route("{locale}{path}{productname}~p{product}", name="category-detail", defaults={"path"=""}, requirements={"path"=".*?", "productname"="[\w-]+", "product"="\d+"})
  41.      * @param Request $request
  42.      * @return array
  43.      */
  44.     public function archiveAction(Request $requestPaginatorInterface $paginatorNewsFilterService $newsFilterService): array
  45.     {
  46.         $listing = new Listing();
  47.         $listing->addConditionParam('documents.type = :type', ['type' => $this->document->getType()]);
  48.         $listing->addConditionParam('path LIKE :path', ['path' => $this->document->getFullPath() . '%']);
  49.         $relatedProductCategories $request->query->get('solutions');
  50.         $relatedSectors $request->query->get('industries');
  51.         $relatedNewsType $request->query->get('type');
  52.         $listing->onCreateQueryBuilder(function (QueryBuilder $queryBuilder) use ($relatedSectors$relatedProductCategories$relatedNewsType) {
  53.             $tableName $queryBuilder->getQueryParts()['from'][0]['table'] ?? null;
  54.             if ($relatedProductCategories) {
  55.                 $queryBuilder->leftJoin(
  56.                     $tableName,
  57.                     'documents_editables',
  58.                     'categoryRelation',
  59.                     'categoryRelation.documentId = documents.id'
  60.                 );
  61.                 $queryBuilder->andWhere($queryBuilder->expr()->and(
  62.                     $queryBuilder->expr()->eq('categoryRelation.name''"relatedProductCategories"'),
  63.                     $queryBuilder->expr()->like('categoryRelation.data''CONCAT(\'%"id";i:\',' . (int)$relatedProductCategories ',\';%\')',),
  64.                 ));
  65.             }
  66.             if ($relatedSectors) {
  67.                 $queryBuilder->leftJoin(
  68.                     $tableName,
  69.                     'documents_editables',
  70.                     'sectorRelation',
  71.                     'sectorRelation.documentId = documents.id'
  72.                 );
  73.                 $queryBuilder->andWhere($queryBuilder->expr()->and(
  74.                     $queryBuilder->expr()->eq('sectorRelation.name''"relatedSectors"'),
  75.                     $queryBuilder->expr()->like('sectorRelation.data''CONCAT(\'%"id";i:\',' . (int)$relatedSectors ',\';%\')',),
  76.                 ));
  77.             }
  78.             if ($relatedNewsType) {
  79.                 $queryBuilder->leftJoin(
  80.                     $tableName,
  81.                     'documents_editables',
  82.                     'typeRelation',
  83.                     'typeRelation.documentId = documents.id'
  84.                 );
  85.                 $queryBuilder->andWhere($queryBuilder->expr()->and(
  86.                     $queryBuilder->expr()->eq('typeRelation.name''"relatedNewsType"'),
  87.                     $queryBuilder->expr()->like('typeRelation.data''CONCAT(\'%"id";i:\',' . (int)$relatedNewsType ',\';%\')',),
  88.                 ));
  89.             }
  90.             #todo: groupBy causes difference between count and actual data
  91.             if ($relatedProductCategories || $relatedSectors || $relatedNewsType) {
  92.                 $queryBuilder->groupBy('documents.id');
  93.             }
  94.             return $queryBuilder;
  95.         });
  96.         $listing->setOrderKey('index');
  97.         $listing->setOrder('ASC');
  98.         $pagination $paginator->paginate(
  99.             $listing,
  100.             max(1, (int)$request->get('page'1)),
  101.             min(100max(11, (int)$request->get('pageSize'11))), /** 12 items shown on page, one is hardcoded */
  102.         );
  103.         return $this->data($request, [
  104.             'pagination' => $pagination,
  105.             'paginationVariables' => $pagination->getPaginationData(),
  106.             'filters' => [
  107.                 'type' => $newsFilterService->getTypesFilterOptions($this->document$request->getLocale()),
  108.                 'industries' => $newsFilterService->getSolutionsFilterOptions($this->document$request->getLocale()),
  109.                 'solutions' => $newsFilterService->getIndustriesFilterOptions($this->document$request->getLocale()),
  110.             ],
  111.         ]);
  112.     }
  113. }