custom/plugins/SteincoProducts/src/Subscriber/PrepareRendering.php line 37

Open in your IDE?
  1. <?php declare (strict_types 1);
  2. namespace Schoettler\SteincoProducts\Subscriber;
  3. use Shopware\Storefront\Event\StorefrontRenderEvent;
  4. use Shopware\Storefront\Page\GenericPageLoadedEvent;
  5. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\DomCrawler\Crawler;
  8. use Shopware\Core\System\SystemConfig\SystemConfigService;
  9. use Schoettler\SteincoProducts\SharedFunctions;
  10. class PrepareRendering implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * @var SystemConfigService
  14.      */
  15.     
  16.     private $systemConfigService;
  17.     public function __construct(SystemConfigService $systemConfigService)
  18.     {
  19.         $this->systemConfigService $systemConfigService;
  20.     }
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             StorefrontRenderEvent::class => 'onStorefrontRender',
  25.             GenericPageLoadedEvent::class => 'onPageLoaded',
  26.             'kernel.response' => 'onKernelResponse'
  27.         ];
  28.     }
  29.     public function onKernelResponse(ResponseEvent $event): void
  30.     {
  31.         return; // HALLO
  32.         $response $event->getResponse();
  33.         // Check if the response is a type that doesn't allow content to be set (e.g. when generating a PDF)
  34.         if ($response instanceof Symfony\Component\HttpFoundation\StreamedResponse || $response instanceof Symfony\Component\HttpFoundation\BinaryFileResponse) {
  35.             // Unfortunately, the query does not work; it is unclear why.
  36.         return;
  37.         }
  38.         try {
  39.         $content $response->getContent();
  40.             if ( $content === false) {
  41.                 return;
  42.             }
  43.         } catch (\LogicException $e) {
  44.             return;
  45.         }
  46.         // Minify HTML
  47.         $search = array(
  48.             '/\>[^\S ]+/s',     // strip whitespaces after tags, except space
  49.             '/[^\S ]+\</s',     // strip whitespaces before tags, except space
  50.             '/(\s{2,})/s',      // replace two or more spaces with a single space
  51.         );
  52.         $replace = array(
  53.             '>',
  54.             '<',
  55.             ' ',
  56.         );
  57.         $content preg_replace($search$replace$content);
  58.         $content preg_replace_callback(
  59.             '/<!--(.*?)-->/s',
  60.             function($matches) {
  61.                 // Kommentar entfernen
  62.                 return '';
  63.             },
  64.             $content
  65.         );
  66.         $response->setContent($content);
  67.     }
  68.     public function onPageLoaded(GenericPageLoadedEvent $event): void
  69.     {
  70.         return;
  71.         $page $event->getPage();
  72.     }
  73.     public function onStorefrontRender(StorefrontRenderEvent $event)
  74.     {
  75. /*
  76.         $t3StyleSheets = "";
  77.         $t3ScriptsHead = "";
  78.         $t3ScriptsBody = "";
  79.         $t3MainMenu = "";
  80.         $t3Jumbotron = "";
  81.         $t3Footer = "";
  82. */
  83.         // get the "empty" TYPO3 page
  84.         // Determine the language based on the URL path
  85.         // The language is set to 'en' by default, and then updated if a specific language code is found in the URL
  86.         // Supported languages: German (de), Spanish (es), French (fr), Italian (it), Russian (ru), Danish (da/dk), Swedish (sv)
  87.         // 
  88.         // Each preg_match checks for the following patterns in the URL:
  89.         // 1. "/xx/" - language code followed by a slash (e.g., "/de/")
  90.         // 2. "/xx " - language code followed by a space
  91.         // 3. "/xx?" - language code followed by a question mark (for query parameters)
  92.         // 4. "/xx$" - language code at the end of the URL
  93.         // Where 'xx' is the two-letter language code (de, es, fr, it, ru, da, dk, sv)
  94.         $lang = ( preg_match"/\/de\/|\/de\ |\/de\?|\/de$/"$_SERVER['REQUEST_URI']) == "de" "en");
  95.         $lang = ( preg_match"/\/es\/|\/es\ |\/es\?|\/es$/"$_SERVER['REQUEST_URI']) == "es" $lang);
  96.         $lang = ( preg_match"/\/fr\/|\/fr\ |\/fr\?|\/fr$/"$_SERVER['REQUEST_URI']) == "fr" $lang);
  97.         $lang = ( preg_match"/\/it\/|\/it\ |\/it\?|\/it$/"$_SERVER['REQUEST_URI']) == "it" $lang);
  98.         $lang = ( preg_match"/\/ru\/|\/ru\ |\/ru\?|\/ru$/"$_SERVER['REQUEST_URI']) == "ru" $lang);
  99.         $lang = ( preg_match"/\/da\/|\/da\ |\/da\?|\/da$/"$_SERVER['REQUEST_URI']) == "da" $lang);
  100.         $lang = ( preg_match"/\/dk\/|\/dk\ |\/dk\?|\/dk$/"$_SERVER['REQUEST_URI']) == "da" $lang);
  101.         $lang = ( preg_match"/\/sv\/|\/sv\ |\/sv\?|\/sv$/"$_SERVER['REQUEST_URI']) == "sv" $lang);
  102.         // Hallo: currently disabled. Enable after intense testing!
  103.         /*
  104.         if ( session_status() == PHP_SESSION_NONE)
  105.             session_start();
  106.         if(isset($_SESSION['t3Uwrl' . $lang]) && $_SESSION['t3Url' . $lang] !== "") {
  107.             $t3StyleSheets = $_SESSION['t3StyleSheets.' . $lang];
  108.             $t3ScriptsHead = $_SESSION['t3ScriptsHead.' . $lang];
  109.             $t3ScriptsBody = $_SESSION['t3ScriptsBody.' . $lang];
  110.             $t3MainMenu = $_SESSION['t3MainMenu.' . $lang];
  111.             $t3Jumbotron = $_SESSION['t3Jumbotron.' . $lang];
  112.             $t3Footer = $_SESSION['t3Footer.' . $lang];
  113.         }
  114.         else */
  115.         {
  116.             if ( true) {
  117.                 $opts=array(
  118.                     "http" => array(
  119.                         "header" => "X-Forwarded-For: " SharedFunctions::getRemoteIP() . "\r\n",
  120.                     ),
  121.                     "ssl"=>array(
  122.                         "verify_peer"=>false,
  123.                         "verify_peer_name"=>false,
  124.                     ),
  125.                 ); 
  126.                 $url $this->systemConfigService->get('SteincoProductsController.config.cmsUrl');
  127.                 // add language if not "en"
  128.                 if($lang !== 'en') {
  129.                     $url .= '/';
  130.                     $url .= $lang;
  131.                 }
  132.                 // add blank
  133.                 $url .= '/blank';
  134.                 // using q "shop" sales channel => /blank2
  135.                 $salesChannelName $event->getSalesChannelContext()->getSalesChannel()->getTranslated()['name']
  136.                                                 ?? $event->getSalesChannelContext()->getSalesChannel()->getName();
  137.                 if (($salesChannelName != null) && (strpos(strtolower($salesChannelName), 'shop.') === 0)) {
  138.                     $url .= '2';
  139.                 }
  140.                 $fileStream = @\fopen(strval($url), 'r'falsestream_context_create($opts));
  141.                 
  142.                 if ($fileStream === false) {
  143.                     $error error_get_last();
  144.                     throw new \Exception('Failed to open stream for URL ' $url ': ' $error['message']);
  145.                 }
  146.                 $html stream_get_contents($fileStream);
  147.                 fclose($fileStream);
  148.                 if ($html === false) {
  149.                     $error error_get_last();
  150.                     throw new \Exception('Failed to get stream contents for URL ' $url ': ' $error['message']);
  151.                 }
  152.                 $crawler = new Crawler($html);
  153.                 // check, if we have to change the logo image
  154.                 $alternateImage $crawler->filter('div#alternateImage > img');
  155.                 if ($alternateImage->count() > 0) {
  156.                     $alternateImageSrc $alternateImage->getNode(0)->getAttribute('src');
  157.                     if ($alternateImageSrc) {
  158.                         // find the standard logo
  159.                         $originalImage $crawler->filter('a.navbar-brand > img');
  160.                         $originalImage $crawler->filter('.navbar-brand img.img-fluid');
  161.                         if ($originalImage->count() > 0) {
  162.                             $originalImage->getNode(0)->setAttribute('src'$alternateImageSrc);
  163.                         }
  164.                     }
  165.                 }
  166.                 // do the same with an alternate telephone number
  167.                 $alternateTel $crawler->filter('div#alternateTel > a');
  168.                 if ($alternateTel->count() > 0) {
  169.                     $originalTel $crawler->filter('a.nav-link[href^="tel:"]');
  170.                     if ($originalTel->count() > 0) {
  171.                         $originalTelNode $originalTel->getNode(0);
  172.                         $alternateTelNode $alternateTel->getNode(0);
  173.                         // Ersetze href und Textinhalt des ursprünglichen Elements durch die des alternativen Elements
  174.                         $originalTelNode->setAttribute('href'$alternateTelNode->getAttribute('href'));
  175.                         $originalTelNode->nodeValue $alternateTelNode->nodeValue;
  176.                     }
  177.                 }
  178.                 // get the main menu
  179.                 $elems $crawler->filterXPath("//nav[@id='main-navbar']");
  180.                 $t3MainMenu $this->getOuterHtml($elems) ;
  181.                 // $elems = $crawler->filter('//div[contains(@class="jumbotron")]');
  182.                 $elems $crawler->filterXPath('//div[contains(concat(" ", normalize-space(@class), " "), " jumbotron ")]');
  183.                 $t3Jumbotron $this->getOuterHtml($elems) ;
  184.                 // get footer
  185.                 $elems $crawler->filterXPath('//footer');
  186.                 $t3Footer $this->getInnerHtml$elems);
  187.                 // get scripts and stylesheets
  188.                 $t3ScriptsHead $this->getScripts'head'$html);
  189.                 $t3ScriptsBody $this->getScripts'body'$html);
  190.                 /*
  191.                 $elems = $crawler->filterXpath("//head/script[@type='text/javascript']");
  192.                 $t3ScriptsHead = $this->getOuterHtml($elems);
  193.                 $elems = $crawler->filterXpath("//head/script[@type='text/plain']");
  194.                 $t3ScriptsHead .= $this->getOuterHtml($elems);
  195.                 */
  196.                 // $elems = $crawler->filterXpath("//body/script[@type='text/javascript']");
  197.                 // $elems = $crawler->filterXpath("//body/script[not(@src[contains(.,'bootstrap')])]");
  198.                 // $elems = $crawler->filterXpath("//body/script");
  199.                 // $t3ScriptsBody = $this->getOuterHtml($elems);
  200.                 // $elems = $crawler->filterXpath("//body/script[@type='text/plain']");
  201.                 // $t3ScriptsBody .= $this->getOuterHtml($elems);
  202.                 $elems $crawler->filterXpath("//link[@rel='stylesheet']");
  203.                 $t3StyleSheets $this->getOuterHtml($elems);
  204.                 /*
  205.                 $_SESSION['t3StyleSheets.' . $lang] = $t3StyleSheets;
  206.                 $_SESSION['t3ScriptsHead.' . $lang] = $t3ScriptsHead;
  207.                 $_SESSION['t3ScriptsBody.' . $lang] = $t3ScriptsBody;
  208.                 $_SESSION['t3MainMenu.' . $lang] = $t3MainMenu;
  209.                 $_SESSION['t3Jumbotron.' . $lang] = $t3Jumbotron;
  210.                 $_SESSION['t3Footer.' . $lang] = $t3Footer;
  211.                 $_SESSION['t3Url' . $lang] = $url;
  212.                 */
  213.             }
  214.         }
  215.         $event->setParameter('t3StyleSheets'$t3StyleSheets);
  216.         $event->setParameter('t3ScriptsHead'$t3ScriptsHead);
  217.         $event->setParameter('t3ScriptsBody'$t3ScriptsBody);
  218.         $event->setParameter('t3MainMenu'$t3MainMenu);
  219.         $event->setParameter('t3Jumbotron'$t3Jumbotron);
  220.         $event->setParameter('t3Footer'$t3Footer);
  221.     }
  222.     protected function getOuterHtml($nodes): string
  223.     {
  224.         $outerHTML '';
  225.         if (isset($nodes) && $nodes->count() > 0) {
  226.             foreach ($nodes as $node) {
  227.                 $outerHTML .= $node->ownerDocument->saveHtml($node);
  228.             }
  229.         }
  230.         return $outerHTML;
  231.     }
  232.     protected function getInnerHtml($node): string
  233.     {
  234.         $innerHTML '';
  235.         if (isset($node) && $node->count() > 0) {
  236.             $children $node->children();
  237.             foreach ($children as $child) {
  238.                 $innerHTML .= $child->ownerDocument->saveHtml($child);
  239.             }
  240.         }
  241.         return $innerHTML;
  242.     }
  243.     protected function getScripts($tag$html): string
  244.     {
  245.         $out "";
  246.         $start preg_quote('<' $tag'/');
  247.         $end preg_quote('</' $tag '>''/');
  248.         if (preg_match("/$start"[ \>](.*)$end/s"$html$header)) {
  249.             // file_put_contents( "/var/www/vhosts/rollen-und-raeder.de/" . strftime( "%H%M%S", time()) . ".txt", $header[0]);
  250.             $start preg_quote('<script''/');
  251.             $end preg_quote('</script>''/');
  252.             preg_match_all("/$start(.*?)$end/s"$header[0], $scripts);
  253.             foreach ($scripts[0] as $script) {
  254.                 if ((strpos($script'bootstrap') === false) && (strpos($script'easing') === false)) {
  255.                     $out .= $script PHP_EOL;
  256.                 }
  257.             }
  258.             // file_put_contents( "/var/www/vhosts/rollen-und-raeder.de/" . strftime( "%H%M%S", time()) . ".js", $out);
  259.         }
  260.         return $out;
  261.     }
  262. }