404 переключатель в магазине с ключом URL-адреса для просмотра магазина товаров
По умолчанию URL Key
на странице продукта имеет глобальную область действия.
РЕДАКТИРОВАТЬ: Как предположил Флоринельхис, областью действия могут быть изменения в атрибутах управления. Однако это нарушает поведение переключателя просмотра магазина.
Это было протестировано на 1.7.0.2 с образцами данных и Включена функция "Добавить код магазина в URL".:
- отредактируйте продукт и установите другой URL-адрес для определенного просмотра магазина (французский)
- Переиндексировать
- Открыть страница товара на сайте в представлении магазина на английском языке
- Переключитесь на французский: у вас будет URL-адрес страницы, содержащий
/French/
-
Переключитесь обратно на английский -> ошибка страницы 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 не будет работать, проверьте новый ответ, который у меня есть добавлено
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 или новее.
На самом деле я нашел обходной путь для этой проблемы в 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
Мне все еще не ясно, может ли комментарий этого условия вызвать другую проблему
Некоторые обновленные сведения для 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;
}
URL-ключ является атрибутом. Вы можете отредактировать его из: Каталог -> Атрибуты -> Управление атрибутами. Найдите url_key и нажмите на него.
Измените область и сохраните.
Теперь у вас могут быть разные URL-адреса для товаров в каждом представлении магазина.
Итак, вы хотите изменить URL-адрес для каждого представления магазина?
В настоящее время вы изменили URL-адрес продукта в области оценки для вашего французского магазина, чтобы он отличался от вашего английского магазина? И когда вы переключаетесь между ними, вы получаете 404. Это было бы ожидаемым поведением.
Magento не будет хранить различные перезаписи URL-адресов для других представлений магазина. Поэтому, когда вы нажмете /french/product1
во французском магазине, URL-адрес будет совпадать в таблице, и он загрузится. Но когда вы попадаете в английский магазин, там не будет совпадения и, следовательно, будет 404.
Похоже, вам нужно просто "Добавить коды магазинов в URL", что оставит ваши URL-ключи в покое, но добавит ко всем соответствующим URL-адресам код вашего магазина. Это должно позволить вашему коммутатору магазина функционировать.