Par défaut URL Key
, la page du produit est de portée globale.
EDIT: Comme suggéré par FlorinelChis, la portée peut être des changements dans la gestion des attributs. Cependant, cela rompt le comportement du commutateur de vue de magasin.
Ceci a été testé sur 1.7.0.2 avec des exemples de données et "Ajouter le code de magasin à l'URL" activé :
- modifier un produit et définir une URL différente pour un magasin particulier (français)
- Réindexer
- Ouvrir la page du produit sur le site en vue boutique en anglais
- Passez en français: vous aurez l'URL de la page containg
/French/
Revenir à l'anglais -> erreur de page 404 (l'url manque le code de magasin
/default/
comment le faire fonctionner correctement avec la vue de magasin / le commutateur de langue?
Détails:
- URL pour l'anglais:
/default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
- URL pour le 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
Je passe ensuite au français:
J'ai reçu cette URL ( le code du magasin est manquant ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
Donc, magento réécrit l'url correctement mais manque le code du magasin pour une raison quelconque
Référence:
Bien sûr, 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
MISE À JOUR
Si vous êtes sur 1.9.1 @Vinai fix ne fonctionnera pas, vérifiez la nouvelle réponse que j'ai ajoutée
Réponses:
Le problème est un bogue dans le modèle
Mage_Core_Model_Url_Rewrite_Request
(Magento 1.8) etMage_Core_Model_Url_Rewrite
(versions antérieures).La section du code principal en 1.8 ressemble à ceci:
Le bug: la valeur du paramètre de requête est le code du magasin, (dans mon cas
de
,en
oufr
). Les clés du tableau retourné parapp->getStores()
sont les ID de magasin numériques . C'est pourquoiif (!empty($stores[$fromStore])) {
échoue toujours.Une fois ce bogue corrigé, un autre bogue apparaît plus tard dans la même méthode (je pense seulement en 1.8):
L'URL de base des objets de requête est toujours l'URL de base Magento, sans le code de magasin. À la
$currentStore->getBaseUrl()
place, il corrige également ce bogue.Une fois ces deux problèmes résolus, le sélecteur de langue fonctionne correctement. Voici une extension qui fait exactement cela pour Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites
Dans Magento 1.7, le problème pourrait être quelque chose de différent. Je pensais toujours que j'ajouterais cette réponse, juste au cas où Google amènerait quelqu'un d'autre ici qui exécute la version 1.8 ou plus récente.
la source
En fait, j'ai trouvé une solution de contournement pour ce problème sur Magento 1.7.0.2 si vous exécutez Magento 1.8 regarde l'explication détaillée de Vinai:
Il semble qu'une partie du problème est liée au contrôleur de demande
Mage_Core_Controller_Request_Http
.Si vous regardez à la ligne 161, il y a cette condition:
Commentant cela, corrigez l'erreur 404 lorsque je passe à un autre magasin dans une page de catégorie / produit.
Cependant, pour une raison inconnue, le code de magasin est manquant dans l'URL de réponse, mais cela ne pose plus de problème car les deux URL fonctionnent maintenant:
Il n'est pas encore clair pour moi si le commentaire de cette condition peut causer un autre problème
la source
Mage_Core_Controller_Request_Http
ne peut pas être réécrit dans un module.Quelques informations mises à jour pour Magento 1.9.1
Le bug signalé par @Vinai semble résolu de toute façon dans cette version pour une autre raison, la fonctionnalité est toujours cassée (pour les produits configurables)
Le vrai problème est probablement ici,
Mage_Catalog_Model_Resource_Url
mais je n'ai pas le temps et je ne veux pas toucher une partie aussi délicate du noyau.Explication d'une solution de contournement:
Le point d'entrée est toujours cette classe
Mage_Core_Model_Url_Rewrite_Request
et en particulier la méthode_rewriteDb()
Comment ça
_rewriteDb()
marche:(139):
$this->_rewrite->loadByRequestPath($requestCases);
___from_store
paramètre(142):
if (!$this->_rewrite->getId() && $fromStore) {
___from_store
:(152):
$this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
id_path
pour charger celui du magasin courant:(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):
Le problème est que cette réécriture pointe vers le mauvais
id_path
(au lieu de pointer vers l'ID de produit configurable, elle pointe vers l'un de ses ID de produit simple)Maintenant, une solution consiste à supprimer la
!$this->_rewrite->getId()
condition et donc magento essaie de trouver une redirection toujours quand il y a un$fromstore
paramètrecatalog_url
index et de supprimer la mauvaise réécriture qu'il crée.Voici le code de la solution rapide (vous devrez créer un module et réécrire la
Mage_Core_Model_Url_Rewrite_Request
classe par vous-même):la source
La clé URL est un attribut. Vous pouvez le modifier à partir de: Catalogue -> Attributs -> Gérer les attributs . Recherchez url_key et cliquez dessus.
Modifiez la portée et enregistrez.
Vous pouvez maintenant avoir différentes clés URL pour les produits sur chaque vue de magasin.
la source
Vous souhaitez donc modifier l'URL de chaque vue de magasin?
À l'heure actuelle, vous avez modifié l'URL du produit à l'échelle de score pour que votre magasin français soit différent de votre magasin anglais? Et lorsque vous basculez entre les deux, vous obtenez un 404. Ce serait un comportement attendu.
Magento ne stockera pas différentes réécritures d'URL pour les autres vues de magasin. Ainsi, lorsque vous accédez
/french/product1
au magasin français, l'URL correspondra dans le tableau et se chargera. Mais lorsque vous le frappez dans le magasin anglais, il n'y aura pas de correspondance et donc 404.Il semble que vous ayez besoin de simplement "Ajouter des codes de magasin à l'URL" - ce qui laissera vos clés d'URL seules, mais préfixez toutes les URL respectives avec votre code de magasin. Cela devrait alors permettre à votre commutateur de magasin de fonctionner.
la source