Rewrite

In Magento können sich Fehler ergeben, wenn man über die Sprachauswahl verschiedene Seiten ansteuern möchte, für die verschiedene URL Keys angegeben wurden, z.B. "about-us" für die englische "Über uns"-Seite und "ueber-uns" für das deutsche Pendant.

Befindet man sich also auf der Seite "about-us" und möchte die deutsche Übersetzung ansteuern, so sucht Magento nach der deutschen Fassung von "about-us", die es jedoch in diesem Beispiel nicht gibt.

Warum sucht Magento nach der deutschen Fassung des englischen URL Keys?

Um die Antwort zu finden, müssen wir ein wenig tiefer in die Magento-Struktur einsteigen und sehen uns zuerst die Klasse Mage_Core_Model_Url_Rewrite_Request an, diese ist in der Datei \app\code\core\Mage\Core\Model\Url\Rewrite\Request.php zu finden. Innerhalb dieser Klasse interessiert uns inbesondere die Funktion _rewriteDb(). In dieser wird die für uns elementare Abfrage

if (!empty($stores[$fromStore])) {

in jedem Durchlauf mit "nein" beantwortet, der Array-Schlüssels "$fromStore" enthält somit keinen Wert, genauer gesagt: der Array-Schlüssel existiert in diesem Falle nicht.

Und warum? Lassen wir uns die Variable "$fromStore" ausgeben, enthält diese den Sprachcode (z.B. "en" im englischen Storeview). Das ist jedoch bereits der Fehler. Denn das "$stores"-Array hält zwar alle Stores bereit, jedoch nur nach Angabe der Store-ID (als Schlüssel). Das heißt: wir müssen uns etwas weiter oben ansehen, wie die Variable "$fromStore" belegt wird. Hier finden wir:

$fromStore = $this->_request->getQuery('___from_store');

Da wir nun die Store-ID brauchen, schreiben wir die obige Anweisung einfach um in:

$fromStore = Mage::getModel('core/store')->load($this->_request->getQuery('___from_store'), 'code')->getId();

Damit kommen wir dann auch unbeschadet durch die oben aufgezeigte if-Abfrage und der Rewrite bzw. die Sprachauswahl funktionieren einwandfrei.

Um keine Änderungen am Magento-Core durchzuführen und die Magento-Installation updatefähig zu halten, ändern wir natürlich nicht die Datei \app\code\core\Mage\Core\Model\Url\Rewrite\Request.php, sondern erstellen z.B. einen Override mit der Datei \app\code\local\Mage\Core\Model\Url\Rewrite\Request.php

Getestet in Magento CE 1.8.0.0. ... zurück zum Blog