404 переключатель в магазине с ключом URL-адреса для просмотра магазина товаров


По умолчанию URL Key на странице продукта имеет глобальную область действия.

РЕДАКТИРОВАТЬ: Как предположил Флоринельхис, областью действия могут быть изменения в атрибутах управления. Однако это нарушает поведение переключателя просмотра магазина.

Это было протестировано на 1.7.0.2 с образцами данных и Включена функция "Добавить код магазина в URL".:

  1. отредактируйте продукт и установите другой URL-адрес для определенного просмотра магазина (французский)
  2. Переиндексировать
  3. Открыть страница товара на сайте в представлении магазина на английском языке
  4. Переключитесь на французский: у вас будет URL-адрес страницы, содержащий /French/
  5. Переключитесь обратно на английский -> ошибка страницы 404 (в URL-адресе отсутствует код магазина /default/

    Как заставить его правильно работать с переключателем просмотра/языка магазина?

Подробности:

  • URL для английского языка: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • URL для французского языка: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Если я нахожусь на английском сайте на этой странице -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Затем я переключаюсь на французский:

Я получил этот URL ( код магазина пропущен):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Таким образом, magento переписывает URL правильно, но по какой-то причине пропускает код магазина

Ссылка:

Наверняка это связано с /core/model/store.php и /core/model/url/rewrite.php, и в частности с этими методами:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

ОБНОВЛЕНИЕ

Если вы находитесь на 1.9.1 @Исправление Vinai не будет работать, проверьте новый ответ, который у меня есть добавлено

Author: Fra, 2013-02-13

5 answers

Проблема заключается в ошибке в модели Mage_Core_Model_Url_Rewrite_Request (Magento 1.8) и Mage_Core_Model_Url_Rewrite (более ранние версии).

Раздел основного кода в версии 1.8 выглядит следующим образом:

    // Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()

    $fromStore = $this->_request->getQuery('___from_store');
    if (!$this->_rewrite->getId() && $fromStore) {
        $stores = $this->_app->getStores();
        if (!empty($stores[$fromStore])) {
            $store = $stores[$fromStore];
            $fromStoreId = $store->getId();
        } else {
            return false;
        }

Ошибка: значением параметра запроса является код магазина (в моем случае de, en или fr). Ключи массива, возвращаемые app->getStores(), являются числовыми идентификаторами хранилища. Вот почему if (!empty($stores[$fromStore])) { всегда терпит неудачу.

Как только эта ошибка будет исправлена, другая ошибка станет очевидной позже в том же методе (я думаю, только в 1.8):

$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();

Базовый URL-адрес объектов запроса всегда является базовым адресом Magento, без кода хранилища. Использование $currentStore->getBaseUrl() вместо этого также исправляет эту ошибку.

Как только эти две проблемы будут устранены, переключатель языков будет работать нормально. Вот расширение, которое делает именно это для Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

В Magento 1.7 проблема может быть в чем-то другом. Я все еще думал, что добавлю этот ответ, на всякий случай google приводит сюда кого-то другого, кто работает под управлением версии 1.8 или новее.

 12
Author: Vinai, 2013-11-22 12:51:44

На самом деле я нашел обходной путь для этой проблемы в Magento 1.7.0.2, если вы используете Magento 1.8, смотрите подробное объяснение Винаи:

Похоже, что часть проблемы связана с контроллером запросов Mage_Core_Controller_Request_Http.

Если вы посмотрите на строку 161, то увидите следующее условие:

                elseif ($storeCode !== '') {
                    $this->setActionName('noRoute');
                }

Комментируя это, исправьте ошибку 404, когда я переключаюсь в другой магазин на страницах категорий/товаров.

Однако по какой-то неизвестной причине некоторое время код магазина отсутствует в URL-адрес ответа, но это больше не вызывает проблем, так как оба URL-адреса теперь работают:

  • MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
  • MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Мне все еще не ясно, может ли комментарий этого условия вызвать другую проблему

 4
Author: Fra, 2013-11-22 12:59:33

Некоторые обновленные сведения для Magento 1.9.1

Ошибка, на которую указал @Vinai, выглядит решенной в этой версии в любом случае по другой причине, функциональность все еще нарушена (для настраиваемых продуктов)

Проблема реальная проблема, вероятно, здесь Mage_Catalog_Model_Resource_Url однако у меня нет времени, и я не хочу касаться такой деликатной части ядра.

Объяснение обходного пути:

Точкой входа всегда является этот классMage_Core_Model_Url_Rewrite_Request и, в частности, метод _rewriteDb()

Как работает _rewriteDb():

  1. Сначала он пытается загрузить запрос для текущего хранилища

(139): $this->_rewrite->loadByRequestPath($requestCases);

  1. затем, если я не могу его найти (без идентификатора) и у него есть параметр ___from_store

(142): if (!$this->_rewrite->getId() && $fromStore) {

  1. попробуйте загрузить перезапись для ___from_store:

(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);

  1. если он найдет его, он использует id_path, чтобы загрузить его для текущего магазин:

(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

Все выглядит нормально, однако в данных url_rewrite есть проблема, и поэтому с функциональностью индекса (по крайней мере, для настраиваемых продуктов):

  • даже если мы переключаем магазин и у нового магазина другой URL, загружается перезапись в строке 139.

Проблема в том, что эта перезапись указывает на неправильный id_path (вместо указания на настраиваемый идентификатор продукта он указывает на один из его простой идентификатор продукта)

Теперь обходной путь состоит в том, чтобы удалить условие !$this->_rewrite->getId(), и поэтому magento всегда пытается найти перенаправление, когда есть параметр $fromstore

  • Лучше всего было бы исправить индекс catalog_url и удалить созданную им неправильную перезапись.

Вот код для быстрого решения проблемы (вам нужно будет создать модуль и переписать класс Mage_Core_Model_Url_Rewrite_Request самостоятельно):

protected function _rewriteDb()
    {
        if (null === $this->_rewrite->getStoreId() || false === $this->_rewrite->getStoreId()) {
            $this->_rewrite->setStoreId($this->_app->getStore()->getId());
        }

        $requestCases = $this->_getRequestCases();
        $fromStore = $this->_request->getQuery('___from_store');

        if ($fromStore) {
            $stores = $this->_app->getStores(false, true);
            if (!empty($stores[$fromStore])) {
                /** @var $store Mage_Core_Model_Store */
                $store = $stores[$fromStore];
                $fromStoreId = $store->getId();
            } else {
                return parent::_rewriteDb();
            }

            $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
            if (!$this->_rewrite->getId()) {
                return parent::_rewriteDb();
            }

            // Load rewrite by id_path
            $currentStore = $this->_app->getStore();
            $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

            $this->_setStoreCodeCookie($currentStore->getCode());

            $targetUrl = $currentStore->getBaseUrl() . $this->_rewrite->getRequestPath();
            $this->_sendRedirectHeaders($targetUrl, true);
        }

        if (!$this->_rewrite->getId()) {
            return parent::_rewriteDb();
        }

        $this->_request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
            $this->_rewrite->getRequestPath());
        $this->_processRedirectOptions();

        return true;
    }
 4
Author: Fra, 2018-05-22 05:13:23

URL-ключ является атрибутом. Вы можете отредактировать его из: Каталог -> Атрибуты -> Управление атрибутами. Найдите url_key и нажмите на него. Edit url_key attribute

Измените область и сохраните.

Теперь у вас могут быть разные URL-адреса для товаров в каждом представлении магазина.

 3
Author: FlorinelChis, 2013-02-13 12:54:14

Итак, вы хотите изменить URL-адрес для каждого представления магазина?

В настоящее время вы изменили URL-адрес продукта в области оценки для вашего французского магазина, чтобы он отличался от вашего английского магазина? И когда вы переключаетесь между ними, вы получаете 404. Это было бы ожидаемым поведением.

Magento не будет хранить различные перезаписи URL-адресов для других представлений магазина. Поэтому, когда вы нажмете /french/product1 во французском магазине, URL-адрес будет совпадать в таблице, и он загрузится. Но когда вы попадаете в английский магазин, там не будет совпадения и, следовательно, будет 404.

Похоже, вам нужно просто "Добавить коды магазинов в URL", что оставит ваши URL-ключи в покое, но добавит ко всем соответствующим URL-адресам код вашего магазина. Это должно позволить вашему коммутатору магазина функционировать.

 1
Author: Ben Lessani - Sonassi, 2013-02-14 08:48:10