По умолчанию URL Key
на странице товара есть глобальная область.
РЕДАКТИРОВАТЬ: Как предложено FlorinelChis область может быть изменения в атрибутах управления. Однако это нарушает поведение переключателя представления магазина.
Это было протестировано на 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 не сработает, проверьте новый ответ, который я добавил
Ответы:
Проблема заключается в ошибке в модели
Mage_Core_Model_Url_Rewrite_Request
(Magento 1.8) иMage_Core_Model_Url_Rewrite
(более ранних версиях).Раздел основного кода в 1.8 выглядит следующим образом:
Ошибка: значение параметра запроса является хранилище кода, (в моем случае
de
,en
илиfr
). Ключи возвращаемого массиваapp->getStores()
являются числовыми идентификаторами хранилища. Вот почемуif (!empty($stores[$fromStore])) {
всегда терпит неудачу.Как только эта ошибка исправлена, другая ошибка становится очевидной позже в том же методе (я думаю, только в 1.8):
Базовым 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, то вот это условие:
Комментируя это, исправьте ошибку 404, когда я переключаюсь в другой магазин на странице категории / товара.
Однако по какой-то неизвестной причине некоторое время пропускается код хранилища в URL-адресе ответа, но это больше не вызывает проблем, так как оба URL теперь работают:
Мне все еще не ясно, может ли комментарий этого условия вызвать другую проблему
источник
Mage_Core_Controller_Request_Http
не может быть переписан в модуле.Некоторая обновленная информация для 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 есть проблема с функциональностью индекса (по крайней мере, для настраиваемых продуктов):
Проблема в том, что эта перезапись указывает на неправильное
id_path
(вместо указания на настраиваемый идентификатор продукта, он указывает на один из простых идентификаторов продукта)Теперь обходной путь состоит в том, чтобы удалить
!$this->_rewrite->getId()
условие, и поэтому magento всегда пытается найти перенаправление, когда есть$fromstore
параметрcatalog_url
индекс и удалить неправильное переписывание, которое он создает.Вот код для быстрого обхода проблемы (вам нужно создать модуль и переписать
Mage_Core_Model_Url_Rewrite_Request
класс самостоятельно):источник
URL-ключ является атрибутом. Вы можете редактировать его из: Каталог -> Атрибуты -> Управление атрибутами . Найдите url_key и нажмите на него.
Изменение Scope и Сохранить.
Теперь вы можете иметь разные URL-ключи для продуктов в каждом представлении магазина.
источник
Итак, вы хотите изменить URL для каждого вида магазина?
В настоящее время вы изменили URL продукта в области оценки для своего французского магазина, чтобы он отличался от вашего английского магазина? И когда вы переключаетесь между ними, вы получаете 404. Это было бы ожидаемое поведение.
Magento не будет хранить различные переписывания URL для других просмотров магазина. Поэтому, когда вы нажмете
/french/product1
на французский магазин, URL будет совпадать в таблице, и он загрузится. Но когда вы нажмете его в английском магазине, совпадения не будет и, следовательно, будет 404.То, что вам нужно, это просто «Добавить коды магазина в URL», что оставит ваши ключи URL в покое, но префикс всех соответствующих URL с кодом вашего магазина. Это должно позволить вашему торговому коммутатору функционировать.
источник