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

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.     private Request $request;
  10.     public function __construct(?Request $request)
  11.     {
  12.         $this->request $request ?? Request::createFromGlobals();
  13.     }
  14.     public function items(ItemsEvent $event): void
  15.     {
  16.         $query $event->target;
  17.         if ($query instanceof \ModelCriteria) {
  18.             if (!$this->request->query->has($event->options[PaginatorInterface::FILTER_VALUE_PARAMETER_NAME])) {
  19.                 return;
  20.             }
  21.             if ($this->request->query->has($event->options[PaginatorInterface::FILTER_FIELD_PARAMETER_NAME])) {
  22.                 $columns $this->request->query->get($event->options[PaginatorInterface::FILTER_FIELD_PARAMETER_NAME]);
  23.             } elseif (!empty($event->options[PaginatorInterface::DEFAULT_FILTER_FIELDS])) {
  24.                 $columns $event->options[PaginatorInterface::DEFAULT_FILTER_FIELDS];
  25.             } else {
  26.                 return;
  27.             }
  28.             if (is_string($columns) && false !== strpos($columns',')) {
  29.                 $columns explode(','$columns);
  30.             }
  31.             $columns = (array) $columns;
  32.             if (isset($event->options[PaginatorInterface::FILTER_FIELD_ALLOW_LIST])) {
  33.                 foreach ($columns as $column) {
  34.                     if (!in_array($column$event->options[PaginatorInterface::FILTER_FIELD_ALLOW_LIST])) {
  35.                         throw new \UnexpectedValueException("Cannot filter by: [{$column}] this field is not in allow list");
  36.                     }
  37.                 }
  38.             }
  39.             $value $this->request->query->get($event->options[PaginatorInterface::FILTER_VALUE_PARAMETER_NAME]);
  40.             $criteria \Criteria::EQUAL;
  41.             if (false !== strpos($value'*')) {
  42.                 $value str_replace('*''%'$value);
  43.                 $criteria \Criteria::LIKE;
  44.             }
  45.             foreach ($columns as $column) {
  46.                 if (false !== strpos($column'.')) {
  47.                     $query->where($column.$criteria.'?'$value);
  48.                 } else {
  49.                     $query->{'filterBy'.$column}($value$criteria);
  50.                 }
  51.             }
  52.         }
  53.     }
  54.     public static function getSubscribedEvents(): array
  55.     {
  56.         return [
  57.             'knp_pager.items' => ['items'0],
  58.         ];
  59.     }
  60. }