Einige aktualisierte Informationen für Magento 1.9.1
Der Fehler, auf den @Vinai hingewiesen hat, sieht in dieser Version ohnehin behoben aus. Andernfalls ist die Funktionalität immer noch defekt (für konfigurierbare Produkte).
Das eigentliche Problem ist wahrscheinlich hier, Mage_Catalog_Model_Resource_Url
aber ich habe keine Zeit und möchte einen so heiklen Teil des Kerns nicht berühren.
Erläuterung zur Problemumgehung:
Der Einstiegspunkt ist immer diese Klasse Mage_Core_Model_Url_Rewrite_Request
und insbesondere die Methode_rewriteDb()
Wie _rewriteDb()
funktioniert das?
- Zuerst wird versucht, die Anforderung für den aktuellen Speicher zu laden
(139): $this->_rewrite->loadByRequestPath($requestCases);
- dann, wenn ich es nicht finden kann (keine ID) und einen
___from_store
Parameter hat
(142): if (!$this->_rewrite->getId() && $fromStore) {
- versuchen Sie, eine Umschreibung für das zu laden
___from_store
:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- Wenn es es findet,
id_path
lädt es das für den aktuellen Laden:
(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
Alles sieht gut aus, aber es gibt ein Problem mit den url_rewrite-Daten und damit mit der Indexfunktionalität (zumindest für konfigurierbare Produkte):
- Selbst wenn wir den Shop wechseln und der neue Shop eine andere URL hat, wird ein Umschreiben in Zeile 139 geladen.
Das Problem ist, dass dieses Umschreiben auf die falsche id_path
Produkt-ID verweist (anstatt auf die konfigurierbare Produkt-ID zu verweisen, wird auf eine der einfachen Produkt-IDs verwiesen).
Nun besteht eine !$this->_rewrite->getId()
Problemumgehung darin, die Bedingung zu entfernen. Daher versucht Magento, eine Umleitung immer dann zu finden, wenn ein $fromstore
Parameter vorhanden ist
- Das Beste wäre, den
catalog_url
Index zu reparieren und das falsche Neuschreiben zu entfernen, das er erstellt.
Hier der Code für die schnelle Problemumgehung (Sie müssen ein Modul erstellen und die Mage_Core_Model_Url_Rewrite_Request
Klasse selbst neu schreiben ):
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;
}