<?php
namespace App\EventListener\SonataAdmin\Block\VOD;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\BlockBundle\Event\BlockEvent;
use Sonata\BlockBundle\Model\Block;
use Symfony\Component\HttpFoundation\RequestStack;
class FilterNoResultListener
{
public const FILTER_EXTENDED_NAV_CODE = 'extendedNavCode';
public const FILTER_MEDIA_ID = 'mediaId';
/** @var \Symfony\Component\HttpFoundation\Request */
private $request;
public function __construct(RequestStack $requestStack, EntityManagerInterface $entityManager)
{
$this->request = $requestStack->getCurrentRequest();
}
/**
* Responsible for processing some specific filter fields and renders a message accordingly.
*
* @param \Sonata\BlockBundle\Event\BlockEvent $event
* The instance of the dispatched event
*/
public function onDataGridFilter(BlockEvent $event): void
{
$queryBag = $this->request->query;
if (!$queryBag->has('filter') || empty($filters = $queryBag->get('filter'))) {
return;
}
// The keys contain the name of a specific, non-mapped, field (filter) for given Admin class.
// Whenever we have a filter name like these, then there is always a CallbackFilter bound to it.
$targetFilters = [
'dummyExtendedNavCodes' => [
'errorMessage' => 'No VOD Extended Title with NAV Extended Code %s was found!',
'filterType' => self::FILTER_EXTENDED_NAV_CODE,
],
'dummyMediaIds' => [
'errorMessage' => 'No VOD Extended Title with Media ID %s was found!',
'filterType' => self::FILTER_MEDIA_ID,
],
];
foreach ($targetFilters as $targetFilter => $metadata) {
if (empty($values = $this->extractFilterValues($filters, $targetFilter))) {
continue;
}
$block = new Block();
$block->setId(uniqid('', true));
$block->setType('app.block.vod.filter_no_results');
$block->setSettings(array_merge($event->getSettings(), [
'values' => $values,
'errorMessage' => $metadata['errorMessage'],
'filterType' => $metadata['filterType'],
]));
$event->addBlock($block);
}
}
/**
* Responsible for extracting the provided filter values from the request.
*
* @param array $filters
* The list with all available filters for given admin page
* @param string $key
* The name of the specific filter we want to process
*
* @return array
* The list with available values
*/
private function extractFilterValues(array $filters, string $key): array
{
if (empty($filters[$key]) || empty($filters[$key]['value'])) {
return [];
}
$values = array_filter(
array_map(fn($value) => trim($value),
explode(PHP_EOL, $filters[$key]['value']))
);
return is_array($values) ? $values : [$values];
}
}