Як прибрати Store Code з URL для основного магазину в Magento 2
Вихідні дані: є магазин з двома мовними версіями, наприклад, ua та en, версія українською мовою - основна. Задача: прибрати store code з адреси основного магазину, тобто замість https://mysite.com/ua/ зробити просто https://mysite.com/, міжнародну версію залишити без змін - https://mysite.com/en/.
Для цього нам треба навісити плагін на метод getBaseUrl класу Magento\Store\Model\Store.
-
Створюємо заготовку для модуля в директорії Noon/HideDefaultStoreCode
registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Noon_HideDefaultStoreCode', __DIR__ );
etc/module.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Noon_HideDefaultStoreCode" setup_version="0.1.0" /> </config>
-
Додаємо до адмінки опцію для включення/відключення Store Code в URL
etc/adminhtml/system.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd"> <system> <section id="web"> <group id="url"> <field id="hide_default_store_code" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1"> <label>Hide Default Store Code</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> </group> </section> </system> </config>
Результатом буде такий вигляд адмінки
Задаємо значення No на замовчання
etc/config.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> <default> <web> <url> <hide_default_store_code>0</hide_default_store_code> </url> </web> </default> </config>
-
Робимо хелпер для можливості отримати значення налаштування з адмін-панелі
Helper/Data.php
<?php namespace Noon\HideDefaultStoreCode\Helper; class Data extends \Magento\Framework\App\Helper\AbstractHelper { const XML_PATH_HIDE_DEFAULT_STORE_CODE = 'web/url/hide_default_store_code'; /** * * @var \Magento\Framework\App\Config\ScopeConfigInterface */ protected $scopeConfig; /** * * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig */ public function __construct( \Magento\Framework\App\Helper\Context $context, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig ) { parent::__construct($context); $this->scopeConfig = $scopeConfig; } /** * * @return boolean */ public function isHideDefaultStoreCode() { if ($this->scopeConfig->getValue(self::XML_PATH_HIDE_DEFAULT_STORE_CODE, \Magento\Store\Model\ScopeInterface::SCOPE_STORE)) { return true; } return false; } }
-
Створюємо after-плагін
etc/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Store\Model\Store"> <plugin name="Noon_hide_default_store_code" type="\Noon\HideDefaultStoreCode\Plugin\Model\HideDefaultStoreCode" sortOrder="0" /> </type> </config>
Plugin/Model/HideDefaultStoreCode.php
<?php namespace Noon\HideDefaultStoreCode\Plugin\Model; class HideDefaultStoreCode { /** * * @var \Noon\HideDefaultStoreCode\Helper\Data */ protected $helper; /** * * @var \Magento\Store\Model\StoreManagerInterface */ protected $storeManager; /** * * @param \Noon\HideDefaultStoreCode\Helper\Data $helper * @param \Magento\Store\Model\StoreManagerInterface $storeManager */ public function __construct( \Noon\HideDefaultStoreCode\Helper\Data $helper, \Magento\Store\Model\StoreManagerInterface $storeManager ){ $this->helper = $helper; $this->storeManager = $storeManager; } /** * * @param \Magento\Store\Model\Store $subject * @param string $url * @return string */ public function afterGetBaseUrl(\Magento\Store\Model\Store $subject, $url) { if ($this->helper->isHideDefaultStoreCode()) { $url = str_replace('/'.$this->storeManager->getDefaultStoreView()->getCode().'/','/', $url); } return $url; } }
Репозиторій плагіна - https://github.com/alex-79/magento2-hide-default-store-code-from-url.