마 젠토 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;
}