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:
- Innanzitutto tenta di caricare la richiesta per l'archivio corrente
(139): $this->_rewrite->loadByRequestPath($requestCases);
- quindi se non riesco a trovarlo (nessun id) e ha un
___from_storeparametro
(142): if (!$this->_rewrite->getId() && $fromStore) {
- prova a caricare una riscrittura per
___from_store:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- 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;
}