src/EventListener/SonataAdmin/Block/VOD/FilterNoResultListener.php line 29

Open in your IDE?
  1. <?php
  2. namespace App\EventListener\SonataAdmin\Block\VOD;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Sonata\BlockBundle\Event\BlockEvent;
  5. use Sonata\BlockBundle\Model\Block;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. class FilterNoResultListener
  8. {
  9.     public const FILTER_EXTENDED_NAV_CODE 'extendedNavCode';
  10.     public const FILTER_MEDIA_ID 'mediaId';
  11.     /** @var \Symfony\Component\HttpFoundation\Request */
  12.     private $request;
  13.     public function __construct(RequestStack $requestStackEntityManagerInterface $entityManager)
  14.     {
  15.         $this->request $requestStack->getCurrentRequest();
  16.     }
  17.     /**
  18.      * Responsible for processing some specific filter fields and renders a message accordingly.
  19.      *
  20.      * @param \Sonata\BlockBundle\Event\BlockEvent $event
  21.      *   The instance of the dispatched event
  22.      */
  23.     public function onDataGridFilter(BlockEvent $event): void
  24.     {
  25.         $queryBag $this->request->query;
  26.         if (!$queryBag->has('filter') || empty($filters $queryBag->get('filter'))) {
  27.             return;
  28.         }
  29.         // The keys contain the name of a specific, non-mapped, field (filter) for given Admin class.
  30.         // Whenever we have a filter name like these, then there is always a CallbackFilter bound to it.
  31.         $targetFilters = [
  32.             'dummyExtendedNavCodes' => [
  33.                 'errorMessage' => 'No VOD Extended Title with NAV Extended Code %s was found!',
  34.                 'filterType' => self::FILTER_EXTENDED_NAV_CODE,
  35.             ],
  36.             'dummyMediaIds' => [
  37.                 'errorMessage' => 'No VOD Extended Title with Media ID %s was found!',
  38.                 'filterType' => self::FILTER_MEDIA_ID,
  39.             ],
  40.         ];
  41.         foreach ($targetFilters as $targetFilter => $metadata) {
  42.             if (empty($values $this->extractFilterValues($filters$targetFilter))) {
  43.                 continue;
  44.             }
  45.             $block = new Block();
  46.             $block->setId(uniqid(''true));
  47.             $block->setType('app.block.vod.filter_no_results');
  48.             $block->setSettings(array_merge($event->getSettings(), [
  49.                 'values' => $values,
  50.                 'errorMessage' => $metadata['errorMessage'],
  51.                 'filterType' => $metadata['filterType'],
  52.             ]));
  53.             $event->addBlock($block);
  54.         }
  55.     }
  56.     /**
  57.      * Responsible for extracting the provided filter values from the request.
  58.      *
  59.      * @param array $filters
  60.      *   The list with all available filters for given admin page
  61.      * @param string $key
  62.      *   The name of the specific filter we want to process
  63.      *
  64.      * @return array
  65.      *   The list with available values
  66.      */
  67.     private function extractFilterValues(array $filtersstring $key): array
  68.     {
  69.         if (empty($filters[$key]) || empty($filters[$key]['value'])) {
  70.             return [];
  71.         }
  72.         $values array_filter(
  73.             array_map(fn($value) => trim($value),
  74.             explode(PHP_EOL$filters[$key]['value']))
  75.         );
  76.         return is_array($values) ? $values : [$values];
  77.     }
  78. }