src/Service/NewsService.php line 85

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by Elements.at New Media Solutions GmbH
  4.  *
  5.  */
  6. namespace App\Service;
  7. use Elements\Bundle\SeoHelperBundle\Service\PrettyUrl;
  8. use Knp\Component\Pager\PaginatorInterface;
  9. use Pimcore\Model\DataObject\News;
  10. use Pimcore\Model\DataObject\NewsCategory;
  11. use Pimcore\Model\Document;
  12. use Pimcore\Translation\Translator;
  13. use Symfony\Component\HttpFoundation\Request;
  14. class NewsService
  15. {
  16.     public function __construct(
  17.         protected PaginatorInterface $paginator,
  18.         protected PrettyUrl $prettyUrl,
  19.         protected Translator $translator
  20.     ) {
  21.     }
  22.     /**
  23.      * @param Request $request
  24.      * @param Document\PageSnippet $document
  25.      *
  26.      * @return array<mixed>
  27.      */
  28.     public function getNewsOverviewVars(Request $requestDocument\PageSnippet $document): array
  29.     {
  30.         $newsList $this->getSortedNewsListing();
  31.         $filters = [];
  32.         $selectedFilters = [];
  33.         $categoryPreFilter $document->getEditable('filterCategory') ? $document->getEditable('filterCategory')->getData() : [];
  34.         $perPage $document->getEditable('perPage') ? $document->getEditable('perPage')->getData() : 12;
  35.         $categoryPreFilterIds array_map(function ($c) {
  36.             return $c->getId();
  37.         }, $categoryPreFilter);
  38.         $categoryIds array_filter($request->get('categories') ?: $categoryPreFilterIds);
  39.         if (!empty(array_filter($request->get('categories') ?: $categoryPreFilterIds))) {
  40.             $conditions = [];
  41.             foreach ($categoryIds as $id) {
  42.                 $category NewsCategory::getById($id);
  43.                 if ($category instanceof NewsCategory) {
  44.                     $conditions[] = 'FIND_IN_SET(' intval($id) . ', categories)';
  45.                     if ($request->get('categories')) {
  46.                         $selectedFilters[] = [
  47.                             'name' => 'categories[]',
  48.                             'value' => $category->getId(),
  49.                             'label' => $category->getName(),
  50.                         ];
  51.                     }
  52.                 }
  53.             }
  54.             $newsList->addConditionParam(implode(' OR '$conditions));
  55.         }
  56.         foreach (($categoryPreFilter ?: new NewsCategory\Listing()) as $category) {
  57.             $filters[] = [
  58.                 'id' => 'categories[]',
  59.                 'name' => 'categories[]',
  60.                 'value' => $category->getId(),
  61.                 'label' => $category->getName(),
  62.                 'checked' => $request->get('categories') && in_array($category->getId(), $request->get('categories')),
  63.             ];
  64.         }
  65.         if ($searchQuery htmlspecialchars($request->get('search'))) {
  66.             $newsList->addConditionParam('(title LIKE :search OR intro LIKE :search)', [
  67.                 'search' => '%' $searchQuery '%',
  68.             ]);
  69.             $selectedFilters[] = [
  70.                 'name' => 'search',
  71.                 'value' => $searchQuery,
  72.                 'label' => $searchQuery,
  73.             ];
  74.         }
  75.         $paginator $this->paginator->paginate($newsList, (int)$request->get('page'1), $perPage);
  76.         return [
  77.             'paginator' => $paginator,
  78.             'filters' => $filters,
  79.             'selectedFilters' => $selectedFilters,
  80.         ];
  81.     }
  82.     public function getSortedNewsListing(): News\Listing
  83.     {
  84.         $newsList = new News\Listing();
  85.         $newsList->setOrderKey('publishDate');
  86.         $newsList->setOrder('DESC');
  87.         return $newsList;
  88.     }
  89.     /**
  90.      * @param array<mixed> $newsArray
  91.      * @param array<mixed> $editable
  92.      *
  93.      * @return array<mixed>
  94.      */
  95.     public function filterNewsArray(array $newsArray, array $editable): array
  96.     {
  97.         foreach ($newsArray as $key => $value) {
  98.             if ($editable['id'] == $value->getId()) {
  99.                 unset($newsArray[$key]);
  100.             }
  101.         }
  102.         return $newsArray;
  103.     }
  104. }