101 lines
2.7 KiB
PHP
101 lines
2.7 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Esun3d\LanguageUrlStoreResolver\Observer;
|
|
|
|
use Esun3d\LanguageUrlStoreResolver\Model\Config;
|
|
use Esun3d\LanguageUrlStoreResolver\Model\HtmlLinkProcessor;
|
|
use Esun3d\LanguageUrlStoreResolver\Model\StoreCodeMapper;
|
|
use Magento\Framework\App\Response\Http as HttpResponse;
|
|
use Magento\Framework\Event\Observer;
|
|
use Magento\Framework\Event\ObserverInterface;
|
|
use Magento\Store\Model\StoreManagerInterface;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
class RewritePageLinksObserver implements ObserverInterface
|
|
{
|
|
/**
|
|
* @var Config
|
|
*/
|
|
private $config;
|
|
|
|
/**
|
|
* @var HtmlLinkProcessor
|
|
*/
|
|
private $htmlLinkProcessor;
|
|
|
|
/**
|
|
* @var StoreManagerInterface
|
|
*/
|
|
private $storeManager;
|
|
|
|
/**
|
|
* @var StoreCodeMapper
|
|
*/
|
|
private $storeCodeMapper;
|
|
|
|
/**
|
|
* @var LoggerInterface
|
|
*/
|
|
private $logger;
|
|
|
|
/**
|
|
* @param Config $config
|
|
* @param HtmlLinkProcessor $htmlLinkProcessor
|
|
* @param StoreManagerInterface $storeManager
|
|
* @param StoreCodeMapper $storeCodeMapper
|
|
* @param LoggerInterface $logger
|
|
*/
|
|
public function __construct(
|
|
Config $config,
|
|
HtmlLinkProcessor $htmlLinkProcessor,
|
|
StoreManagerInterface $storeManager,
|
|
StoreCodeMapper $storeCodeMapper,
|
|
LoggerInterface $logger
|
|
) {
|
|
$this->config = $config;
|
|
$this->htmlLinkProcessor = $htmlLinkProcessor;
|
|
$this->storeManager = $storeManager;
|
|
$this->storeCodeMapper = $storeCodeMapper;
|
|
$this->logger = $logger;
|
|
}
|
|
|
|
/**
|
|
* Rewrite internal links after the complete frontend page is rendered.
|
|
*
|
|
* @param Observer $observer
|
|
* @return void
|
|
*/
|
|
public function execute(Observer $observer): void
|
|
{
|
|
if (!$this->config->isEnabled()) {
|
|
return;
|
|
}
|
|
|
|
$response = $observer->getData('response');
|
|
if (!$response instanceof HttpResponse) {
|
|
return;
|
|
}
|
|
|
|
$body = (string)$response->getBody();
|
|
if (stripos($body, '<html') === false || stripos($body, '<a') === false) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
$storeCode = (string)$this->storeManager->getStore()->getCode();
|
|
$language = $this->storeCodeMapper->languageFromStoreCode($storeCode);
|
|
if ($language === null) {
|
|
return;
|
|
}
|
|
|
|
$response->setBody($this->htmlLinkProcessor->process($body, $language));
|
|
} catch (\Throwable $exception) {
|
|
$this->logger->error(
|
|
'[LanguageUrlStoreResolver] Failed to convert links in page HTML.',
|
|
['exception' => $exception]
|
|
);
|
|
}
|
|
}
|
|
}
|