<?php declare (strict_types = 1);
namespace Schoettler\SteincoProducts\Subscriber;
use Shopware\Storefront\Event\StorefrontRenderEvent;
use Shopware\Storefront\Page\GenericPageLoadedEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\DomCrawler\Crawler;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Schoettler\SteincoProducts\SharedFunctions;
class PrepareRendering implements EventSubscriberInterface
{
/**
* @var SystemConfigService
*/
private $systemConfigService;
public function __construct(SystemConfigService $systemConfigService)
{
$this->systemConfigService = $systemConfigService;
}
public static function getSubscribedEvents(): array
{
return [
StorefrontRenderEvent::class => 'onStorefrontRender',
GenericPageLoadedEvent::class => 'onPageLoaded',
'kernel.response' => 'onKernelResponse'
];
}
public function onKernelResponse(ResponseEvent $event): void
{
return; // HALLO
$response = $event->getResponse();
// Check if the response is a type that doesn't allow content to be set (e.g. when generating a PDF)
if ($response instanceof Symfony\Component\HttpFoundation\StreamedResponse || $response instanceof Symfony\Component\HttpFoundation\BinaryFileResponse) {
// Unfortunately, the query does not work; it is unclear why.
return;
}
try {
$content = $response->getContent();
if ( $content === false) {
return;
}
} catch (\LogicException $e) {
return;
}
// Minify HTML
$search = array(
'/\>[^\S ]+/s', // strip whitespaces after tags, except space
'/[^\S ]+\</s', // strip whitespaces before tags, except space
'/(\s{2,})/s', // replace two or more spaces with a single space
);
$replace = array(
'>',
'<',
' ',
);
$content = preg_replace($search, $replace, $content);
$content = preg_replace_callback(
'/<!--(.*?)-->/s',
function($matches) {
// Kommentar entfernen
return '';
},
$content
);
$response->setContent($content);
}
public function onPageLoaded(GenericPageLoadedEvent $event): void
{
return;
$page = $event->getPage();
}
public function onStorefrontRender(StorefrontRenderEvent $event)
{
/*
$t3StyleSheets = "";
$t3ScriptsHead = "";
$t3ScriptsBody = "";
$t3MainMenu = "";
$t3Jumbotron = "";
$t3Footer = "";
*/
// get the "empty" TYPO3 page
// Determine the language based on the URL path
// The language is set to 'en' by default, and then updated if a specific language code is found in the URL
// Supported languages: German (de), Spanish (es), French (fr), Italian (it), Russian (ru), Danish (da/dk), Swedish (sv)
//
// Each preg_match checks for the following patterns in the URL:
// 1. "/xx/" - language code followed by a slash (e.g., "/de/")
// 2. "/xx " - language code followed by a space
// 3. "/xx?" - language code followed by a question mark (for query parameters)
// 4. "/xx$" - language code at the end of the URL
// Where 'xx' is the two-letter language code (de, es, fr, it, ru, da, dk, sv)
$lang = ( preg_match( "/\/de\/|\/de\ |\/de\?|\/de$/", $_SERVER['REQUEST_URI']) == 1 ? "de" : "en");
$lang = ( preg_match( "/\/es\/|\/es\ |\/es\?|\/es$/", $_SERVER['REQUEST_URI']) == 1 ? "es" : $lang);
$lang = ( preg_match( "/\/fr\/|\/fr\ |\/fr\?|\/fr$/", $_SERVER['REQUEST_URI']) == 1 ? "fr" : $lang);
$lang = ( preg_match( "/\/it\/|\/it\ |\/it\?|\/it$/", $_SERVER['REQUEST_URI']) == 1 ? "it" : $lang);
$lang = ( preg_match( "/\/ru\/|\/ru\ |\/ru\?|\/ru$/", $_SERVER['REQUEST_URI']) == 1 ? "ru" : $lang);
$lang = ( preg_match( "/\/da\/|\/da\ |\/da\?|\/da$/", $_SERVER['REQUEST_URI']) == 1 ? "da" : $lang);
$lang = ( preg_match( "/\/dk\/|\/dk\ |\/dk\?|\/dk$/", $_SERVER['REQUEST_URI']) == 1 ? "da" : $lang);
$lang = ( preg_match( "/\/sv\/|\/sv\ |\/sv\?|\/sv$/", $_SERVER['REQUEST_URI']) == 1 ? "sv" : $lang);
// Hallo: currently disabled. Enable after intense testing!
/*
if ( session_status() == PHP_SESSION_NONE)
session_start();
if(isset($_SESSION['t3Uwrl' . $lang]) && $_SESSION['t3Url' . $lang] !== "") {
$t3StyleSheets = $_SESSION['t3StyleSheets.' . $lang];
$t3ScriptsHead = $_SESSION['t3ScriptsHead.' . $lang];
$t3ScriptsBody = $_SESSION['t3ScriptsBody.' . $lang];
$t3MainMenu = $_SESSION['t3MainMenu.' . $lang];
$t3Jumbotron = $_SESSION['t3Jumbotron.' . $lang];
$t3Footer = $_SESSION['t3Footer.' . $lang];
}
else */
{
if ( true) {
$opts=array(
"http" => array(
"header" => "X-Forwarded-For: " . SharedFunctions::getRemoteIP() . "\r\n",
),
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$url = $this->systemConfigService->get('SteincoProductsController.config.cmsUrl');
// add language if not "en"
if($lang !== 'en') {
$url .= '/';
$url .= $lang;
}
// add blank
$url .= '/blank';
// using q "shop" sales channel => /blank2
$salesChannelName = $event->getSalesChannelContext()->getSalesChannel()->getTranslated()['name']
?? $event->getSalesChannelContext()->getSalesChannel()->getName();
if (($salesChannelName != null) && (strpos(strtolower($salesChannelName), 'shop.') === 0)) {
$url .= '2';
}
$fileStream = @\fopen(strval($url), 'r', false, stream_context_create($opts));
if ($fileStream === false) {
$error = error_get_last();
throw new \Exception('Failed to open stream for URL ' . $url . ': ' . $error['message']);
}
$html = stream_get_contents($fileStream);
fclose($fileStream);
if ($html === false) {
$error = error_get_last();
throw new \Exception('Failed to get stream contents for URL ' . $url . ': ' . $error['message']);
}
$crawler = new Crawler($html);
// check, if we have to change the logo image
$alternateImage = $crawler->filter('div#alternateImage > img');
if ($alternateImage->count() > 0) {
$alternateImageSrc = $alternateImage->getNode(0)->getAttribute('src');
if ($alternateImageSrc) {
// find the standard logo
$originalImage = $crawler->filter('a.navbar-brand > img');
$originalImage = $crawler->filter('.navbar-brand img.img-fluid');
if ($originalImage->count() > 0) {
$originalImage->getNode(0)->setAttribute('src', $alternateImageSrc);
}
}
}
// do the same with an alternate telephone number
$alternateTel = $crawler->filter('div#alternateTel > a');
if ($alternateTel->count() > 0) {
$originalTel = $crawler->filter('a.nav-link[href^="tel:"]');
if ($originalTel->count() > 0) {
$originalTelNode = $originalTel->getNode(0);
$alternateTelNode = $alternateTel->getNode(0);
// Ersetze href und Textinhalt des ursprünglichen Elements durch die des alternativen Elements
$originalTelNode->setAttribute('href', $alternateTelNode->getAttribute('href'));
$originalTelNode->nodeValue = $alternateTelNode->nodeValue;
}
}
// get the main menu
$elems = $crawler->filterXPath("//nav[@id='main-navbar']");
$t3MainMenu = $this->getOuterHtml($elems) ;
// $elems = $crawler->filter('//div[contains(@class="jumbotron")]');
$elems = $crawler->filterXPath('//div[contains(concat(" ", normalize-space(@class), " "), " jumbotron ")]');
$t3Jumbotron = $this->getOuterHtml($elems) ;
// get footer
$elems = $crawler->filterXPath('//footer');
$t3Footer = $this->getInnerHtml( $elems);
// get scripts and stylesheets
$t3ScriptsHead = $this->getScripts( 'head', $html);
$t3ScriptsBody = $this->getScripts( 'body', $html);
/*
$elems = $crawler->filterXpath("//head/script[@type='text/javascript']");
$t3ScriptsHead = $this->getOuterHtml($elems);
$elems = $crawler->filterXpath("//head/script[@type='text/plain']");
$t3ScriptsHead .= $this->getOuterHtml($elems);
*/
// $elems = $crawler->filterXpath("//body/script[@type='text/javascript']");
// $elems = $crawler->filterXpath("//body/script[not(@src[contains(.,'bootstrap')])]");
// $elems = $crawler->filterXpath("//body/script");
// $t3ScriptsBody = $this->getOuterHtml($elems);
// $elems = $crawler->filterXpath("//body/script[@type='text/plain']");
// $t3ScriptsBody .= $this->getOuterHtml($elems);
$elems = $crawler->filterXpath("//link[@rel='stylesheet']");
$t3StyleSheets = $this->getOuterHtml($elems);
/*
$_SESSION['t3StyleSheets.' . $lang] = $t3StyleSheets;
$_SESSION['t3ScriptsHead.' . $lang] = $t3ScriptsHead;
$_SESSION['t3ScriptsBody.' . $lang] = $t3ScriptsBody;
$_SESSION['t3MainMenu.' . $lang] = $t3MainMenu;
$_SESSION['t3Jumbotron.' . $lang] = $t3Jumbotron;
$_SESSION['t3Footer.' . $lang] = $t3Footer;
$_SESSION['t3Url' . $lang] = $url;
*/
}
}
$event->setParameter('t3StyleSheets', $t3StyleSheets);
$event->setParameter('t3ScriptsHead', $t3ScriptsHead);
$event->setParameter('t3ScriptsBody', $t3ScriptsBody);
$event->setParameter('t3MainMenu', $t3MainMenu);
$event->setParameter('t3Jumbotron', $t3Jumbotron);
$event->setParameter('t3Footer', $t3Footer);
}
protected function getOuterHtml($nodes): string
{
$outerHTML = '';
if (isset($nodes) && $nodes->count() > 0) {
foreach ($nodes as $node) {
$outerHTML .= $node->ownerDocument->saveHtml($node);
}
}
return $outerHTML;
}
protected function getInnerHtml($node): string
{
$innerHTML = '';
if (isset($node) && $node->count() > 0) {
$children = $node->children();
foreach ($children as $child) {
$innerHTML .= $child->ownerDocument->saveHtml($child);
}
}
return $innerHTML;
}
protected function getScripts($tag, $html): string
{
$out = "";
$start = preg_quote('<' . $tag, '/');
$end = preg_quote('</' . $tag . '>', '/');
if (preg_match("/$start" . "[ \>](.*)$end/s", $html, $header)) {
// file_put_contents( "/var/www/vhosts/rollen-und-raeder.de/" . strftime( "%H%M%S", time()) . ".txt", $header[0]);
$start = preg_quote('<script', '/');
$end = preg_quote('</script>', '/');
preg_match_all("/$start(.*?)$end/s", $header[0], $scripts);
foreach ($scripts[0] as $script) {
if ((strpos($script, 'bootstrap') === false) && (strpos($script, 'easing') === false)) {
$out .= $script . PHP_EOL;
}
}
// file_put_contents( "/var/www/vhosts/rollen-und-raeder.de/" . strftime( "%H%M%S", time()) . ".js", $out);
}
return $out;
}
}