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.

public function ajax_redirect($location = '')
{
    $location = empty($location) ? '/' : $location;
    if (strpos($location, '/') !== 0 || strpos($location, '://') !== FALSE)
    {
        if ( ! function_exists('site_url'))
        {
            $this->load->helper('url');
        }

        $location = site_url($location);
    }

    $script = "window.location='{$location}';";
    $this->output->enable_profiler(FALSE)
        ->set_content_type('application/x-javascript')
        ->set_output($script);
}

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:

public function buscaCEP(){

  if ($erro) {

    //redireciona o usuário para o controller mensagens, chamando o método erro
    ajax_redirect("mensagens/erro");

}

}

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:

$('#campo_cep').blur(function(){
        $.ajax({
            url: base_url+"home/buscaCEP"
        });
    });

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.