vendor/contao/core-bundle/src/EventListener/Menu/BackendPreviewListener.php line 64

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of Contao.
  5.  *
  6.  * (c) Leo Feyer
  7.  *
  8.  * @license LGPL-3.0-or-later
  9.  */
  10. namespace Contao\CoreBundle\EventListener\Menu;
  11. use Contao\CoreBundle\Event\ContaoCoreEvents;
  12. use Contao\CoreBundle\Event\MenuEvent;
  13. use Contao\CoreBundle\Event\PreviewUrlCreateEvent;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\Routing\RouterInterface;
  17. use Symfony\Component\Security\Core\Security;
  18. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. /**
  21.  * @internal
  22.  */
  23. class BackendPreviewListener
  24. {
  25.     /**
  26.      * @var Security
  27.      */
  28.     private $security;
  29.     /**
  30.      * @var RouterInterface
  31.      */
  32.     private $router;
  33.     /**
  34.      * @var RequestStack
  35.      */
  36.     private $requestStack;
  37.     /**
  38.      * @var TranslatorInterface
  39.      */
  40.     private $translator;
  41.     /**
  42.      * @var EventDispatcherInterface
  43.      */
  44.     private $eventDispatcher;
  45.     public function __construct(Security $securityRouterInterface $routerRequestStack $requestStackTranslatorInterface $translatorEventDispatcherInterface $eventDispatcher)
  46.     {
  47.         $this->security $security;
  48.         $this->router $router;
  49.         $this->requestStack $requestStack;
  50.         $this->translator $translator;
  51.         $this->eventDispatcher $eventDispatcher;
  52.     }
  53.     public function __invoke(MenuEvent $event): void
  54.     {
  55.         if (!$this->security->isGranted('ROLE_USER')) {
  56.             return;
  57.         }
  58.         $tree $event->getTree();
  59.         if ('headerMenu' !== $tree->getName()) {
  60.             return;
  61.         }
  62.         $preview $event->getFactory()
  63.             ->createItem('preview')
  64.             ->setLabel('MSC.fePreview')
  65.             ->setUri($this->getPreviewUrl())
  66.             ->setLinkAttribute('class''icon-preview')
  67.             ->setLinkAttribute('title'$this->translator->trans('MSC.fePreviewTitle', [], 'contao_default'))
  68.             ->setLinkAttribute('target''_blank')
  69.             ->setLinkAttribute('accesskey''f')
  70.             ->setExtra('translation_domain''contao_default')
  71.         ;
  72.         $children = [];
  73.         // Try adding the preview button after the alerts button
  74.         foreach ($tree->getChildren() as $name => $item) {
  75.             $children[$name] = $item;
  76.             if ('alerts' === $name) {
  77.                 $children['preview'] = $preview;
  78.             }
  79.         }
  80.         // Prepend the preview button if it could not be added above
  81.         if (!isset($children['preview'])) {
  82.             $children = ['preview' => $preview] + $children;
  83.         }
  84.         $tree->setChildren($children);
  85.     }
  86.     private function getPreviewUrl(): string
  87.     {
  88.         if (!$request $this->requestStack->getCurrentRequest()) {
  89.             throw new \RuntimeException('The request stack did not contain a request');
  90.         }
  91.         $id $this->getIdFromRequest($request);
  92.         $do $request->query->get('do''');
  93.         $url $this->router->generate('contao_backend_preview');
  94.         $event = new PreviewUrlCreateEvent($do$id);
  95.         $this->eventDispatcher->dispatch($eventContaoCoreEvents::PREVIEW_URL_CREATE);
  96.         if ($query $event->getQuery()) {
  97.             return $url.'?'.$query;
  98.         }
  99.         return $url;
  100.     }
  101.     private function getIdFromRequest(Request $request): int
  102.     {
  103.         if (!$request->query->has('table')) {
  104.             return (int) $request->query->get('id');
  105.         }
  106.         return (int) $request->getSession()->get('CURRENT_ID');
  107.     }
  108. }