vendor/knplabs/knp-components/src/Knp/Component/Pager/Event/Subscriber/Filtration/PropelQuerySubscriber.php line 22

Open in your IDE?
  1. <?php
  2. namespace Knp\Component\Pager\Event\Subscriber\Filtration;
  3. use Knp\Component\Pager\Event\ItemsEvent;
  4. use Knp\Component\Pager\PaginatorInterface;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. class PropelQuerySubscriber implements EventSubscriberInterface
  8. {
  9.     /**
  10.      * @var Request
  11.      */
  12.     private $request;
  13.     public function __construct(?Request $request)
  14.     {
  15.         $this->request $request ?? Request::createFromGlobals();
  16.     }
  17.     public function items(ItemsEvent $event): void
  18.     {
  19.         $query $event->target;
  20.         if ($query instanceof \ModelCriteria) {
  21.             if (!$this->request->query->has($event->options[PaginatorInterface::FILTER_VALUE_PARAMETER_NAME])) {
  22.                 return;
  23.             }
  24.             if ($this->request->query->has($event->options[PaginatorInterface::FILTER_FIELD_PARAMETER_NAME])) {
  25.                 $columns $this->request->query->get($event->options[PaginatorInterface::FILTER_FIELD_PARAMETER_NAME]);
  26.             } elseif (!empty($event->options[PaginatorInterface::DEFAULT_FILTER_FIELDS])) {
  27.                 $columns $event->options[PaginatorInterface::DEFAULT_FILTER_FIELDS];
  28.             } else {
  29.                 return;
  30.             }
  31.             if (is_string($columns) && false !== strpos($columns',')) {
  32.                 $columns explode(','$columns);
  33.             }
  34.             $columns = (array) $columns;
  35.             if (isset($event->options[PaginatorInterface::FILTER_FIELD_ALLOW_LIST])) {
  36.                 foreach ($columns as $column) {
  37.                     if (!in_array($column$event->options[PaginatorInterface::FILTER_FIELD_ALLOW_LIST])) {
  38.                         throw new \UnexpectedValueException("Cannot filter by: [{$column}] this field is not in allow list");
  39.                     }
  40.                 }
  41.             }
  42.             $value $this->request->query->get($event->options[PaginatorInterface::FILTER_VALUE_PARAMETER_NAME]);
  43.             $criteria = \Criteria::EQUAL;
  44.             if (false !== strpos($value'*')) {
  45.                 $value str_replace('*''%'$value);
  46.                 $criteria = \Criteria::LIKE;
  47.             }
  48.             foreach ($columns as $column) {
  49.                 if (false !== strpos($column'.')) {
  50.                     $query->where($column.$criteria.'?'$value);
  51.                 } else {
  52.                     $query->{'filterBy'.$column}($value$criteria);
  53.                 }
  54.             }
  55.         }
  56.     }
  57.     public static function getSubscribedEvents(): array
  58.     {
  59.         return [
  60.             'knp_pager.items' => ['items'0],
  61.         ];
  62.     }
  63. }