vendor/aufwind/cookiebot-bundle/src/EventSubscriber/PimcoreVideoSubscriber.php line 35

Open in your IDE?
  1. <?php
  2. declare(strict_types 1);
  3. namespace Aufwind\CookiebotBundle\EventSubscriber;
  4. use Aufwind\CookiebotBundle\CookiebotService;
  5. use Aufwind\CookiebotBundle\Helper\YoutubeFallbackRenderer;
  6. use Aufwind\CookiebotBundle\Service\ConfigManager;
  7. use Pimcore\Bundle\CoreBundle\EventListener\Traits\EnabledTrait;
  8. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  9. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PreviewRequestTrait;
  10. use Pimcore\Bundle\CoreBundle\EventListener\Traits\ResponseInjectionTrait;
  11. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  12. use Pimcore\Tool;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  15. use Symfony\Component\HttpKernel\KernelEvents;
  16. class PimcoreVideoSubscriber implements EventSubscriberInterface
  17. {
  18.     use EnabledTrait;
  19.     use ResponseInjectionTrait;
  20.     use PimcoreContextAwareTrait;
  21.     use PreviewRequestTrait;
  22.     public function __construct(
  23.         protected ConfigManager $configManager,
  24.         protected CookiebotService $cookiebotService,
  25.         protected YoutubeFallbackRenderer $youtubeFallbackRenderer,
  26.     ) {
  27.     }
  28.     public function onKernelResponse(ResponseEvent $event): void
  29.     {
  30.         if (!$this->configManager->isAutoInsert()) {
  31.             return;
  32.         }
  33.         if (!$this->isEnabled()) {
  34.             return;
  35.         }
  36.         $request $event->getRequest();
  37.         if (!$event->isMainRequest()) {
  38.             return;
  39.         }
  40.         // only inject tag manager code on non-admin requests
  41.         if (!$this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  42.             return;
  43.         }
  44.         if (!Tool::useFrontendOutputFilters()) {
  45.             return;
  46.         }
  47.         if ($this->isPreviewRequest($request)) {
  48.             return;
  49.         }
  50.         $response $event->getResponse();
  51.         if (!$this->isHtmlResponse($response)) {
  52.             return;
  53.         }
  54.         if (!$this->cookiebotService->isCookieBotEnabled()) {
  55.             return;
  56.         }
  57.         $content $response->getContent();
  58.         $pattern "/<iframe(.*?)><\/iframe>/mi";
  59.         $matches = [];
  60.         if (false === preg_match_all($pattern$content$matches)) {
  61.             return;
  62.         }
  63.         $replaced false;
  64.         foreach ($matches[0] as $iframeHtml) {
  65.             if (false === strpos($iframeHtml'src="https://www.youtube-nocookie.com/') && false === strpos($iframeHtml'src="https://www.youtube.com/') && false === strpos($iframeHtml'src="https://youtu.be/')) {
  66.                 continue;
  67.             }
  68.                 $newHtml preg_replace('/src="/mi''data-cookieconsent="marketing" data-cookieblock-src="'$iframeHtml);
  69.             if (!empty($newHtml)) {
  70.                 $replaced true;
  71.             }
  72.             $content str_replace($iframeHtml$this->youtubeFallbackRenderer->render($newHtml), $content);
  73.         }
  74.         if ($replaced) {
  75.             $css dirname(__FILE__) . '/../Resources/public/css/cookiebot-draft-video.css';
  76.             $css '<style>' file_get_contents($css) . '</style>';
  77.             $content str_replace('</head>'$css '</head>'$content);
  78.         }
  79.         $response->setContent($content);
  80.     }
  81.     public static function getSubscribedEvents()
  82.     {
  83.         return [
  84.             KernelEvents::RESPONSE => [
  85.                 ['onKernelResponse', -108],
  86.             ],
  87.         ];
  88.     }
  89. }