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