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:
- D'abord, il essaie de charger la demande pour le magasin actuel
(139): $this->_rewrite->loadByRequestPath($requestCases);
- alors si je ne le trouve pas (pas d'id) et a un
___from_store
paramètre
(142): if (!$this->_rewrite->getId() && $fromStore) {
- essayez de charger une réécriture pour
___from_store
:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- s'il le trouve, il utilise le
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):
- même si nous changeons de magasin et que le nouveau magasin a une URL différente, une réécriture à la ligne 139 est chargée.
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ètre
- Le mieux serait de corriger l'
catalog_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):
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;
}