vendor/ibexa/payment/src/bundle/EventSubscriber/MainMenuSubscriber.php line 41

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\Payment\EventSubscriber;
  8. use Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent;
  9. use Ibexa\Contracts\Payment\Payment\Permission as Payment;
  10. use Ibexa\Contracts\Payment\PaymentMethod\Permission as PaymentMethod;
  11. use Ibexa\Contracts\ProductCatalog\PermissionResolverInterface;
  12. use JMS\TranslationBundle\Model\Message;
  13. use JMS\TranslationBundle\Translation\TranslationContainerInterface;
  14. use Knp\Menu\ItemInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. final class MainMenuSubscriber implements EventSubscriberInterface, TranslationContainerInterface
  17. {
  18. public const ITEM_COMMERCE = 'main__commerce';
  19. public const ITEM_COMMERCE_PAYMENTS = 'main__commerce__payments';
  20. public const ITEM_COMMERCE_PAYMENT_METHODS = 'main__commerce__payment_methods';
  21. public const ITEM_COMMERCE_GROUP_SETTINGS = 'main__commerce__group_settings';
  22. private PermissionResolverInterface $permissionResolver;
  23. public function __construct(PermissionResolverInterface $permissionResolver)
  24. {
  25. $this->permissionResolver = $permissionResolver;
  26. }
  27. public static function getSubscribedEvents(): array
  28. {
  29. return [
  30. ConfigureMenuEvent::MAIN_MENU => ['onConfigureMainMenu', 5],
  31. ];
  32. }
  33. public function onConfigureMainMenu(ConfigureMenuEvent $event): void
  34. {
  35. $menu = $event->getMenu();
  36. if ($this->permissionResolver->canUser(new Payment\View())) {
  37. $this->getCommerceRoot($menu)->addChild(
  38. self::ITEM_COMMERCE_PAYMENTS,
  39. [
  40. 'route' => 'ibexa.payment.payment.list',
  41. 'extras' => [
  42. 'orderNumber' => 20,
  43. 'routes' => [
  44. [
  45. 'pattern' => '~^ibexa\.payment\.payment\.~',
  46. ],
  47. ],
  48. ],
  49. ]
  50. );
  51. }
  52. if ($this->permissionResolver->canUser(new PaymentMethod\View())) {
  53. $groupSettingsRoot = $this->getGroupSettingsRoot($this->getCommerceRoot($menu));
  54. $groupSettingsRoot->addChild(
  55. self::ITEM_COMMERCE_PAYMENT_METHODS,
  56. [
  57. 'route' => 'ibexa.payment.payment_method.list',
  58. 'extras' => [
  59. 'orderNumber' => 110,
  60. 'routes' => [
  61. [
  62. 'pattern' => '~^ibexa\.payment\.payment_method\.~',
  63. ],
  64. ],
  65. ],
  66. ]
  67. );
  68. }
  69. }
  70. public static function getTranslationMessages(): array
  71. {
  72. return [
  73. (new Message(self::ITEM_COMMERCE, 'ibexa_menu'))->setDesc('Commerce'),
  74. (new Message(self::ITEM_COMMERCE_PAYMENTS, 'ibexa_menu'))->setDesc('Payments'),
  75. (new Message(self::ITEM_COMMERCE_PAYMENT_METHODS, 'ibexa_menu'))->setDesc('Payment methods'),
  76. (new Message(self::ITEM_COMMERCE_GROUP_SETTINGS, 'ibexa_menu'))->setDesc('Settings'),
  77. ];
  78. }
  79. private function addCommerceMenu(ItemInterface $menu): ItemInterface
  80. {
  81. return $menu->addChild(
  82. self::ITEM_COMMERCE,
  83. [
  84. 'attributes' => [
  85. 'data-tooltip-placement' => 'right',
  86. 'data-tooltip-extra-class' => 'ibexa-tooltip--navigation',
  87. ],
  88. 'extras' => [
  89. 'icon' => 'cart-full',
  90. 'orderNumber' => 100,
  91. ],
  92. ]
  93. );
  94. }
  95. private function getCommerceRoot(ItemInterface $menu): ItemInterface
  96. {
  97. $root = $menu->getChild(self::ITEM_COMMERCE);
  98. if ($root === null) {
  99. $root = $this->addCommerceMenu($menu);
  100. }
  101. return $root;
  102. }
  103. private function getGroupSettingsRoot(ItemInterface $menu): ItemInterface
  104. {
  105. $groupSettingsRoot = $menu->getChild(self::ITEM_COMMERCE_GROUP_SETTINGS);
  106. if ($groupSettingsRoot === null) {
  107. $groupSettingsRoot = $menu->addChild(
  108. self::ITEM_COMMERCE_GROUP_SETTINGS,
  109. [
  110. 'extras' => [
  111. 'orderNumber' => 100,
  112. ],
  113. ],
  114. );
  115. }
  116. return $groupSettingsRoot;
  117. }
  118. }