vendor/ibexa/order-management/src/bundle/PageBuilder/RecentOrders/BlockSubscriber.php line 51

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\RecentOrders;
  8. use Ibexa\Contracts\OrderManagement\OrderServiceInterface;
  9. use Ibexa\Contracts\OrderManagement\Value\Order\OrderQuery;
  10. use Ibexa\Contracts\OrderManagement\Value\Order\Query\Criterion\LogicalAnd;
  11. use Ibexa\Contracts\OrderManagement\Value\Order\Query\Criterion\StatusCriterion;
  12. use Ibexa\Contracts\OrderManagement\Value\Order\Query\CriterionInterface;
  13. use Ibexa\Contracts\OrderManagement\Value\Order\Query\SortClause\Created;
  14. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\BlockRenderEvents;
  15. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\PreRenderEvent;
  16. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Twig\TwigRenderRequest;
  17. use Ibexa\OrderManagement\Pagerfanta\Adapter\OrderListAdapter;
  18. use Pagerfanta\Pagerfanta;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. final class BlockSubscriber implements EventSubscriberInterface
  22. {
  23. private const PAGINATION_PAGE_PARAM_PREFIX = 'recent_orders_page_';
  24. private const PAGINATION_DEFAULT_LIMIT = 10;
  25. private const PAGINATION_DEFAULT_CURRENT_PAGE = 1;
  26. private const ALL_STATUSES = 'all';
  27. private OrderServiceInterface $orderService;
  28. private RequestStack $requestStack;
  29. public function __construct(
  30. OrderServiceInterface $orderService,
  31. RequestStack $requestStack
  32. ) {
  33. $this->orderService = $orderService;
  34. $this->requestStack = $requestStack;
  35. }
  36. public static function getSubscribedEvents(): array
  37. {
  38. return [
  39. BlockRenderEvents::getBlockPreRenderEventName(RecentOrdersBlock::BLOCK_IDENTIFIER) => 'onPreRender',
  40. ];
  41. }
  42. public function onPreRender(PreRenderEvent $event): void
  43. {
  44. $request = $event->getRenderRequest();
  45. if (!$request instanceof TwigRenderRequest) {
  46. return;
  47. }
  48. $block = new RecentOrdersBlock($event->getBlockValue());
  49. $query = $this->createQuery($block);
  50. $pagerfanta = new Pagerfanta(new OrderListAdapter($this->orderService, $query));
  51. $pagerfanta->setCurrentPage(
  52. $this->getCurrentPage(self::PAGINATION_PAGE_PARAM_PREFIX . $block->getId())
  53. );
  54. $pagerfanta->setMaxPerPage($block->getLimit() ?? self::PAGINATION_DEFAULT_LIMIT);
  55. $request->addParameter('orders', $pagerfanta);
  56. }
  57. private function createQuery(RecentOrdersBlock $block): OrderQuery
  58. {
  59. $query = new OrderQuery($this->createCriteria($block));
  60. $query->setSortClauses([new Created(OrderQuery::SORT_DESC)]);
  61. return $query;
  62. }
  63. private function createCriteria(RecentOrdersBlock $block): ?CriterionInterface
  64. {
  65. $criteria = [];
  66. $statuses = $block->getStatuses();
  67. if (!empty($statuses) && $statuses !== [self::ALL_STATUSES]) {
  68. $criteria[] = new StatusCriterion($statuses);
  69. }
  70. return empty($criteria) ? null : new LogicalAnd(...$criteria);
  71. }
  72. private function getCurrentPage(string $pageParam): int
  73. {
  74. $request = $this->requestStack->getMainRequest();
  75. if ($request === null) {
  76. return self::PAGINATION_DEFAULT_CURRENT_PAGE;
  77. }
  78. return $request->query->getInt($pageParam, self::PAGINATION_DEFAULT_CURRENT_PAGE);
  79. }
  80. }