404 на перемикачі магазину з продуктовим ключем перегляду продуктового магазину


13

За замовчуванням URL Keyна сторінці продукту знаходиться Global Scoped.

EDIT: Як пропонує FlorinelChis, сфера застосування може бути зміною атрибутів Manage. Однак це порушує поведінку перемикача виду магазину.

Це перевірено на 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
Від

Тім, я зараз тестую певну відповідь і прийму їх після підтвердження, що вони працюють.
Фр

Відповіді:


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 або новішою.


ви вважаєте, що виправлене мною виправлення безпечне?
Фракт

Якщо чесно, я не розглядав причину проблеми в 1.7. Реалізація виправлення, не розуміючи, що саме викликає поведінку, завжди ризиковано.
Вінай

Вибачте, що знову відкриваємо цю дискусію через 2 роки, але я знову на цій помилці ... 1.9.1 питання пов'язане з умовою $ this -> _ переписати-> getId () ... в основному для другого перегляду магазину magento керувати завантажити переписують і так не викликає редирект ... проте це переписування має неправильну id_path (ідентифікатор продукту +1) , так що завантажити 404
Від

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 / sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Мені незрозуміло, чи може коментар цієї умови спричинити інші проблеми


Я можу підтвердити, що це працює і для мене - під час переходу на іншу мову під час перегляду товару я отримую 404. Це виправляє його і, як ви вже сказали, опускає код магазину з URL, який дивно. Я не можу уявити, що це найкраще рішення, оскільки редагування основного контролера, як це не може бути хорошим, мені було цікаво, чи ви коли-небудь знайшли інше рішення?
waffl

вам не потрібно редагувати жоден основний файл, ви можете створити власний модуль і переписати цей клас / метод.
Від

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

Змініть область застосування та збережіть.

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


Я оновив це питання, ви відповісте добре , але він не працює
Від

при переключенні магазину слід перейти на домашню сторінку магазину, а не на сторінку товару.
FlorinelChis

Місце, де ви приземляєтесь, те саме, звідки ви починаєте: якщо ви перебуваєте на сторінці категорії, ви повинні приземлитися на одній і тій же сторінці різною мовою
Фр.

1

Отже, ви хочете змінити URL-адресу для кожного перегляду магазину?

В даний час ви змінили URL-адресу товару на шкалі, щоб ваш французький магазин відрізнявся від вашого англійського магазину? І коли ви переходите між двома, ви отримуєте 404. Це очікувана поведінка.

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

Вам здається, що вам потрібно просто "Додати коди магазину до URL-адреси" - це дозволить залишити ваші ключі URL в поодинці, але приставте всі відповідні URL-адреси разом із кодом вашого магазину. Тоді це повинно дозволяти комутатору магазину функціонувати.


1
як підтвердив Вінай, це помилка
Фракт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.