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

13

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

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

Это было протестировано на 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 не сработает, проверьте новый ответ, который я добавил

От
источник
какую версию Magento вы используете?
FlorinelChis
Magento 1.7.0.2
Fra
Тим В настоящее время я проверяю некоторые ответы и приму их после подтверждения их работы.
Фра

Ответы:

12

Проблема заключается в ошибке в модели 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 base_url, без кода магазина. Использование $currentStore->getBaseUrl()вместо этого также исправляет эту ошибку.

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

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

Vinai
источник
Как вы думаете, исправление, которое я реализовал, безопасно?
Фра
Если честно, я не изучал причину проблемы в 1.7. Реализация исправления без точного понимания причины такого поведения всегда сопряжена с риском.
Винай
извините, что возобновил обсуждение через 2 года, но я снова на этой ошибке ... на 1.9.1 проблема заключается в условии if $ this -> _ rewrite-> getId () ... в основном для второго представления магазина magento manage чтобы загрузить переписать и т.д. Это не вызывает перенаправление ... однако это переписывание имеет неправильный id_path (идентификатор продукта +1), поэтому он загружает 404
Fra
4

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

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

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

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

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

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

  • MAGEDOMAIN / сони-VAIO-VGN-txn27n-б-11-1-ноутбук-компьютер-french.html
  • MAGEDOMAIN / сони-VAIO-VGN-txn27n-б-11-1-ноутбук-pc.html

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

От
источник
Я могу подтвердить, что это работает и для меня - всякий раз, когда я переключаюсь на другой язык при просмотре продукта, я получаю 404. Это исправляет его и, как вы сказали, пропускает код магазина из URL, что странно. Я не могу представить, что это лучшее решение, так как редактирование основного контроллера не может быть хорошим, мне было интересно, нашли ли вы когда-нибудь другое решение?
вафля
вам не нужно редактировать основной файл, вы можете создать свой собственный модуль и переписать этот класс / метод.
От
1
Mage_Core_Controller_Request_Httpне может быть переписан в модуле.
отметки
4

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

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

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

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

FlorinelChis
источник
Я обновил вопрос, вы ответили хорошо, но он не работает
Fra
когда вы переключаете магазин, вы должны попасть на главную страницу магазина, а не на страницу товара.
FlorinelChis
Место , где вы земли тот же , где вы начинаете с: если вы находитесь на странице категории Вы должны приземлиться на той же странице , в другом языке
От
1

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

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

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

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

Бен Лессани - Сонасси
источник
1
как подтвердил Винай, это ошибка
Fra