Algumas informações atualizadas do Magento 1.9.1
O bug que @Vinai apontou parece resolvido nesta versão de qualquer maneira por outro motivo: a funcionalidade ainda está com problemas (para produtos configuráveis)
O problema do problema real provavelmente está aqui, Mage_Catalog_Model_Resource_Url
mas não tenho tempo e não quero tocar em uma parte tão delicada do núcleo.
Explicação para uma solução alternativa:
O ponto de entrada é sempre essa classe Mage_Core_Model_Url_Rewrite_Request
e, em particular, o método_rewriteDb()
Como _rewriteDb()
funciona:
- Primeiro, ele tenta carregar a solicitação para a loja atual
(139): $this->_rewrite->loadByRequestPath($requestCases);
- então se eu não conseguir encontrá-lo (sem id) e tiver um
___from_store
parâmetro
(142): if (!$this->_rewrite->getId() && $fromStore) {
- tente carregar uma reescrita para o
___from_store
:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- se o encontrar, use o
id_path
para carregar o da loja atual:
(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
Tudo parece bom, no entanto, há um problema nos dados url_rewrite e, portanto, com a funcionalidade de índice (pelo menos para produtos configuráveis):
- mesmo se estivermos trocando de loja e a nova loja tiver um URL diferente, uma reescrita na linha 139 será carregada.
O problema é que essa reescrita aponta para o errado id_path
(em vez de apontar para o ID do produto configurável, está apontando para um dos seus IDs simples)
Agora, uma solução alternativa é remover a !$this->_rewrite->getId()
condição e, assim, o magento tenta encontrar um redirecionamento sempre que houver um $fromstore
parâmetro
- O melhor seria corrigir o
catalog_url
índice e remover a reescrita incorreta criada.
Aqui está o código para a solução rápida (você precisará criar um módulo e reescrever a Mage_Core_Model_Url_Rewrite_Request
classe por conta própria):
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;
}