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_Urlaber 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_storeParameter 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_pathlä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_pathProdukt-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 $fromstoreParameter vorhanden ist
- Das Beste wäre, den
catalog_urlIndex 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_RequestKlasse 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;
}