404 On Store Switch mit URL-Schlüssel für die Produktspeicheransicht

13

Standardmäßig ist URL Keyauf der Produktseite der globale Geltungsbereich festgelegt.

BEARBEITEN: Wie von FlorinelChis vorgeschlagen, kann der Gültigkeitsbereich in Attribute verwalten geändert werden. Dies stört jedoch das Verhalten des Store View Switcher.

Dies wurde am 1.7.0.2 mit Beispieldaten und getestet "Geschäftscode zur URL " aktiviert :

  1. ein Produkt bearbeiten und eine andere URL für eine bestimmte Storeview festlegen (französisch)
  2. Neu indizieren
  3. Öffnen Sie die Produktseite auf der Website in der deutschen Shopansicht
  4. Wechseln Sie zu Französisch: Die URL der Seite wird angezeigt /French/
  5. Zurück zu Deutsch wechseln -> 404-Seitenfehler (die URL enthält den Geschäftscode nicht /default/

    wie man es richtig mit Speicheransicht / Sprachumschaltung arbeitet?

Einzelheiten:

  • URL für Englisch: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • URL für Französisch: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Wenn ich auf dieser Seite auf Englisch bin -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Dann wechsle ich zu französisch:

Ich habe diese URL erhalten ( der Geschäftscode fehlt ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Also schreibt Magento die URL richtig um, aber verpasst aus irgendeinem Grund den Geschäftscode

Referenz:

Dies hängt sicher mit /core/model/store.phpund /core/model/url/rewrite.phpund insbesondere mit diesen Methoden zusammen:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

AKTUALISIEREN

Wenn Sie auf 1.9.1 @Vinai fix sind, funktioniert das nicht, überprüfen Sie die neue Antwort, die ich hinzugefügt habe

Fra
quelle
welche magento version benutzt du
FlorinelChis
Magento 1.7.0.2
Ab
Tim, ich teste gerade eine Antwort und werde sie akzeptieren, nachdem ich bestätigt habe, dass sie funktionieren.
Ab

Antworten:

12

Das Problem ist ein Fehler im Modell Mage_Core_Model_Url_Rewrite_Request(Magento 1.8) und Mage_Core_Model_Url_Rewrite(früheren Versionen).

Der Abschnitt des Kerncodes in 1.8 sieht folgendermaßen aus:

    // Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()

    $fromStore = $this->_request->getQuery('___from_store');
    if (!$this->_rewrite->getId() && $fromStore) {
        $stores = $this->_app->getStores();
        if (!empty($stores[$fromStore])) {
            $store = $stores[$fromStore];
            $fromStoreId = $store->getId();
        } else {
            return false;
        }

Der Bug: der Wert des Abfrage - Parameters ist der Speicher - Code, (in meinem Fall de, enoder fr). Die Schlüssel des von zurückgegebenen Arrays app->getStores()sind die numerischen Speicher-IDs. Deshalbif (!empty($stores[$fromStore])) { immer scheitert.

Sobald dieser Fehler behoben ist, wird ein weiterer Fehler später in der gleichen Methode angezeigt (ich denke nur in 1.8):

$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();

Die Basis-URL des Anforderungsobjekts ist immer die Magento-Basis-URL ohne den Geschäftscode. Indem Sie $currentStore->getBaseUrl()stattdessen dort verwenden, wird auch dieser Fehler behoben.

Sobald diese beiden Probleme behoben sind, funktioniert der Sprachumschalter einwandfrei. Hier ist eine Erweiterung, die genau das für Magento 1.8 (CE) macht: https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

In Magento 1.7 könnte das Problem etwas anderes sein. Ich dachte immer noch, ich würde diese Antwort hinzufügen, nur für den Fall, dass Google jemand anderen hierher bringt, der 1.8 oder neuer ausführt.

Vinai
quelle
Glauben Sie, dass die von mir implementierte Korrektur sicher ist?
Ab
Um ehrlich zu sein, habe ich mich in 1.7 nicht mit der Ursache des Problems befasst. Es ist immer riskant, einen Fix zu implementieren, ohne genau zu wissen, was das Verhalten verursacht.
Vinai
sorry diese diskussion nach 2 jahren wieder zu eröffnen aber ich bin wieder auf diesem bug ... auf 1.9.1 das problem ist mit der if bedingung $ this -> _ rewrite-> getId () ... im grunde für die zweite store view magento zu verwalten Umschreiben laden und so wird die Umleitung nicht ausgelöst ... jedoch hat dieses Umschreiben den falschen id_path (Produkt-ID ist +1), so dass es ein 404
Fra
4

Tatsächlich habe ich eine Problemumgehung für dieses Problem in Magento 1.7.0.2 gefunden. Wenn Sie Magento 1.8 ausführen, lesen Sie die ausführliche Erklärung von Vinai:

Anscheinend hängt ein Teil des Problems mit dem Anforderungscontroller zusammen Mage_Core_Controller_Request_Http.

Wenn Sie sich die Zeile 161 ansehen, gibt es diese Bedingung:

                elseif ($storeCode !== '') {
                    $this->setActionName('noRoute');
                }

Das Auskommentieren behebt den Fehler 404, wenn ich in einer Kategorie / Produktseite zu einem anderen Shop wechsle.

Aus einem unbekannten Grund fehlt jedoch der Geschäftscode in der Antwort-URL. Dies ist jedoch kein Problem mehr, da beide URLs jetzt funktionieren:

  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Es ist mir noch nicht klar, ob der Kommentar zu diesem Zustand ein anderes Problem verursachen kann

Fra
quelle
Ich kann bestätigen, dass dies auch für mich funktioniert. Wenn ich beim Anzeigen eines Produkts zu einer anderen Sprache wechsle, erhalte ich eine 404. Dies korrigiert sie und lässt, wie Sie sagten, den Geschäftscode in der URL weg, was seltsam ist. Ich kann mir nicht vorstellen, dass dies die beste Lösung ist, da die Bearbeitung des Core-Controllers so nicht gut sein kann. Ich habe mich gefragt, ob Sie jemals eine andere Lösung gefunden haben.
Waffel
Sie müssen keine Kerndatei bearbeiten, sondern können ein eigenes Modul erstellen und diese Klasse / Methode neu schreiben.
Ab
1
Mage_Core_Controller_Request_Httpkann in einem Modul nicht umgeschrieben werden.
benmarks
4

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?

  1. Zuerst wird versucht, die Anforderung für den aktuellen Speicher zu laden

(139): $this->_rewrite->loadByRequestPath($requestCases);

  1. dann, wenn ich es nicht finden kann (keine ID) und einen ___from_storeParameter hat

(142): if (!$this->_rewrite->getId() && $fromStore) {

  1. versuchen Sie, eine Umschreibung für das zu laden ___from_store:

(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);

  1. 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;
    }
Fra
quelle
3

Der URL-Schlüssel ist ein Attribut. Sie können es bearbeiten über: Katalog -> Attribute -> Attribute verwalten . Suchen Sie nach url_key und klicken Sie darauf. Bearbeiten Sie das Attribut url_key

Ändern Sie den Bereich und speichern Sie.

Jetzt können Sie in jeder Geschäftsansicht unterschiedliche URL-Schlüssel für Produkte festlegen.

FlorinelChis
quelle
Ich habe die Frage aktualisiert, Sie antworten, ist gut, aber es funktioniert nicht
Fra
Wenn Sie den Shop wechseln, sollten Sie auf dieser Shop-Homepage landen, nicht auf der Produktseite.
FlorinelChis
Der Ort , wo Sie landen ist das gleiche , wo Sie beginnen ab: wenn Sie auf einer Kategorie Seite sind Sie auf der gleichen Seite in der anderen Sprache landen sollen
Ab
1

Sie möchten also die URL für jede Geschäftsansicht ändern?

Derzeit haben Sie die Produkt-URL im Bewertungsbereich für Ihr französisches Geschäft so geändert, dass sie sich von Ihrem englischen Geschäft unterscheidet. Und wenn Sie zwischen den beiden wechseln, erhalten Sie eine 404. Dies wäre zu erwarten.

Magento speichert keine unterschiedlichen URL-Änderungen für andere Store-Ansichten. Wenn Sie also /french/product1auf den französischen Store klicken, wird die URL in der Tabelle übereinstimmen und geladen. Aber wenn Sie es im englischen Laden treffen, wird es keine Übereinstimmung geben und somit 404.

Es hört sich so an, als müssten Sie nur "Geschäftscodes zur URL hinzufügen" - damit bleiben Ihre URL-Schlüssel in Ruhe, aber allen entsprechenden URLs wird Ihr Geschäftscode vorangestellt. Dies sollte dann ermöglichen, dass Ihr Store Switcher funktioniert.

Ben Lessani - Sonassi
quelle
1
Wie von Vinai bestätigt, handelt es sich um einen Bug
Fra