PHP, CodeIgniter y jQuery
AJAX Login con jQuery y CodeIgniter – v2 + archivos
Hola amigos,
Esta es la revisión del tutorial que escribí hace más de un año. Es prácticamente lo mismo pero con todos los archivos que necesitas en un zip, a parte de ciertas modificaciones necesarias en el procesado de los datos.
Para esa gente que esta buscando un sistema de usuarios funcional con registro, tengo que decir que no tengo tiempo para programarlo todo por mi mismo para este manual. De este modo, como he hecho desde que comencé en CodeIgniter, usaremos una aplicación de terceros: un sistema completo de usuarios. Lo he basado en el trabajo de Popcorn, llamado ‘Redux Authentication’ (v2 beta).
Lo primero que necesitamos es descargar la librería de Redux. Accedemos al proyecto en Google Code y lo descargamos aquí. Puedes ir a la entrada oficial en el foro de CodeIgniter para preguntar sobre la misma.
Cuando descargues la librería, verás que dentro existe una carpeta llamada ‘Example Application’. Usaremos esta aplicación pero necesitamos actualizarla a la ultima versión de CodeIgniter, sino no nos funcionará. Ten en cuenta, que en el pack final ya esta actualizado pero es mucho mejor si lo haces por tu propio pie, aprenderás más.
Es muy fácil actualizarlo: descargas CodeIgniter y lo descomprimes. Ve a ‘Example Application’, renombra la carpeta a ajaxlogin (usaré este nombre en los ejemplos). Entra en la misma y seguidamente a /system. Borra todas las carpetas excepto application, donde esta la aplicación. Accede a la versión descarga de CodeIgniter y copia todas las carpetas que has eliminado (todas menos application). Puedes encontrar la guía oficial de CodeIgniter para la actualización aquí.
Entonces, instala la base de datos y configurala. Lo primero que tienes que hacer es añadir un grupo llamado ‘members’ en la tabla de grupos:
En el archivo config/redux_auth.php verás que hay una opción para configurar el grupo por defecto. En la base de datos no tenemos datos de modo que necesitamos añadir un grupo por defecto y modificar el archivo de configuración para que lo detecte. Otra recomendación para este mismo archivo es cambiar la configuración de activación a FALSE porque no funciona del todo. Hay otras variables que puedes cambiar, como el método de entrada (username, email…). He elegido el e-mail, que es el que viene por defecto. Cambiar para que sea el usuario no es difícil. Probarlo.
Ahora puedes ir a tu página, configurar otras cosas que harías en cualquier aplicación…
Lo primero que haremos será crear un usuario. Esto lo tienes que hacer desde la página, claro. Accede y lo verás claro. Después, intenta acceder. Serás redirigido al apartado status y verás bool(true) si has entrado correctamente. ¡Ahora es hora de programar nuestra aplicación en AJAX!
Ve a /system/application/views/template.php y, entre y añade la librería de jQuery que has descargado:
<script type="text/javascript" src=<?php echo base_url().'assets/js/ajaxlogin.js'; ?>"></script>
En este caso, la diferencia con el otro script, es que usaremos la función de Redux para el login y esto optimizará nuestro código ya que esta mucho más depurado. En el controller welcome añadiremos dos funciones:
{
return $this->redux_auth->login($email, $this->password);
}
function ajaxLogin()
{
$this->load->library('validation');
$this->password = $this->input->post('password');
$this->loginemail = $this->input->post('email');
$this->form_validation->set_rules('email', 'Email Address', 'trim|required|callback__check_login');
$this->form_validation->set_rules('password', 'Password', 'trim|required');
if ($this->form_validation->run() == false)
{
$data = array( 'success' => 'no',
'message' => 'The email or password you provided are wrong.');
$output = json_encode($data);
}
else
{
$data = array( 'success' => 'yes',
'welcome' => 'Welcome '.$this->loginemail.'!');
$output = json_encode($data);
}
$output = str_replace("\r", "", $output);
$output = str_replace("\n", "", $output);
echo $output;
}
Para entender el código: la primera función, _check_login(), usa el modelo redux_auth_model.php para validar el correo y la contraseña que hemos seleccionado. Para más información mira el modelo en la carpeta models. Si la información procesada es correcta devuelve TRUE, sino FALSE. En caso de que devuelva TRUE, la aplicación crea la sesión con nuestro e-mail. Si necesitas alguna cosa más, edita el modelo.
La segunda función es un mix de la función de login de Redux y mi función de AJAX. Toma los dos inputs y los valida. El primero, correo electrónico, usa la función callback a la función _check_login(). Si la información no es correcta, o sucede algún problema, devuelve FALSE. Entonces pasaremos la información a la función AJAX y la codificaremos con JSON. La información codificada se muestra tal que así: { “success”: “no”, “message”: “The email or password you provided are wrong.” }.
Hay que tener en cuenta que uso $this->password y $this->loginemail. Estas variables tienen que ser definidas en el inicio el controlador, así:
private $password = NULL;
private $loginemail = NULL;
/**
* index
*
* @return void
* @author Mathew
**/
function index()
{
redirect('welcome/status');
...
Perfecto! Ahora modificaremos el login. Como sabes, la mejor manera de crear un formulario en CodeIgniter es accediendo a su user guide. De este modo, abre /views/login.php. Cuando tenemos un tenemos un formulario de login normalmente solo lo mostramos cuando el usuario no esta identificado. En el ejemplo de la librería Redux esto no pasa y tenemos que modificarlo. La manera es comprobar si existe el item ‘identity’ en la session. Añade al principio del archivo:
if($this->session->userdata($this->config->item('identity')))
{
echo "<h1>You're aready logged in!</h1>";
}
else {
?>
<h1>Login</h1>
Esto comprobará si existe. Al final del archivo, añade:
}
?>
Compruébalo. Accede y vuelve al formulario de identificación. Mostrará You’re already logged in.
Tenemos que añadir algunas lineas más al archivo login.php. Cambia el form_open() y añade un id, añade un id a la tabla y añade un id a las divs extras que usaremos para mostrar los errores o sucesos de la aplicación AJAX. Es necesario que jQuery los identifique y eso lo hacemos con los ids.
<table id="loginform">
<div id="logged"><div>
<div id="loginerror"></div>
He añadido estas dos últimas <div>’ despues del form_close().
A parte, haz estos cambios:
Por:
Y:
Por:
Ahora es tiempo del archivo javascript. Recuerda que antes hemos añadido la librería de jQuery. Crea un archivo que se llame ajaxlogin.js en /assets/js/. Para usar el ajaxForm necesitas un plugin. Lo puedes descargar aquí. Lo añadimos igual que hemos hecho los dos del principio, en /views/template.php:
Ahora, escribe en ajaxlogin.js:
$("#userlogin").ajaxForm({
type: "POST",
url: "http://localhost/ajaxlogin/index.php/welcome/ajaxLogin",
dataType: "json",
data: "email="+$("#email").val()+"&password;="+$("#password").val(),
success: updateLogin
});
});
Ten en cuenta que es posible que tengas que cambiar la URL. Yo lo uso en mi localhost y con el alias ajaxlogin. Mismamente, uso el index.php y el controlador welcome. Debes modificarlo si es necesario.
Ahora mismo, el script funcionaria pero debemos añadirle un complemento… la función que llama ajaxForm cuando se ejecuta:
$('#logged').html('');
$('#logged').hide();
$("#loginform").fadeOut("slow",
function() {
if (data.success == 'yes') {
$('#logged').html(data.welcome).fadeIn("slow");
}
if (data.success == 'no') {
$('#loginerror').html(data.message).fadeIn("slow").fadeOut("slow",
function() {
$("#loginform").fadeIn("slow");
}
);
}
}
);
}
Esto creará nuestra animación y hará desaparecer el form. Igualmente escribirá los datos JSON a la <div> que hemos especificado.
Puedes descargar los archivos de este ejemplo funcionando aquí: ipalaus-ajaxlogin-v0.2.rar.
¡Gracias a todos! ¡Espero que funcione!
| Imprimir artículo | Este artículo fue publicado por Isern Palaus el 1 Diciembre 2009 a las 23:29, y está archivado en CodeIgniter. Sigue las respuestas a esta entrada a través de RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio. |



hace 9 meses
Hola! Buen artículo. Otra opción es usando alguno de los plugins ya existentes, para soporte de usuarios. DX_Auth es uno de ellos.Saludos
hace 9 meses
Hola Julian,Si, realmente que la aplicación trabaje un AJAX es indiferente el sistema de usuarios que usamos… DX_Auth es una gran opción.
Un saludo,
Isern
hace 9 meses
Voy a probarlo, es algo que quería hacer así que me biene muy bien.SDS y Gracias
hace 5 meses
Buen tip, me ha servido muchohace 5 meses
Hola!! excelente articulo, sobretodo para mi que soy nuevo en el asunto ya que estoy tratando de aprender CI para realizar un proyecto para la U, te felicito.Solo una pregunta…como puedo incrementar el tiempo del mensaje de error “The email or password you provided are wrong.”..ya que este desaparece muy rapido y creo que el usuario final no alcanzaria a verlo???…..bueno y si tenes informacion sobre como aprender todo esto, te lo agradeceria.
Una vez mas, felicitaciones…y de antemano gracias por la colaboracion que me puedas prestar.
hace 5 meses
Esto corresponde a los tiempos de fadeIn() y fadeOut() de la función updateLogin(). Mira busca en Google “jquery fadein” y “jquery fadeout” y encontrarás el enlace a la API de jQuery donde explica como configurar estos parámetros. Un simple fadeIn(5000) haría que durase 5 segundos el fadeIn. Luego podrías usar, entre el fadeIn y fadeOut, un delay(5000) de modo que tendrías:Esto haría que el proceso de fadeIn durase 500ms, se mantuviera en espera 5000ms y después desaparezca en 500ms.
Gracias a ti por el comentario!