Como fazer redirect usando AJAX

A função redirect() do CodeIgniter foi feita para funcionar somente para redirecionamentos padrão do cabeçalho HTTP. Isto significa que você não vai conseguir fazer funcionar o redirect() se estiver fazendo uma chamada via AJAX.

Para fazer isto funcionar, você vai precisar enviar um código JavaScript para alterar a URL da janela. Vamos ver no código abaixo como você pode fazer isto:

1) Criando uma função de redirecionamento

Crie a função abaixo no seu controller ou então crie uma nova library para você poder utilizá-lo em qualquer lugar da aplicação.

Como utilizar

Quando você precisar fazer um redirecionamento usando AJAX, você vai chamar esta função passando a nova localização via parâmetro.

Explicando o código:

Primeiro ele verifica se a nova localização está vazia. Caso esteja, retorna a barra ‘/’, caso não, retorna o valor passado.

Em seguida é feita mais uma verificação para saber como começa o endereço da URL, se começa somente com uma barra ‘/’ ou com o padrão ‘://’.

Passado neste teste, é verificado se existe a função site_url no CodeIgniter e caso sim, carrega-se o helper ‘url‘.

Em seguida, grava-se na variável $location a concatenação da URL do site com a nova URL passada.

Depois, cria-se uma variável chamada $script que receberá o código JavaScript que será o responsável pelo redirecionamento.

Por segurança, o profiler do CodeIgniter é desabilitado e o tipo de saída é alterado para ‘application/x-javascript, e depois o próprio código em JavaScript é enviado ao navegador.

Ao fazer isto, a URL onde o usuário está será alterada para a URL passada como parâmetro na função.

Pode ser uma função bem simples e boba, mas é uma mão na roda quando você está no meio de uma chamada via AJAX e precisa enviar o usuário pra outro local. Esta função já me ajudou muitas vezes e espero que seja útil pra você também.

Exemplo

Vamos imaginar que você tenha um método dentro do seu controller que trabalha somente com requisições AJAX, e vamos imaginar que este método chama-se buscaCEP, e está dentro de um controller chamado Home.

Este método só é acessado via AJAX, então, caso no meio da sua lógica dentro do método você precise fazer algum redirecionamento, como em caso de erro, por exemplo, você não vai poder usar a função nativa do CodeIgniter pra fazer isto.

Ou seja, isto não funciona: redirect(‘mensagens/erro’);

Então, como faríamos para chamar um método dentro de outro controller para exibir um erro ao usuário?

Usando a função ajax_redirect(). 

Abaixo um código fictício:

E na sua view, existe uma função ajax que chama esta função buscaCEP, no evento onBlur de um campo de um formulário por exemplo.

Poderia ser algo assim:

Resumindo: se a função ajax buscaCEP estiver funcionando certinho dentro do controller, tudo continuará normal, porém, se der algum erro, a função buscaCEP irá chamar a função ajax_redirect() que redirecionará o navegador do usuário para o método erro, dentro do controller mensagens, por exemplo.

Assim, você economiza bastante código pra simplesmente redirecionar o usuário quando usar requisições AJAX.

É isto.

Abraços

Fábio

Fábio S. Reszko

Sou Programador PHP desde 2006 e eu acredito sinceramente que programar usando um Framework PHP é a solução para os problemas de códigos desorganizados, difíceis de entender e de dar manutenção no futuro. Se você também acredita nisto, então fique à vontade em explorar meu blog.

  • Vicente Neto

    Excelente dica Fábio… Lembro que já tentei fazer alguns Redirects e não funcionou… Kkkkkkkk… Tive que “abandonar” algumas funcionalidades para não atrasar o projeto… Normal…

    Obrigado pelo material simples, direto e prático sobre CodeIgniter que vc disponibiliza! Flw…

  • Júlio

    Fábio, fala de um exemplo que podemos aplicar essa dica, eu não entendi em qual situação poderia usar. Até agora estou conseguindo me virar com o redirect() do CodeIgniter. Abraço

  • Olá Julio, é verdade, não coloquei um exemplo, mas não sei se um exemplo ajudaria tanto. O que ocorre é que quando usamos Ajax, estamos na verdade usando JavaScript, e se você usar o redirect() do PHP em uma chamada JavaScript, ele não irá funcionar. De qualquer modo, vou providenciar um exemplo e postar no site. Abraços

  • lennonsbueno

    continue assim, agradeço muito a você

  • lennonsbueno

    não funcionou aqui.. testei com o ajax e não ta redirecionando, como você esta utilizando o ajax?

  • Olá.

    Coloquei um exemplo de uso no post. Dê uma olhada lá.

    Abraços

  • lennonsbueno

    Opa, deu certo, valew

  • jose soarew

    Parabens fabio!!!
    tenho uma pergunta!
    Como fazer uma chamada ajax que nao tem necessidade de retorno nem de redirecionamento. Uma simples chamada tipo para fazer uma atualizacao de evento interno… que nao tenha interferencias na page atual.
    abracos

  • Olá José
    Você determina o que será feito no retorno da função ajax. Se você quer apenas atualizar um evento interno, como o valor de um campo, por exemplo, é só colocar o código pra isso, e a página não será executada.

    No post: editando clientes usando ajax e bootstrap, eu mostro como atualizar valores no retorno do ajax. Se não quiser que aconteça nada, basta eliminar o código.

    Abraços
    Fabio