Niektóre zaktualizowane informacje dla Magento 1.9.1
Błąd wskazany przez @Vinai wygląda na rozwiązany w tej wersji z innego powodu, że funkcjonalność jest nadal zepsuta (w przypadku produktów konfigurowalnych)
Problem prawdziwy problem jest prawdopodobnie tutaj, Mage_Catalog_Model_Resource_Urljednak nie mam czasu i nie chcę dotykać tak delikatnej części rdzenia.
Objaśnienie obejścia:
Punktem wejścia jest zawsze ta klasa, Mage_Core_Model_Url_Rewrite_Request
a w szczególności metoda_rewriteDb()
Jak _rewriteDb()działa:
- Najpierw spróbuj załadować żądanie dla bieżącego sklepu
(139): $this->_rewrite->loadByRequestPath($requestCases);
- to jeśli nie mogę go znaleźć (bez identyfikatora) i ma
___from_storeparametr
(142): if (!$this->_rewrite->getId() && $fromStore) {
- spróbuj załadować przepisać dla
___from_store:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- jeśli go znajdzie, użyj
id_pathdo załadowania tego dla bieżącego sklepu:
(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
Wszystko wygląda dobrze, jednak występuje problem z danymi url_rewrite, a więc z funkcją indeksu (przynajmniej w przypadku produktów konfigurowalnych):
- nawet jeśli zmieniamy sklep i nowy sklep ma inny adres URL, ładowane jest przepisywanie w linii 139.
Problem polega na tym, że to przepisywanie wskazuje na zły id_path(zamiast wskazywać na konfigurowalny identyfikator produktu, wskazuje jeden z jego prostego identyfikatora produktu)
Teraz obejściem tego problemu jest usunięcie !$this->_rewrite->getId()warunku, dlatego magento próbuje znaleźć przekierowanie zawsze, gdy istnieje $fromstoreparametr
- Najlepiej byłoby naprawić
catalog_urlindeks i usunąć utworzone przez niego nieprawidłowe przepisywanie.
Oto kod szybkiego obejścia (musisz samodzielnie utworzyć moduł i przepisać Mage_Core_Model_Url_Rewrite_Requestklasę):
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;
}