vendor/ibexa/order-management/src/bundle/PageBuilder/Orders/BlockSubscriber.php line 49

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. declare(strict_types=1);
  7. namespace Ibexa\Bundle\OrderManagement\PageBuilder\Orders;
  8. use Ibexa\Contracts\OrderManagement\OrderServiceInterface;
  9. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\BlockRenderEvents;
  10. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\PreRenderEvent;
  11. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Twig\TwigRenderRequest;
  12. use Ibexa\OrderManagement\Pagerfanta\Adapter\OrderListAdapter;
  13. use Pagerfanta\Pagerfanta;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. final class BlockSubscriber implements EventSubscriberInterface
  17. {
  18. private const PAGINATION_PAGE_PARAM_PREFIX = 'page_';
  19. private const PAGINATION_DEFAULT_LIMIT = 10;
  20. private const PAGINATION_DEFAULT_CURRENT_PAGE = 1;
  21. private OrderServiceInterface $orderService;
  22. private RequestStack $requestStack;
  23. private QueryFactoryInterface $queryFactory;
  24. public function __construct(
  25. OrderServiceInterface $orderService,
  26. RequestStack $requestStack,
  27. QueryFactoryInterface $queryFactory
  28. ) {
  29. $this->orderService = $orderService;
  30. $this->requestStack = $requestStack;
  31. $this->queryFactory = $queryFactory;
  32. }
  33. public static function getSubscribedEvents(): array
  34. {
  35. return [
  36. BlockRenderEvents::getBlockPreRenderEventName(Block::BLOCK_IDENTIFIER) => 'onPreRender',
  37. ];
  38. }
  39. public function onPreRender(PreRenderEvent $event): void
  40. {
  41. $request = $event->getRenderRequest();
  42. if ($request instanceof TwigRenderRequest) {
  43. $block = new Block($event->getBlockValue());
  44. $query = $this->queryFactory->createQuery($block);
  45. $pagerfanta = new Pagerfanta(new OrderListAdapter($this->orderService, $query));
  46. $pagerfanta->setCurrentPage($this->getCurrentPage(self::PAGINATION_PAGE_PARAM_PREFIX . $block->getId()));
  47. $pagerfanta->setMaxPerPage($block->getLimit() ?? self::PAGINATION_DEFAULT_LIMIT);
  48. $request->addParameter('columns', $block->getColumns());
  49. $request->addParameter('orders', $pagerfanta);
  50. }
  51. }
  52. private function getCurrentPage(string $pageParam): int
  53. {
  54. $request = $this->requestStack->getMainRequest();
  55. if ($request === null) {
  56. return self::PAGINATION_DEFAULT_CURRENT_PAGE;
  57. }
  58. return $request->query->getInt($pageParam, self::PAGINATION_DEFAULT_CURRENT_PAGE);
  59. }
  60. }