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:

INSERT INTO groups (`id`, `name`, `description`) VALUES (NULL, 'member', 'Members')


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.

$config['email_activation'] = FALSE;

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/jquery-1.3.2.min.js'; ?>"></script>
<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:

function _check_login($email)
{
    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í:

class Welcome extends Controller {

    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:

<?php
    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:

<?php
    }
?>

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.

<?php echo form_open('welcome/login',array('id' => 'userlogin')); ?>

<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:

<td><?php echo form_input('email', set_value('email')); ?></td>

Por:

<td><input type="text" name="email" value="<?php set_value('email'); ?>" id="email" /></td>

Y:

<td><?php echo form_password('password'); ?></td>

Por:

<td><input type="password" name="password" value="" id="password" /></td>

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:

<script type="text/javascript" src="<?php echo base_url().'assets/js/jquery.form.js'; ?>"></script>

Ahora, escribe en ajaxlogin.js:

$(document).ready(function(){

    $("#userlogin").ajaxForm({
        type: "POST",
        url: "http://localhost/ajaxlogin/index.php/welcome/ajaxLogin",
        dataType: "json",
        data: "email="+$("#email").val()+"&amp;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:

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:

function updateLogin(data) {

    $('#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!