404 на коммутаторе магазина с ключом URL -адреса Shop Shoped Product
-
16-10-2019 - |
Вопрос
По умолчанию URL Key
На странице продукта Global Scoped.
РЕДАКТИРОВАТЬ:Как предполагает Florinelchis, объем может быть изменения в атрибутах управления. Однако это нарушает поведение коммутатора вида магазина.
Это было протестировано на 1.7.0.2 с данными образцов и «Добавить код магазина в URL» включен:
- Отредактируйте продукт и установите другой URL для конкретного магазина (французский)
- Повторный индекс
- Открыть страницу продукта на сайте на английском магазине просмотр
- Переключитесь на французский: у вас будет страница URL.
/French/
Переключитесь на английский -> 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()
работает:
- Сначала попробуйте загрузить запрос на текущий магазин
(139): $this->_rewrite->loadByRequestPath($requestCases);
- Тогда, если я не могу его найти (без идентификатора) и имеет
___from_store
параметр
(142): if (!$this->_rewrite->getId() && $fromStore) {
- попробуйте загрузить переписать для
___from_store
:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- Если он найдет, он использует
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 и нажмите на него.
Изменить Сфера и сохранить.
Теперь вы можете иметь разные клавиши URL для продуктов на каждом виде в магазине.
Итак, вы хотите изменить URL для каждого вида магазина?
В настоящее время вы изменили URL -адрес продукта в счете, чтобы ваш французский магазин отличался от вашего английского магазина? И когда вы переключитесь между ними, вы получите 404. Это будет ожидается поведение.
Magento не будет хранить различные переписывания URL для других видов магазина. Итак, когда вы нажимаете /french/product1
В французском магазине URL будет совпадать в столе, и он будет загружаться. Но когда вы попадете в его в английском магазине, не будет никакого совпадения и, следовательно, 404.
Похоже, вам нужно просто «добавить коды магазина в URL» - что оставит ваши ключи URL -адреса в покое, но префикс все соответствующие URL -адреса с кодом вашего магазина. Это должно позволить вашему переключателю магазина функционировать.