Domanda

Per URL Key impostazione predefinita sulla pagina del prodotto è Global ambito.

Modifica Come suggerito dal FlorinelChis la portata può essere cambiamenti nel gestire gli attributi. Tuttavia questo rompe il comportamento store view switcher.

Questa è è stata testata su 1.7.0.2 con i dati di campioni e "Aggiungere codice negozio a URL" abilitato :

  1. modifica un prodotto e impostare un URL diverso per una particolare storeview (francese)
  2. Re-index
  3. pagina del prodotto Apri dal sito inglese store view
  4. Passa alla francese: si avrà l'URL della pagina containg /French/
  5. Passa di nuovo al inglese -> errore 404 pagina (l'URL manca il codice negozio /default/

    come farlo funzionare correttamente con vista negozio interruttore / 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

Poi posso passare al francese:

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

Quindi, Magento riscrivere l'url correttamente, ma perdere il codice negozio per qualche motivo

Riferimento:

Di sicuro questo è legato al /core/model/store.php e /core/model/url/rewrite.php, ed in particolare a quei metodi:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

Aggiorna

Se siete su 1.9.1 @Vinai correzione non funziona, controllare la nuova risposta ho aggiunto

È stato utile?

Soluzione 3

Alcune informazioni aggiornate per Magento 1.9.1

Il bug @Vinai sottolineato sguardi risolti in questa versione comunque per altri motivi la funzionalità è ancora rotto (per i prodotti configurabili)

Il problema vero problema è probabilmente qui Mage_Catalog_Model_Resource_Url però io non ho tempo e io non' voglio toccare una parte così delicata del nucleo.

Spiegazione per una soluzione alternativa:

Il punto di ingresso è sempre questo classMage_Core_Model_Url_Rewrite_Request e in particolare il metodo _rewriteDb()

Come funziona _rewriteDb():

  1. In primo luogo si cerca di caricare la richiesta per l'archivio corrente

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

  1. allora se io non riesco a trovarlo (no id) e ha una ___from_store parametro

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

  1. prova a caricare una riscrittura per il ___from_store:

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

  1. se trovano, si usa la id_path per caricare quello per l'archivio corrente:

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

Tutto sembra bene tuttavia non v'è un problema nei dati url_rewrite e così con la funzionalità indice (almeno per i prodotti configurabili):

  • anche se accendiamo negozio e il nuovo negozio ha diverso url una riscrittura alla linea 139 viene caricato.

Il problema è che questa riscrittura punta al id_path sbagliato (invece di puntare per l'ID del prodotto configurabile si sta puntando ad una delle sua semplice ID prodotto)

Ora, una soluzione è quella di rimuovere la condizione !$this->_rewrite->getId() e così Magento cercare di trovare un redirect sempre quando c'è un $fromstore parametro

  • La cosa migliore sarebbe di fissare l'indice catalog_url e rimuovere il male riscrivere crea.

Ecco il codice per la soluzione veloce (è necessario creare un modulo di classe e riscrivere Mage_Core_Model_Url_Rewrite_Request dal vostro auto):

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

Altri suggerimenti

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 di codice di base in 1.8 si presenta così:

    // 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 di query è il codice negozio, (nel mio caso de, en o fr). Le chiavi dell'array restituito da app->getStores() sono i ID numerico negozio. Ecco perché if (!empty($stores[$fromStore])) { fallisce sempre.

Una volta che il bug è stato risolto, un altro bug si manifesta più tardi lo stesso metodo (credo solo in 1.8):

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

La richiesta oggetti URL di base sempre è il base_url Magento, senza il codice negozio. Utilizzando $currentStore->getBaseUrl() invece ci corregge il bug, anche.

Una volta che questi due problemi vengono risolti la lingua switcher funziona bene. Qui è un'estensione che fa esattamente quello per Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

In Magento 1.7 il problema potrebbe essere qualcosa di diverso. Ho sempre pensato che vorrei aggiungere questa risposta, nel caso in cui Google porta qualcun altro qui che è in esecuzione 1.8 o più recente.

In realtà ho trovato una soluzione per questo problema su Magento 1.7.0.2 se si esegue Magento 1,8 sguardi alla spiegazione dettagliata di Vinai:

Sembra che parte del problema è legato alla richiesta di Mage_Core_Controller_Request_Http controller.

Se si guarda alla linea 161 c'è questa condizione:

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

Commentando fuori correggere l'errore 404 quando passo a un altro deposito in una categoria di pagine / prodotto.

Tuttavia, per qualche ragione sconosciuta po 'di tempo il codice negozio è mancato nella risposta Url, ma questo non è la causa più problema sia come url ora funziona:

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

Non è stil chiaro per me se il commento di questa condizione può causare altri problemi

URL chiave è un attributo. È possibile modificarlo da: Catalogo -> Attributi -> Gestisci attributi . Cerca url_key e fare clic su di esso. Modifica attributo url_key

Cambia la Ambito di applicazione e salva.

Ora si può avere diverse chiavi di URL per i prodotti su ogni store view.

Così si vuole modificare l'URL per ogni visualizzazione negozio?

Al momento, si modifica l'URL del prodotto presso il campo punteggio per il tuo negozio francese di essere diverso al vostro negozio inglese? E quando si passa tra i due, si ottiene un comportamento 404. Questo ci si aspetta.

Magento non memorizzerà diverse riscritture URL per altre viste negozio. Così, quando si colpisce /french/product1 sul negozio francese, l'URL corrisponderà nella tabella e che verrà caricato. Ma quando lo ha colpito nel negozio inglese, non ci sarà alcuna corrispondenza e quindi sarà 404.

Che suona come avete bisogno è di solo "Aggiungi codici negozio alla URL" - che lascerà le chiavi URL da solo, ma precedere tutti i rispettivi URL con il codice negozio. Questo dovrebbe quindi consentire il vostro negozio switcher alla funzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top