404 на коммутаторе магазина с ключом URL -адреса Shop Shoped Product

magento.stackexchange https://magento.stackexchange.com/questions/728

Вопрос

По умолчанию URL Key На странице продукта Global Scoped.

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

Это было протестировано на 1.7.0.2 с данными образцов и «Добавить код магазина в URL» включен:

  1. Отредактируйте продукт и установите другой URL для конкретного магазина (французский)
  2. Повторный индекс
  3. Открыть страницу продукта на сайте на английском магазине просмотр
  4. Переключитесь на французский: у вас будет страница URL. /French/
  5. Переключитесь на английский -> 404 Ошибка страницы (URL Miss Shop Code /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 Fix не будет работать, проверьте новый ответ, который я добавил

Это было полезно?

Решение 3

Некоторая обновленная информация для 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;
    }

Другие советы

Проблема - ошибка в модели Mage_Core_Model_Url_Rewrite_Request (Magento 1.8) и Mage_Core_Model_Url_Rewrite (более ранние версии).

Раздел Core Code в 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();

Base URL -адрес объектов запроса всегда является magento base_url, без Код магазина. С использованием $currentStore->getBaseUrl() Вместо этого тоже исправляет эту ошибку.

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

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

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

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

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

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

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

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

  • Magedomain/Sony-Vaio-VGN-TXN27N-B-11-1-1-NoteBook-PC-French.html
  • Magedomain/Sony-Vaio-VGN-TXN27N-B-11-1-1-NoteBook-PC.HTML

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

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

Изменить Сфера и сохранить.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top