<?php
/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);
namespace Ibexa\Bundle\Payment\EventSubscriber;
use Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent;
use Ibexa\Contracts\Payment\Payment\Permission as Payment;
use Ibexa\Contracts\Payment\PaymentMethod\Permission as PaymentMethod;
use Ibexa\Contracts\ProductCatalog\PermissionResolverInterface;
use JMS\TranslationBundle\Model\Message;
use JMS\TranslationBundle\Translation\TranslationContainerInterface;
use Knp\Menu\ItemInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class MainMenuSubscriber implements EventSubscriberInterface, TranslationContainerInterface
{
public const ITEM_COMMERCE = 'main__commerce';
public const ITEM_COMMERCE_PAYMENTS = 'main__commerce__payments';
public const ITEM_COMMERCE_PAYMENT_METHODS = 'main__commerce__payment_methods';
public const ITEM_COMMERCE_GROUP_SETTINGS = 'main__commerce__group_settings';
private PermissionResolverInterface $permissionResolver;
public function __construct(PermissionResolverInterface $permissionResolver)
{
$this->permissionResolver = $permissionResolver;
}
public static function getSubscribedEvents(): array
{
return [
ConfigureMenuEvent::MAIN_MENU => ['onConfigureMainMenu', 5],
];
}
public function onConfigureMainMenu(ConfigureMenuEvent $event): void
{
$menu = $event->getMenu();
if ($this->permissionResolver->canUser(new Payment\View())) {
$this->getCommerceRoot($menu)->addChild(
self::ITEM_COMMERCE_PAYMENTS,
[
'route' => 'ibexa.payment.payment.list',
'extras' => [
'orderNumber' => 20,
'routes' => [
[
'pattern' => '~^ibexa\.payment\.payment\.~',
],
],
],
]
);
}
if ($this->permissionResolver->canUser(new PaymentMethod\View())) {
$groupSettingsRoot = $this->getGroupSettingsRoot($this->getCommerceRoot($menu));
$groupSettingsRoot->addChild(
self::ITEM_COMMERCE_PAYMENT_METHODS,
[
'route' => 'ibexa.payment.payment_method.list',
'extras' => [
'orderNumber' => 110,
'routes' => [
[
'pattern' => '~^ibexa\.payment\.payment_method\.~',
],
],
],
]
);
}
}
public static function getTranslationMessages(): array
{
return [
(new Message(self::ITEM_COMMERCE, 'ibexa_menu'))->setDesc('Commerce'),
(new Message(self::ITEM_COMMERCE_PAYMENTS, 'ibexa_menu'))->setDesc('Payments'),
(new Message(self::ITEM_COMMERCE_PAYMENT_METHODS, 'ibexa_menu'))->setDesc('Payment methods'),
(new Message(self::ITEM_COMMERCE_GROUP_SETTINGS, 'ibexa_menu'))->setDesc('Settings'),
];
}
private function addCommerceMenu(ItemInterface $menu): ItemInterface
{
return $menu->addChild(
self::ITEM_COMMERCE,
[
'attributes' => [
'data-tooltip-placement' => 'right',
'data-tooltip-extra-class' => 'ibexa-tooltip--navigation',
],
'extras' => [
'icon' => 'cart-full',
'orderNumber' => 100,
],
]
);
}
private function getCommerceRoot(ItemInterface $menu): ItemInterface
{
$root = $menu->getChild(self::ITEM_COMMERCE);
if ($root === null) {
$root = $this->addCommerceMenu($menu);
}
return $root;
}
private function getGroupSettingsRoot(ItemInterface $menu): ItemInterface
{
$groupSettingsRoot = $menu->getChild(self::ITEM_COMMERCE_GROUP_SETTINGS);
if ($groupSettingsRoot === null) {
$groupSettingsRoot = $menu->addChild(
self::ITEM_COMMERCE_GROUP_SETTINGS,
[
'extras' => [
'orderNumber' => 100,
],
],
);
}
return $groupSettingsRoot;
}
}