Question

Par URL Key par défaut à la page du produit est mondial scope.

EDIT: Comme l'a suggéré FlorinelChis la portée peut être des changements Gérer les attributs. Cependant, cette pause le comportement de switcher de vue magasin.

On a été testé sur 1.7.0.2 avec des données échantillons et "Ajouter code magasin à l'URL" activé :

  1. modifier un produit et définir une autre URL pour un Storeview particulier (français)
  2. Réindexer
  3. Ouvrir la fiche produit sur le site sur la vue du magasin anglais
  4. Passer en français: vous avez la page URL containg /French/
  5. Repassez en anglais -> 404 page d'erreur (l'url manque le code de magasin /default/

    comment faire fonctionner correctement avec vue magasin commutateur / langue?

Détails:

  • URL anglais: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • URL français: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Si je suis sur le site anglais sur cette page -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Alors je passe à français:

Je suis cette URL ( le code de magasin est manqué ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

magento ré-écrire l'url correctement mais manquer le code de magasin pour une raison quelconque

Référence:

Pour que cela est lié à /core/model/store.php et /core/model/url/rewrite.php, et en particulier à ces méthodes:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

UPDATE

Si vous êtes sur 1.9.1 @Vinai Il ne fonctionne pas, vérifiez la nouvelle réponse que j'ai ajouté

Était-ce utile?

La solution 3

Quelques infos mises à jour pour Magento 1.9.1

Le bug @Vinai a souligné regards résolus dans cette version de toute façon pour une autre raison de la fonctionnalité est toujours en panne (pour les produits configurables)

Le problème est probablement vrai problème ici mais je n'ai pas Mage_Catalog_Model_Resource_Url temps et je ne » veulent toucher une telle partie délicate du noyau.

Explication pour une solution de contournement:

Le point d'entrée est toujours ce classMage_Core_Model_Url_Rewrite_Request et en particulier la méthode _rewriteDb()

Comment fonctionne _rewriteDb():

  1. D'abord, il essaie de charger la demande pour le magasin courant

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

  1. puis si je ne le trouve pas (pas id) et un paramètre ___from_store

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

  1. essayez de charger une ré-écriture pour le ___from_store:

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

  1. si elle la trouve, il utilise le id_path pour charger l'un pour le magasin actuel:

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

Tout semble bien mais il y a un problème dans les données url_rewrite et donc avec la fonctionnalité d'index (au moins pour les produits configurables):

  • même si nous basculons magasin et le nouveau magasin a autre url une ré-écriture à la ligne 139 est chargée.

Le problème est que ce point de ré-écriture au mauvais id_path (au lieu de pointer vers l'ID de produit configurable, il pointe vers un de ses id simple produit)

Maintenant, une solution consiste à supprimer la condition de !$this->_rewrite->getId() et essayez donc de trouver magento une redirection toujours quand il y a un paramètre $fromstore

  • Le mieux serait de fixer l'indice de catalog_url et enlever le mauvais récrire il crée.

Voici le code pour la solution de contournement rapide (vous devrez créer un module et réécrire classe Mage_Core_Model_Url_Rewrite_Request par votre 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;
    }

Autres conseils

Le problème est un bogue dans le modèle Mage_Core_Model_Url_Rewrite_Request (Magento 1.8) et Mage_Core_Model_Url_Rewrite (versions antérieures).

La section du code de base de 1.8 ressemble à ceci:

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

Le Bug: la valeur du paramètre de requête est le code de magasin, (dans mon cas de, en ou fr). Les clés du tableau retourné par app->getStores() sont les numérique ID de magasin. Cest pourquoi if (!empty($stores[$fromStore])) { échoue toujours.

Une fois que bug est corrigé, un autre bug apparaît plus tard dans la même méthode (je pense que dans 1.8):

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

La demande des objets URL de base est toujours le base_url Magento, sans le code de magasin. En utilisant $currentStore->getBaseUrl() à la place, il corrige ce bug, aussi.

Une fois que ces deux problèmes sont résolus la langue switcher fonctionne très bien. Voici une extension qui fait exactement cela pour Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

Magento 1.7 la question pourrait être quelque chose de différent. Je pensais toujours que je voudrais ajouter cette réponse, juste au cas où Google apporte quelqu'un d'autre ici qui est en cours d'exécution 1.8 ou plus récent.

En fait, je trouve une solution à ce problème sur Magento 1.7.0.2 si vous utilisez Magento 1.8 regards pour une explication détaillée de Vinai:

Il semble qu'une partie du problème est lié à la Mage_Core_Controller_Request_Http de contrôleur de requête.

Si vous regardez à la ligne 161 il y a cette condition:

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

Commentant it out fix l'erreur 404 lorsque je passe à un autre magasin dans une catégorie / pages produits.

Cependant, pour une raison inconnue un certain temps le code de magasin est manqué dans la réponse Url mais cela ne cause pas problème plus à la fois URL fonctionne maintenant:

  • MAGEDOMAIN / sony-vaio-vgn-TXN27N-b-11-1-portable-pc-french.html
  • MAGEDOMAIN / sony-vaio-vgn-TXN27N-b-11-1-portable-pc.html

Il est stil pas clair pour moi si le commentaire de cette condition peut causer autre problème

URL clé est un attribut. Vous pouvez le modifier à partir de: Catalogue -> Attributs -> Gérer les attributs . Rechercher url_key et cliquez dessus. Modifier attribut url_key

Modifier Portée et Enregistrer.

Maintenant, vous pouvez avoir des clés d'URL pour les produits de chaque vue magasin.

Vous voulez changer l'URL de chaque vue magasin?

À l'heure actuelle, vous avez modifié l'URL du produit à la portée de score pour votre magasin français à être différent de votre magasin anglais? Et lorsque vous passez entre les deux, vous obtenez un 404. Ce serait le comportement attendu.

Magento ne stocke pas les différentes réécritures d'URL pour les autres vues du magasin. Donc, quand vous frappez /french/product1 sur la boutique française, l'URL correspondra à la table et il se charge. Mais quand vous le frapper dans le magasin anglais, il n'y aura pas de match et va donc 404.

Ce qu'il semble que vous avez besoin est juste « Ajouter des codes de magasin à l'URL » - qui laissera seul vos clés d'URL, mais préfixe toutes les URL respectives avec votre code de magasin. Cela devrait donc permettre à votre commutateur de magasin à la fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top