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の1つを指している)
現在、回避策は!$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;
}