404 su Switch negozio con Product Store Visualizza chiave URL con ambito


13

Per impostazione predefinita URL Key, la pagina del prodotto è di ambito globale.

EDIT: Come suggerito da FlorinelChis, l'ambito può essere modificato in Gestisci attributi. Tuttavia, ciò interrompe il comportamento del commutatore di visualizzazione negozio.

Questo è stato testato su 1.7.0.2 con dati di esempio e "Aggiungi codice negozio all'URL" abilitato :

  1. modifica un prodotto e imposta un URL diverso per una particolare visualizzazione negozio (francese)
  2. Re-index
  3. Apri la pagina del prodotto sul sito in inglese store view
  4. Passa al francese: avrai l'URL della pagina contenente /French/
  5. Torna in inglese -> 404 errore di pagina (l'URL non ha ricevuto il codice negozio /default/

    come farlo funzionare correttamente con la visualizzazione store / cambio lingua?

Dettagli:

  • URL per l'inglese: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • URL per il francese: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Se sono sul sito inglese in questa pagina -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Quindi passo al francese:

Ho ottenuto questo URL ( manca il codice negozio ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Quindi Magento riscrive correttamente l'URL, ma per qualche motivo manca il codice negozio

Riferimento:

Di sicuro questo è legato alla /core/model/store.phpe /core/model/url/rewrite.php, in particolare per quei metodi:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

AGGIORNARE

Se la correzione 1.9.1 su @Vinai non funziona, controlla la nuova risposta che ho aggiunto


quale versione di Magento stai usando?
FlorinelChis,

Magento 1.7.0.2
Fra

Tim Al momento sto testando alcune risposte e le accetterò dopo aver confermato che stanno funzionando.
Fra

Risposte:


12

Il problema è un bug nel modello Mage_Core_Model_Url_Rewrite_Request(Magento 1.8) e Mage_Core_Model_Url_Rewrite(versioni precedenti).

La sezione del codice core in 1.8 è simile alla seguente:

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

Il bug: il valore del parametro query è il codice negozio, (nel mio caso de, eno fr). Le chiavi dell'array restituite da app->getStores()sono gli ID dell'archivio numerico . Ecco perché if (!empty($stores[$fromStore])) {fallisce sempre.

Una volta risolto quel bug, un altro bug apparirà più avanti nello stesso metodo (penso solo in 1.8):

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

L'URL di base degli oggetti richiesta è sempre Magento base_url, senza il codice negozio. Usando $currentStore->getBaseUrl()invece c'è anche quello bug risolto.

Una volta risolti questi due problemi, il selettore di lingua funziona correttamente. Ecco un'estensione che fa esattamente questo per Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

In Magento 1.7 il problema potrebbe essere qualcosa di diverso. Ho ancora pensato di aggiungere questa risposta, nel caso in cui Google porti qualcun altro qui con la versione 1.8 o successiva.


pensi che la correzione che ho implementato sia sicura?
Fra

Ad essere sincero, non ho esaminato la causa del problema in 1.7. L'implementazione di una correzione senza capire esattamente cosa sta causando il comportamento è sempre rischiosa.
Vinai,

mi dispiace riaprire questa discussione dopo 2 anni ma sono di nuovo su questo bug ... su 1.9.1 il problema è con la condizione if $ this -> _ rewrite-> getId () ... fondamentalmente per la seconda vista del negozio magento Manage caricare una riscrittura e quindi non attiva il reindirizzamento ... tuttavia questa riscrittura ha il percorso id_ errato (l'id del prodotto è +1) quindi carica un 404
Fra

4

In realtà ho trovato una soluzione per questo problema su Magento 1.7.0.2 se stai eseguendo Magento 1.8 guarda alla spiegazione dettagliata di Vinai:

Sembra che parte del problema sia correlata al controller della richiesta Mage_Core_Controller_Request_Http.

Se guardi la linea 161 c'è questa condizione:

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

Commentandolo, risolvo l'errore 404 quando passo a un altro negozio in una categoria / pagine del prodotto.

Tuttavia, per qualche motivo sconosciuto, a volte il codice del negozio non è presente nell'URL di risposta, ma questo non sta causando più problemi poiché entrambi gli URL funzionano ora:

  • MAGEDOMAIN / sony-vaio-VGN-txn27n-B-11-1-notebook-pc-french.html
  • MAGEDOMAIN / sony-vaio-VGN-txn27n-B-11-1-notebook-pc.html

Non mi è ancora chiaro se il commento di questa condizione possa causare altri problemi


Posso confermare che funziona anche per me: ogni volta che si passa a un'altra lingua durante la visualizzazione di un prodotto, ottengo un 404. Questo lo corregge e fa come hai detto, omettendo il codice negozio dall'URL che è strano. Non riesco a immaginare che questa sia la soluzione migliore in quanto modificare il core controller in questo modo non può essere buono, mi chiedevo se hai mai trovato un'altra soluzione?
Waffl,

non è necessario modificare alcun file core, è possibile creare il proprio modulo e riscrivere quella classe / metodo.
Fra

1
Mage_Core_Controller_Request_Httpnon può essere riscritto in un modulo.
benmarks

4

Alcune informazioni aggiornate per Magento 1.9.1

Il bug segnalato da @Vinai sembra risolto in questa versione comunque per altri motivi la funzionalità è ancora rotta (per prodotti configurabili)

Il vero problema è probabilmente qui, Mage_Catalog_Model_Resource_Urltuttavia non ho tempo e non voglio toccare una parte così delicata del nucleo.

Spiegazione per una soluzione alternativa:

Il punto di ingresso è sempre questa classe Mage_Core_Model_Url_Rewrite_Request e in particolare il metodo_rewriteDb()

Come _rewriteDb()funziona:

  1. Innanzitutto tenta di caricare la richiesta per l'archivio corrente

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

  1. quindi se non riesco a trovarlo (nessun id) e ha un ___from_storeparametro

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

  1. prova a caricare una riscrittura per ___from_store:

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

  1. se lo trova, usa il id_pathper caricare quello per l'archivio corrente:

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

Tutto sembra a posto ma c'è un problema nei dati url_rewrite e quindi con la funzionalità dell'indice (almeno per i prodotti configurabili):

  • anche se stiamo cambiando negozio e il nuovo negozio ha un URL diverso, viene caricata una riscrittura alla riga 139.

Il problema è che questa riscrittura punta verso l'errato id_path(invece di indicare l'id del prodotto configurabile punta a uno dei suoi semplici ID prodotto)

Ora una soluzione alternativa è rimuovere la !$this->_rewrite->getId()condizione e quindi magento prova a trovare un reindirizzamento sempre quando c'è un $fromstoreparametro

  • Il migliore sarebbe riparare l' catalog_urlindice e rimuovere la riscrittura sbagliata che crea.

Ecco il codice per la soluzione rapida (dovrai creare un modulo e riscrivere la Mage_Core_Model_Url_Rewrite_Requestclasse da solo):

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

3

La chiave URL è un attributo. Puoi modificarlo da: Catalogo -> Attributi -> Gestisci attributi . Cerca url_key e fai clic su di esso. Modifica l'attributo url_key

Cambia l' ambito e salva.

Ora puoi avere chiavi URL diverse per i prodotti in ciascuna vista dello store.


Ho aggiornato la domanda, la risposta è buona ma non funziona
Fra

quando cambi negozio dovresti atterrare sulla home page di quel negozio non sulla pagina del prodotto.
FlorinelChis,

Il luogo in cui atterri è lo stesso da dove inizi: se ti trovi su una pagina di categoria dovresti atterrare sulla stessa pagina in un'altra lingua
Fra

1

Quindi vuoi cambiare l'URL per ogni vista del negozio?

Al momento, hai modificato l'URL del prodotto nell'ambito del punteggio per il tuo negozio francese in modo che sia diverso dal tuo negozio inglese? E quando si passa tra i due, si ottiene un 404. Questo sarebbe un comportamento previsto.

Magento non memorizza diverse riscritture di URL per altre visualizzazioni del negozio. Quindi, quando colpisci /french/product1sul negozio francese, l'URL corrisponderà nella tabella e verrà caricato. Ma quando lo colpisci nel negozio inglese, non ci sarà corrispondenza e quindi 404.

Ciò di cui hai bisogno è semplicemente "Aggiungi codici negozio all'URL" - che lascerà da sole le tue chiavi URL, ma prefiggi tutti i rispettivi URL con il tuo codice negozio. Ciò dovrebbe quindi consentire al commutatore del negozio di funzionare.


1
come confermato da Vinai questo è un bug
Fra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.