diff --git a/src/Component/Symfony/Session/Flash/FlashHelper.php b/src/Component/Symfony/Session/Flash/FlashHelper.php index e6cfe595d..ef9ce161f 100644 --- a/src/Component/Symfony/Session/Flash/FlashHelper.php +++ b/src/Component/Symfony/Session/Flash/FlashHelper.php @@ -18,6 +18,7 @@ use Sylius\Component\Resource\Humanizer\StringHumanizer; use Sylius\Component\Resource\Metadata\BulkOperationInterface; use Sylius\Component\Resource\Metadata\Operation; +use Sylius\Component\Resource\Symfony\EventDispatcher\GenericEvent; use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; use Symfony\Component\Translation\TranslatorBagInterface; use Symfony\Contracts\Translation\TranslatorInterface; @@ -32,44 +33,72 @@ public function __construct( public function addSuccessFlash(Operation $operation, Context $context): void { - $this->addFlash($operation, $context, 'success'); + $this->addFlashFromOperation($operation, $context, 'success'); } - private function addFlash(Operation $operation, Context $context, string $type): void + public function addFlashFromEvent(GenericEvent $event, Context $context): void { - $request = $context->get(RequestOption::class)?->request(); + $message = $this->buildEventMessage($event); - if (null === $request) { - return; - } + $this->addFlash($message, $event->getMessageType(), $context); + } - $message = $this->buildMessage($operation, $type); + private function addFlashFromOperation(Operation $operation, Context $context, string $type): void + { + $message = $this->buildOperationMessage($operation, $type); - /** @var FlashBagInterface $flashBag */ - $flashBag = $request->getSession()->getBag('flashes'); + $this->addFlash($message, $type, $context); + } - $flashBag->add($type, $message); + private function buildEventMessage(GenericEvent $event): string + { + $message = $event->getMessage(); + $parameters = $event->getMessageParameters(); + + if (!$this->translator instanceof TranslatorBagInterface) { + return $this->translator->trans($message, $parameters, 'flashes'); + } + + if ($this->translator->getCatalogue()->has($message, 'flashes')) { + return $this->translator->trans($message, $parameters, 'flashes'); + } + + return $message; } - private function buildMessage(Operation $operation, string $type): string + private function buildOperationMessage(Operation $operation, string $type): string { $resource = $operation->getResource(); Assert::notNull($resource); - $specifyKey = sprintf('%s.%s.%s', $resource->getApplicationName() ?? '', $resource->getName() ?? '', $operation->getShortName() ?? ''); - $defaultKey = sprintf('sylius.resource.%s', $operation->getShortName() ?? ''); + $key = sprintf('%s.%s.%s', $resource->getApplicationName() ?? '', $resource->getName() ?? '', $operation->getShortName() ?? ''); + $fallbackKey = sprintf('sylius.resource.%s', $operation->getShortName() ?? ''); $parameters = $this->getTranslationParameters($operation); if (!$this->translator instanceof TranslatorBagInterface) { - return $this->translator->trans($defaultKey, $parameters, 'flashes'); + return $this->translator->trans($fallbackKey, $parameters, 'flashes'); } - if ($this->translator->getCatalogue()->has($specifyKey, 'flashes')) { - return $this->translator->trans($specifyKey, $parameters, 'flashes'); + if ($this->translator->getCatalogue()->has($key, 'flashes')) { + return $this->translator->trans($key, $parameters, 'flashes'); } - return $this->translator->trans($defaultKey, $parameters, 'flashes'); + return $this->translator->trans($fallbackKey, $parameters, 'flashes'); + } + + private function addFlash(string $message, string $type, Context $context): void + { + $request = $context->get(RequestOption::class)?->request(); + + if (null === $request) { + return; + } + + /** @var FlashBagInterface $flashBag */ + $flashBag = $request->getSession()->getBag('flashes'); + + $flashBag->add($type, $message); } private function getTranslationParameters(Operation $operation): array diff --git a/src/Component/Symfony/Session/Flash/FlashHelperInterface.php b/src/Component/Symfony/Session/Flash/FlashHelperInterface.php index 937167a94..8c1fa19e7 100644 --- a/src/Component/Symfony/Session/Flash/FlashHelperInterface.php +++ b/src/Component/Symfony/Session/Flash/FlashHelperInterface.php @@ -15,8 +15,11 @@ use Sylius\Component\Resource\Context\Context; use Sylius\Component\Resource\Metadata\Operation; +use Sylius\Component\Resource\Symfony\EventDispatcher\GenericEvent; interface FlashHelperInterface { public function addSuccessFlash(Operation $operation, Context $context): void; + + public function addFlashFromEvent(GenericEvent $event, Context $context): void; } diff --git a/src/Component/spec/Symfony/Session/Flash/FlashHelperSpec.php b/src/Component/spec/Symfony/Session/Flash/FlashHelperSpec.php index 87d8d5fa0..d688a0622 100644 --- a/src/Component/spec/Symfony/Session/Flash/FlashHelperSpec.php +++ b/src/Component/spec/Symfony/Session/Flash/FlashHelperSpec.php @@ -14,11 +14,13 @@ namespace spec\Sylius\Component\Resource\Symfony\Session\Flash; use PhpSpec\ObjectBehavior; +use Prophecy\Argument; use Sylius\Component\Resource\Context\Context; use Sylius\Component\Resource\Context\Option\RequestOption; use Sylius\Component\Resource\Metadata\BulkDelete; use Sylius\Component\Resource\Metadata\Create; use Sylius\Component\Resource\Metadata\Resource; +use Sylius\Component\Resource\Symfony\EventDispatcher\GenericEvent; use Sylius\Component\Resource\Symfony\Session\Flash\FlashHelper; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; @@ -64,7 +66,7 @@ function it_adds_success_flashes_with_specific_message( $this->addSuccessFlash($operation, $context); } - function it_adds_success_flashes_with_default_message( + function it_adds_success_flashes_with_fallback_message( Request $request, SessionInterface $session, FlashBagInterface $flashBag, @@ -158,4 +160,86 @@ function it_adds_success_flashes_with_humanized_message_and_plural_name_on_bulk_ $this->addSuccessFlash($operation, $context); } + + function it_translates_flashes_from_event_when_translator_is_not_a_bag( + Request $request, + SessionInterface $session, + FlashBagInterface $flashBag, + TranslatorInterface $translator, + GenericEvent $event, + ): void { + $context = new Context(new RequestOption($request->getWrappedObject())); + + $request->getSession()->willReturn($session); + + $session->getBag('flashes')->willReturn($flashBag); + + $event->getMessage()->willReturn('app.admin_user.banned'); + $event->getMessageType()->willReturn('success'); + $event->getMessageParameters()->willReturn(['%admin_user%' => 'Darth Vader']); + + $translator->trans('app.admin_user.banned', ['%admin_user%' => 'Darth Vader'], 'flashes')->willReturn('Darth Vader was banned successfully.')->shouldBeCalled(); + + $flashBag->add('success', 'Darth Vader was banned successfully.')->shouldBeCalled(); + + $this->addFlashFromEvent($event, $context); + } + + function it_translates_flashes_from_event_when_translator_is_a_bag( + Request $request, + SessionInterface $session, + FlashBagInterface $flashBag, + TranslatorBagInterface $translator, + MessageCatalogueInterface $messageCatalogue, + GenericEvent $event, + ): void { + $context = new Context(new RequestOption($request->getWrappedObject())); + + $request->getSession()->willReturn($session); + + $session->getBag('flashes')->willReturn($flashBag); + + $event->getMessage()->willReturn('app.admin_user.banned'); + $event->getMessageType()->willReturn('success'); + $event->getMessageParameters()->willReturn(['%admin_user%' => 'Darth Vader']); + + $translator->getCatalogue()->willReturn($messageCatalogue); + + $messageCatalogue->has('app.admin_user.banned', 'flashes')->willReturn(true)->shouldBeCalled(); + + $translator->trans('app.admin_user.banned', ['%admin_user%' => 'Darth Vader'], 'flashes')->willReturn('Darth Vader was banned successfully.')->shouldBeCalled(); + + $flashBag->add('success', 'Darth Vader was banned successfully.')->shouldBeCalled(); + + $this->addFlashFromEvent($event, $context); + } + + function it_does_not_translate_event_message_when_translator_is_a_bag_and_does_not_contains_the_key( + Request $request, + SessionInterface $session, + FlashBagInterface $flashBag, + TranslatorBagInterface $translator, + MessageCatalogueInterface $messageCatalogue, + GenericEvent $event, + ): void { + $context = new Context(new RequestOption($request->getWrappedObject())); + + $request->getSession()->willReturn($session); + + $session->getBag('flashes')->willReturn($flashBag); + + $event->getMessage()->willReturn('Darth Vader was banned successfully.'); + $event->getMessageType()->willReturn('success'); + $event->getMessageParameters()->willReturn([]); + + $translator->getCatalogue()->willReturn($messageCatalogue); + + $messageCatalogue->has('Darth Vader was banned successfully.', 'flashes')->willReturn(false)->shouldBeCalled(); + + $translator->trans(Argument::cetera())->shouldNotBeCalled(); + + $flashBag->add('success', 'Darth Vader was banned successfully.')->shouldBeCalled(); + + $this->addFlashFromEvent($event, $context); + } }