vendor/contao/news-bundle/src/EventListener/PreviewUrlCreateListener.php line 47

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\NewsBundle\EventListener;
  11. use Contao\CoreBundle\Event\PreviewUrlCreateEvent;
  12. use Contao\CoreBundle\Framework\ContaoFramework;
  13. use Contao\NewsModel;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. /**
  17.  * @internal
  18.  */
  19. class PreviewUrlCreateListener
  20. {
  21.     /**
  22.      * @var RequestStack
  23.      */
  24.     private $requestStack;
  25.     /**
  26.      * @var ContaoFramework
  27.      */
  28.     private $framework;
  29.     public function __construct(RequestStack $requestStackContaoFramework $framework)
  30.     {
  31.         $this->requestStack $requestStack;
  32.         $this->framework $framework;
  33.     }
  34.     /**
  35.      * Adds the news ID to the front end preview URL.
  36.      *
  37.      * @throws \RuntimeException
  38.      */
  39.     public function __invoke(PreviewUrlCreateEvent $event): void
  40.     {
  41.         if (!$this->framework->isInitialized() || 'news' !== $event->getKey()) {
  42.             return;
  43.         }
  44.         $request $this->requestStack->getCurrentRequest();
  45.         if (null === $request) {
  46.             throw new \RuntimeException('The request stack did not contain a request');
  47.         }
  48.         // Return on the news archive list page
  49.         if ('tl_news' === $request->query->get('table') && !$request->query->has('act')) {
  50.             return;
  51.         }
  52.         if ((!$id $this->getId($event$request)) || (!$newsModel $this->getNewsModel($id))) {
  53.             return;
  54.         }
  55.         $event->setQuery('news='.$newsModel->id);
  56.     }
  57.     /**
  58.      * @return int|string
  59.      */
  60.     private function getId(PreviewUrlCreateEvent $eventRequest $request)
  61.     {
  62.         // Overwrite the ID if the news settings are edited
  63.         if ('tl_news' === $request->query->get('table') && 'edit' === $request->query->get('act')) {
  64.             return $request->query->get('id');
  65.         }
  66.         return $event->getId();
  67.     }
  68.     /**
  69.      * @param int|string $id
  70.      */
  71.     private function getNewsModel($id): ?NewsModel
  72.     {
  73.         /** @var NewsModel $adapter */
  74.         $adapter $this->framework->getAdapter(NewsModel::class);
  75.         return $adapter->findByPk($id);
  76.     }
  77. }