Files
2026-09-15 10:35:56 +08:00

91 lines
2.9 KiB
PHP

<?php
namespace Esun3d\LanguageUrlStoreResolver\Controller\Switch;
use Esun3d\LanguageUrlStoreResolver\Model\LanguageResolver;
use Esun3d\LanguageUrlStoreResolver\Model\StoreCodeMapper;
use Esun3d\LanguageUrlStoreResolver\Observer\AddHttpContextObserver;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\Http\Context as HttpContext;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Store\Model\StoreManagerInterface;
use Psr\Log\LoggerInterface;
class Index extends Action
{
public function __construct(
Context $context,
protected JsonFactory $resultJsonFactory,
protected RequestInterface $request,
protected HttpContext $httpContext,
protected StoreManagerInterface $storeManager,
protected StoreCodeMapper $storeCodeMapper,
protected LanguageResolver $languageResolver
){
parent::__construct($context);
}
private function resolveStoreCode(): string
{
try {
$storeCode = $this->storeManager->getStore()->getCode();
return $this->storeCodeMapper->isRealStoreCodeInScope($storeCode)
? $storeCode
: $this->resolveDefaultStoreCode();
} catch (\Throwable $exception) {
return $this->resolveDefaultStoreCode();
}
}
private function resolveDefaultStoreCode(): string
{
$language = $this->request instanceof \Magento\Framework\App\Request\Http
? $this->languageResolver->resolveFromPath($this->request->getPathInfo())
: null;
if ($language === null) {
return '';
}
return $this->storeCodeMapper->getDefaultStoreCodeForLanguage($language) ?: '';
}
public function execute()
{
$country = $this->getRequest()->getParam('country');
$language = $this->getRequest()->getParam('language');
$success = false;
if (!empty($country) && !empty($language)) {
$market = strtolower($language).'_'.strtoupper($country);
$storeCode = $this->resolveStoreCode();
$logger = ObjectManager::getInstance()->get(LoggerInterface::class);
$logger->info('$market: '.$market);
$this->httpContext->setValue(
AddHttpContextObserver::CONTEXT_MARKET,
$market,
$this->resolveDefaultStoreCode()
);
$this->httpContext->setValue(
AddHttpContextObserver::CONTEXT_STORE_CODE,
$storeCode,
$this->resolveDefaultStoreCode()
);
$success = true;
}
return $this->resultJsonFactory->create()
->setData([
'success'=>$success,
'country'=>$country,
'language'=>$language
]);
}
}