Magento: conflito de rotas entre frontend e admin

Português
, , ,

Hoje eu estava trabalhando num bug de um módulo de terceiros. Algo simples, o botão do adicionar ao carrinho fazia seu trabalho por AJAX, ao invés do tradicional POST. Entretanto, toda vez que eu chamava a URL http://.../ajaxcart/cart/add, eu recebia um HTTP status 302, ou seja, um redirecionamento, para a mesma URL, porém em modo seguro (HTTPS).

Depois de um processo de debug, constatei que o controller não era chamado quando era feita a requisição, portanto o problema deveria estar em alguma configuração do Magento. E de fato, estava. O painel administrativo estava configurado para utilizar o HTTPS (Configurações > Geral > Web > Seguro > Usar SSL no Admin), e quando eu removia esta opção, tudo funcionava conforme o esperado.

No final de contas, o problema era esse:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    <frontend>
        <routers>
            <ajaxcart>
                <use>standard</use>
                <args>
                    <module>Empresa_AjaxCart</module>
                    <frontname>ajaxcart</frontname>
                </args>
            </routename>
        </routers>
    </frontend>
    <admin>
        <routers>
            <ajaxcart>
                <use>admin</use>
                <args>
                    <module>Empresa_AjaxCart</module>
                    <frontname>ajaxcart</frontname>
                </args>
            </routename>
        </routers>
    </admin>

Percebam acima que nas duas situações, o frontname é o mesmo. Desta forma, toda vez que era acessada uma url no padrão http://.../ajaxcart/*, o Magento mandava uma resposta ao navegador para redirecionar para o modo seguro. No caso de um AJAX, isso traz dois problemas:

  1. Geralmente os desenvolvedores não se preocupam com outros status diferentes de 200 numa requisição AJAX;
  2. É necessário configurar a política conhecida como Same-Origin Policy, ou ainda os famosos erros de CORS, tal qual o Firefox informa:
1
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://.../ajaxcart/cart/add/. This can be fixed by moving the resource to the same domain or enabling CORS.

Portanto, fica a dica, sempre que forem desenvolver módulos que tenham controllers tanto no frontend quanto no admin, atentem-se para não utilizar o mesmo frontname nas rotas.

Até mais!