<?php
/**
* Created by Elements.at New Media Solutions GmbH
*
*/
namespace App\Service;
use Elements\Bundle\SeoHelperBundle\Service\PrettyUrl;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Model\DataObject\News;
use Pimcore\Model\DataObject\NewsCategory;
use Pimcore\Model\Document;
use Pimcore\Translation\Translator;
use Symfony\Component\HttpFoundation\Request;
class NewsService
{
public function __construct(
protected PaginatorInterface $paginator,
protected PrettyUrl $prettyUrl,
protected Translator $translator
) {
}
/**
* @param Request $request
* @param Document\PageSnippet $document
*
* @return array<mixed>
*/
public function getNewsOverviewVars(Request $request, Document\PageSnippet $document): array
{
$newsList = $this->getSortedNewsListing();
$filters = [];
$selectedFilters = [];
$categoryPreFilter = $document->getEditable('filterCategory') ? $document->getEditable('filterCategory')->getData() : [];
$perPage = $document->getEditable('perPage') ? $document->getEditable('perPage')->getData() : 12;
$categoryPreFilterIds = array_map(function ($c) {
return $c->getId();
}, $categoryPreFilter);
$categoryIds = array_filter($request->get('categories') ?: $categoryPreFilterIds);
if (!empty(array_filter($request->get('categories') ?: $categoryPreFilterIds))) {
$conditions = [];
foreach ($categoryIds as $id) {
$category = NewsCategory::getById($id);
if ($category instanceof NewsCategory) {
$conditions[] = 'FIND_IN_SET(' . intval($id) . ', categories)';
if ($request->get('categories')) {
$selectedFilters[] = [
'name' => 'categories[]',
'value' => $category->getId(),
'label' => $category->getName(),
];
}
}
}
$newsList->addConditionParam(implode(' OR ', $conditions));
}
foreach (($categoryPreFilter ?: new NewsCategory\Listing()) as $category) {
$filters[] = [
'id' => 'categories[]',
'name' => 'categories[]',
'value' => $category->getId(),
'label' => $category->getName(),
'checked' => $request->get('categories') && in_array($category->getId(), $request->get('categories')),
];
}
if ($searchQuery = htmlspecialchars($request->get('search'))) {
$newsList->addConditionParam('(title LIKE :search OR intro LIKE :search)', [
'search' => '%' . $searchQuery . '%',
]);
$selectedFilters[] = [
'name' => 'search',
'value' => $searchQuery,
'label' => $searchQuery,
];
}
$paginator = $this->paginator->paginate($newsList, (int)$request->get('page', 1), $perPage);
return [
'paginator' => $paginator,
'filters' => $filters,
'selectedFilters' => $selectedFilters,
];
}
public function getSortedNewsListing(): News\Listing
{
$newsList = new News\Listing();
$newsList->setOrderKey('publishDate');
$newsList->setOrder('DESC');
return $newsList;
}
/**
* @param array<mixed> $newsArray
* @param array<mixed> $editable
*
* @return array<mixed>
*/
public function filterNewsArray(array $newsArray, array $editable): array
{
foreach ($newsArray as $key => $value) {
if ($editable['id'] == $value->getId()) {
unset($newsArray[$key]);
}
}
return $newsArray;
}
}