404 no switch da loja com a chave de URL com escopo da exibição da loja do produto

13

Por padrão, URL Keyna página do produto, o escopo é Global.

EDIT: Como sugerido por FlorinelChis, o escopo pode ser alterado em Gerenciar atributos. No entanto, isso interrompe o comportamento do comutador de exibição da loja.

Isso foi testado no 1.7.0.2 com dados de amostra e "Adicionar código de loja ao URL" ativado :

  1. editar um produto e definir um URL diferente para uma determinada visualização de loja (francês)
  2. Re-indexar
  3. Abrir página do produto no site na visualização da loja em inglês
  4. Mudar para francês: você terá o URL da página /French/
  5. Voltar para inglês -> erro de página 404 (o URL perde o código da loja /default/

    como fazê-lo funcionar corretamente com a visualização da loja / opção de idioma?

Detalhes:

  • URL para inglês: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • URL para francês: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Se eu estiver no site em inglês desta página -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Então eu mudo para o francês:

Eu recebi este URL ( o código da loja está ausente ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

Então, o magento reescreve o URL corretamente, mas perde o código da loja por algum motivo

Referência:

Com certeza isto está relacionado com /core/model/store.phpe /core/model/url/rewrite.php, e em particular a esses métodos:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

ATUALIZAR

Se você estiver no 1.9.1, a correção @Vinai não funcionará, verifique a nova resposta que adicionei

Fra
fonte
qual versão do Magento você está usando?
FlorinelChis
Magento 1.7.0.2
Fra
Tim No momento, estou testando algumas respostas e as aceitarei depois de confirmar que estão funcionando.
A partir de

Respostas:

12

O problema é um bug no modelo Mage_Core_Model_Url_Rewrite_Request(Magento 1.8) e Mage_Core_Model_Url_Rewrite(versões anteriores).

A seção do código principal no 1.8 é assim:

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

A Bug: o valor do parâmetro de consulta é o código da loja, (no meu caso de, enou fr). As chaves da matriz retornada por app->getStores()são os IDs numéricos da loja. É por isso que if (!empty($stores[$fromStore])) {sempre falha.

Depois que esse bug é corrigido, outro bug se torna aparente posteriormente no mesmo método (acho que apenas no 1.8):

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

A URL de base dos objetos de solicitação sempre é o Magento base_url, sem o código da loja. Usando, em $currentStore->getBaseUrl()vez disso, corrige esse bug também.

Uma vez resolvidos esses dois problemas, o alternador de idiomas funciona bem. Aqui está uma extensão que faz exatamente isso no Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

No Magento 1.7, o problema pode ser algo diferente. Eu ainda pensei em adicionar essa resposta, caso o google traga alguém aqui que esteja executando a versão 1.8 ou mais recente.

Vinai
fonte
você acha que a correção que eu implementei é segura?
Fra
Para ser sincero, não analisei a causa do problema no 1.7. Implementar uma correção sem entender exatamente o que está causando o comportamento é sempre arriscado.
Vinai
desculpe reabrir essa discussão depois de 2 anos, mas estou novamente com esse bug ... na 1.9.1 o problema é com a condição if $ this -> _ rewrite-> getId () ... basicamente para a segunda visualização da loja magento manage carregar uma reescrita e, portanto, ele não aciona o redirecionamento ... no entanto, essa reescrita tem o id_path errado (o ID do produto é +1); portanto, ele carrega um 404
Fra
4

Na verdade, encontrei uma solução alternativa para esse problema no Magento 1.7.0.2 se você estiver executando o Magento 1.8, veja a explicação detalhada de Vinai:

Parece que parte do problema está relacionada ao controlador de solicitação Mage_Core_Controller_Request_Http.

Se você observar a linha 161, existe esta condição:

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

Comentar corrige o erro 404 quando mudo para uma loja diferente em uma categoria / página de produto.

No entanto, por algum motivo desconhecido, algum tempo o código de loja está ausente na URL de resposta, mas isso não está causando mais problemas, pois as duas URLs funcionam agora:

  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
  • MAGEDOMAIN / sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

Ainda não está claro para mim se o comentário dessa condição pode causar outro problema

Fra
fonte
Também posso confirmar que isso funciona para mim - sempre que mudar para outro idioma ao visualizar um produto, recebo um 404. Isso o corrigia e, como você disse, omite o código da loja do URL que é estranho. Não consigo imaginar que essa seja a melhor solução, pois editar o controlador do núcleo dessa forma não pode ser bom. Fiquei me perguntando se você acabou encontrando outra solução.
waffl
você não precisa editar nenhum arquivo principal, pode criar seu próprio módulo e reescrever essa classe / método.
Fra
1
Mage_Core_Controller_Request_Httpnão pode ser reescrito em um módulo.
benmarks
4

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_Urlmas 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:

  1. Primeiro, ele tenta carregar a solicitação para a loja atual

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

  1. então se eu não conseguir encontrá-lo (sem id) e tiver um ___from_storeparâmetro

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

  1. tente carregar uma reescrita para o ___from_store:

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

  1. se o encontrar, use o id_pathpara 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 $fromstoreparâ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_Requestclasse 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;
    }
Fra
fonte
3

Chave do URL é um atributo. Você pode editá-lo em: Catálogo -> Atributos -> Gerenciar atributos . Pesquise url_key e clique nele. Editar atributo url_key

Mude o escopo e salve.

Agora você pode ter diferentes chaves de URL para produtos em cada visualização da loja.

FlorinelChis
fonte
Eu atualizei a pergunta, você responde é bom, mas não está funcionando #
13/02/2013
ao trocar de loja, você deve acessar a página inicial da loja e não a página do produto.
FlorinelChis
O local de aterrissagem é o mesmo de onde você começa: se você estiver em uma página de categoria, deverá aterrissar na mesma página no idioma diferente
Fra
1

Deseja alterar o URL de cada visualização da loja?

No momento, você modificou o URL do produto no escopo de pontuação da sua loja francesa para ser diferente da sua loja em inglês? E quando você alterna entre os dois, obtém um 404. Esse seria o comportamento esperado.

O Magento não armazena diferentes regravações de URL para outras visualizações da loja. Então, quando você bate/french/product1 na loja francesa, o URL corresponderá na tabela e será carregado. Mas quando você acessa a loja em inglês, não haverá correspondência e, portanto, 404.

Parece que você precisa apenas "Adicionar códigos de loja ao URL" - o que deixará suas chaves de URL em paz, mas prefixará todos os respectivos URLs com o código da loja. Isso deve permitir que o alternador da sua loja funcione.

Ben Lessani - Sonassi
fonte
1
como confirmado por Vinai este é um bug
Fra