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