ข้อมูลที่อัพเดทบางส่วนสำหรับ 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 ผลิตภัณฑ์ที่เรียบง่ายของมัน)
ตอนนี้วิธีแก้ปัญหาคือการลบ!$this->_rewrite->getId()
เงื่อนไขและวีโอไอพีจึงพยายามหาการเปลี่ยนเส้นทางเสมอเมื่อมี$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;
}