/ #magento 

Як прибрати 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.

  1. Створюємо заготовку для модуля в директорії 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>
    
  2. Додаємо до адмінки опцію для включення/відключення 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>
    

    Результатом буде такий вигляд адмінки howto-hide-default-store-code-from-url-magento-2-1-1

    Задаємо значення 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>
    
  3. Робимо хелпер для можливості отримати значення налаштування з адмін-панелі

    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;
        }
    }
    
  4. Створюємо 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.

Author

Олександр Бобилєв

Залишаю собі право використовувати ненормативну (але інформативну) лексику там, де звичайні слова втрачають сенс і не відображають всієї палітри почуттів, від споглядання навколишньої дійсності.