Frage

Standardmäßig URL Key Auf der Produktseite ist global scoped.

BEARBEITEN:Wie von Florinelchis vorgeschlagen, kann der Umfang Änderungen in den Verwaltungsattributen sein. Dies bricht jedoch das Verhalten des Store View Switcher.

Dies wurde auf 1.7.0.2 mit Probendaten getestet und "Store -Code zu URL hinzufügen" aktiviert:

  1. Bearbeiten Sie ein Produkt und setzen Sie eine andere URL für ein bestimmtes Storeview (Französisch)
  2. Wiederindex
  3. Öffnen Sie die Produktseite auf der Site auf der englischen Storeansicht
  4. Wechseln Sie zu Französisch: Sie werden die Seiten -URL -Containg haben /French/
  5. Wechseln Sie zurück zu Englisch -> 404 Seitenfehler (die URL vermisst den Store -Code /default/

    Wie kann es mit Store View/Language Switch korrekt funktionieren?

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 englischer Seite bin -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Dann wechsle ich zu Französisch:

Ich habe diese URL (Der Store -Code wird vermisst):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Magento schreiben die URL wieder richtig neu, verpassen Sie jedoch den Store-Code aus irgendeinem Grund

Bezug:

Sicher ist dies mit dem Zusammenhang mit /core/model/store.php und /core/model/url/rewrite.php, und insbesondere zu diesen Methoden:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

AKTUALISIEREN

Wenn Sie auf 1.9.1 @vinai Fix sind, funktioniert nicht die neue Antwort, die ich hinzugefügt habe

War es hilfreich?

Lösung 3

Einige aktualisierte Informationen für Magento 1.9.1

Der Fehler @Vinai wies darauf hin, dass in dieser Version sowieso aus anderen Gründen die Funktionalität gelöst wird (für konfigurierbare Produkte)

Das Problem echtes Problem ist wahrscheinlich hier Mage_Catalog_Model_Resource_Url Ich habe jedoch keine Zeit und ich möchte keinen so empfindlichen Teil des Kerns berühren.

Erklärung für eine Problemumgehung:

Der Einstiegspunkt ist immer diese KlasseMage_Core_Model_Url_Rewrite_Requestund insbesondere die Methode _rewriteDb()

Wie _rewriteDb() Werke:

  1. Zuerst versucht es, die Anfrage für den aktuellen Geschäft zu laden

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

  1. Wenn ich es dann nicht finden kann (keine ID) und eine habe eine ___from_store Parameter

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

  1. Versuchen Sie, ein Umschreiben für die zu laden ___from_store:

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

  1. Wenn es es findet, verwendet es die id_path So laden Sie den für das aktuelle Geschäft:

(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

Alles sieht gut aus, aber es gibt ein Problem in den URL_REWRITE -Daten und damit mit der Indexfunktion (zumindest für konfigurierbare Produkte):

  • Auch wenn wir den Laden wechseln und das neue Geschäft eine andere URL hat, wird ein Umschreiben in Zeile 139 geladen.

Das Problem ist, dass dieser Umschreiben auf das Falsche zeigt id_path (Anstatt auf die konfigurierbare Produkt -ID zu zeigen, zeigt sie auf eine der einfachen Produkt -ID)

Jetzt ist eine Problemumgehung, die zu entfernen !$this->_rewrite->getId() Zustand und so Magento versuchen, immer eine Weiterleitung zu finden, wenn es da ist $fromstore Parameter

  • Das Beste wäre, das zu reparieren catalog_url Index und entfernen Sie die falsche Umschreibung, die es erstellt.

Hier der Code für die schnelle Problemumgehung (Sie müssen ein Modul erstellen und neu schreiben Mage_Core_Model_Url_Rewrite_Request Klasse von selbst):

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;
    }

Andere Tipps

Das Problem ist ein Fehler im Modell Mage_Core_Model_Url_Rewrite_Request (Magento 1.8) und Mage_Core_Model_Url_Rewrite (frühere 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 Fehler: Der Wert des Abfrageparameters ist der Speichercode (in meinem Fall de, en oder fr). Die Schlüssel des Arrays wurden von zurückgegeben app->getStores() sind die numerisch Speicher -IDs. Deshalb if (!empty($stores[$fromStore])) { scheitert immer.

Sobald dieser Fehler behoben ist, wird ein weiterer Fehler später in derselben Methode offensichtlich (ich glaube nur in 1,8):

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

Die Anforderungsobjekte Basis -URL ist immer die Magento Base_url, ohne der Storecode. Verwendung $currentStore->getBaseUrl() Stattdessen behebt es auch diesen Fehler.

Sobald diese beiden Probleme behoben sind, funktioniert der Sprachschalter einwandfrei. Hier ist eine Erweiterung, die genau das für Magento 1.8 (CE) tut: 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 falls Google jemanden hierher bringt, der 1.8 oder neuer läuft.

Eigentlich habe ich eine Problemumgehung für diese Ausgabe auf Magento 1.7.0.2 gefunden, wenn Sie Magento 1.8 auf Vinais detaillierte Erklärung betrachten:

Es sieht so aus, als ob ein Teil des Problems mit dem Request Controller zusammenhängt Mage_Core_Controller_Request_Http.

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

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

Kommentieren Sie es aus, wenn ich den 404 -Fehler beim Wechsel zu einem anderen Speicher auf einer Kategorie-/Produktseiten wechsle.

Aus einem unbekannten Grund wird jedoch einiger Zeit der Store -Code in der Reaktions -URL übersehen, dies verursacht jedoch kein Problem mehr, da beide URL jetzt funktioniert:

  • Magedomain/Sony-Vaio-VGN-TXN27N-B-11-1-1-1-NOTebook-PC-French.html
  • Magedomain/Sony-Vaio-VGN-TXN27N-B-11-1-1-1-NOTOBOBE-PC.HTML

Es ist mir nicht klar, ob der Kommentar dieser Bedingung andere Probleme verursachen kann

URL -Schlüssel ist ein Attribut. Sie können es bearbeiten von: Katalog -> Attribute -> Attribute verwalten. Suchen nach url_key und klicken Sie darauf.Edit url_key attribute

Ändere das Zielfernrohr und speichern.

Jetzt können Sie in jeder Store -Ansicht unterschiedliche URL -Schlüssel für Produkte haben.

Sie möchten also die URL für jede Store -Ansicht ändern?

Derzeit haben Sie die Produkt -URL im Score -Bereich geändert, damit Ihr französischer Laden sich von Ihrem englischen Laden unterscheidet? Und wenn Sie zwischen den beiden wechseln, erhalten Sie eine 404. Dies wäre ein Verhalten zu erwarten.

Magento speichert keine anderen URL -Umschreibungen für andere Store -Ansichten. Also, wenn Sie schlagen /french/product1 Im französischen Geschäft passt die URL im Tisch überein und lädt. Aber wenn Sie es im englischen Laden treffen, wird es keine Übereinstimmung geben und somit 404.

Wie Sie es brauchen, ist es, nur "Store -Codes zu URL hinzuzufügen" - die Ihre URL -Schlüssel in Ruhe lassen, aber alle jeweiligen URLs mit Ihrem Store -Code vorfixieren. Dies sollte dann Ihrem Store -Switcher funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top