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


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.


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


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

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.


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.


1
como confirmado por Vinai este é um bug
— Fra
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.