Magento 1.9.1的一些更新信息
@Vinai指出的错误无论如何仍在此版本中得以解决,原因是该功能仍然被破坏(对于可配置产品)
问题真正的问题可能在这里,Mage_Catalog_Model_Resource_Url
但是我没有时间,也不想触及核心的如此微妙的部分。
解决方法的说明:
入口始终是此类Mage_Core_Model_Url_Rewrite_Request
,尤其是方法_rewriteDb()
如何_rewriteDb()
工作:
- 首先,它尝试加载当前商店的请求
(139): $this->_rewrite->loadByRequestPath($requestCases);
- 然后,如果我找不到它(没有id)并有一个
___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
(而不是指向可配置的产品ID,而是指向其简单产品ID之一)
现在一种解决方法是删除!$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;
}