Creando una ventana de login con ExtJS

Algunos de los que me conocen saben que me paso la mitad de mi tiempo peleando contra ExtJS… esa biblioteca es completamente imposible cuando se le mete el diablo. Otras veces, es increíblemente potente y sencilla de usar.

En este caso -aunque al final me quedé con una solución que hice en jQuery- muestra a grandes rasgos lo potente y sencillo que puede ser ExtJS cuando le da la gana. Para efectos del ejemplo, voy a basarme en la estructura de archivos que trae ExtJS por defecto, además de usar varios de los estilos disponibles que trae.

Ya entrando en materia

Creamos un archivo html dentro del folder “examples” del ExtJS y en el <head> agregamos estos estilos:

        <link rel="stylesheet" type="text/css" href="../docs/resources/docs.css"/>
        <link rel="stylesheet" type="text/css" href="../resources/css/ext-all.css" />
        <link rel="stylesheet" type="text/css" href="../resources/css/xtheme-gray.css" />

    <style>
        #loading_mask{
        	width:100%;
        	height: 100%;
        	background: #c3daf9;
        	position :absolute;
        	z-index: 20000;
        	left: 0;
        	top: 0;
        }
        .loading-indicator img{
        	 width:16px;
        	height:16px;
        }
        </style>

Ahora, siempre en el <head> del documento, agregamos los script básicos de la biblioteca:

  <script src="../adapter/ext/ext-base.js" type="text/javascript"></script>
  <script src="../ext-all-debug.js" type="text/javascript"></script>

Dentro del cuerpo agregamos algo como esto:

<div id="loading-mask">&nbsp;</div>
<div id="loading">
<div class="loading-indicator">
	<img src="../resources/images/default/grid/loading.gif" align="absmiddle">&nbsp;Loading…
</div>

Ya con eso listo, es cosa de poner unos cuantos boxes y windows de ExtJS para terminar el login:

var loadMask = function(){

    return {

        init: function() {
            // Creamos el cargador
            var loading = Ext.get('loading');
            var mask = Ext.get('loading-mask');
            mask.setOpacity(0.8);
            mask.shift({
                xy: loading.getXY(),
                width: loading.getWidth(),
                height: loading.getHeight(),
                remove: true,
                duration: 1,
                opacity: 0.3,
                easing: 'bounceOut',
                callback: function(){
                    // Desvanece cuando la carga termina
                    loading.fadeOut({
                        duration: 0.2,
                        remove: true
                    });
                }
            });
        }};
}();

Ext.onReady(loadMask.init, loadMask, true);
Ext.onReady(function(){

        Ext.QuickTips.init();
        Ext.form.Field.prototype.msgTarget = 'side';
        // Usamos un FormPanel para crear la caja de Login

        var login = new Ext.FormPanel({
            labelWidth: 80,
            url: "autenticar.php",
            frame: true,
            title: 'Iniciar sesión',

            width: 230,
            padding: 10,
            defaultType: 'textfield',
            monitorValid: true,
            items: [{
                fieldLabel: 'Usuario',
                name: 'user',
                allowBlank: false
            },
            {
                fieldLabel: 'Contraseña',
                name: 'password',
                inputType: 'password',
                allowBlank: false
            }],
            buttons: [{
                text: 'Inicio',
                formBind: true,
                handler: function()
                {
                    login.getForm().submit({
                        method: 'POST',
                        waitTitle: 'Authenticando..',
                        waitMsg: 'Enviando datos...',

                        success: function()
                        {
                            var redirect = "http://google.com";
                            window.location = redirect;

                        },
                        failure: function(form, action)
                        // Pero si falla
                        {
                            if (action.failureType == 'server')
                            {
                                obj = Ext.util.JSON.decode(action.response.responseText);
                                Ext.Msg.alert('Intenta de nuevo!', obj.errors.reason);
                                // Le decimos al usuario que el logueo falló y le damos el motivo
                            }
                            else
                            {
                                Ext.Msg.alert('Ouch!', 'el servidor no contesta : ' + action.response.responseText);
                                // O bien si hubo algún error en el sistema
                            }
                            login.getForm().reset();
                        }
                    });
                }
            }]
        });
        // Usamos un Window para mostrar el Login en una ventanita

        var win = new Ext.Window(
            {
                layout: 'fit',
                width: 300,
                height: 150,
                closable: false,
                resizable: false,
                plain: true,
                items: [login] // y acá cargamos el panel con el login
            }
        );
        win.show();
    }
);

Y listo, ya el login está listo, lo que queda es el response que te va a enviar backend cuando las credenciales sean correctas o no.

No voy a poner cómo generarlo, porque ya eso depende del lenguaje que estés usando en backend, voy a limitarme solamente a las respuestas que espera el javascript.

Éxito:

echo "{success: true}";

Fallo:

echo "{success: false, errors: { reason: 'Password error.' }}";

Ahora sí, estamos listos. Espero que haya servido para despertar algo de curiosidad por ExtJS.

  • ruben_ortiz
    No me ha servido, sigo sin encontrar un codigo que me muestre el js y sus casillas con extjs. Hasta ahora ha sido inutil este extjs
  • No estoy seguro de entender lo que necesitas. Si pudieras explayarte un poco talvez logre ayudar.
  • ruben_ortiz
    Buen día

    En relación al código este no me ha ayudado, no ejecuta y no me muestra
    errores.

    Los códigos como este solo me han causado retrasos ya que no me a permitido
    ver su funcionamiento.


    2010/3/4 Disqus <>
  • Es raro, sos la primer persona que dice que no le funciona. Y ya hay
    varios comments en este post.

    Estás seguro de estar haciendo todos los pasos correctamente?. Estás
    ejecutandolo en un webserver?. Estás incluyendo extjs en tu html?
  • ruben_ortiz
    Datos de mi ordenador

    Mac OS X 10.6.2
    Server: MAMP Pro

    La consola no me da error ni la de PHP como la de Javascript y no ejecuta el
    código, segui los pasos y no funciona.

    Lastima ese código queria verlo, pero ya consegui otro que sí me funciono.

    Gracias de todas formas. Por cierto no es el unico código que no funciona o
    hace algo diferente a lo que espero, incluso los ejemplos del sitio Extjs no
    he logrado ajustarlos a nada, así que sigo aprendiendo, ya tengo mas de 10
    años programando en diferentes lenguajes y nunca me gustaron los frameworks
    porque es aprender algo que simplemente lo puedo hacer desde la nada y que
    haga lo que quiera cuando quiera, pero me gusto este frameworks y quiero
    aprenderlo bien, pero en blog en la comunidad no me brinda mucha ayuda y
    como estoy en América del Sur es poco probable conseguir mayor información.

    2010/3/7 Disqus <>
  • Curioso. Noté que cuando uno copia el plain text coloca los brackets del return debajo de este y ahí podría estar el bug. En todo caso, acá está el ejemplo funcionando con el php y el extjs, plug and play. Solo colocálo dentro del htdocs del MAMP.

    http://elbleg.com/share/post_137.zip

    Concuerdo con vos en que la comunidad de ExtJS no aporta mucho si no hay dinero de por medio y que cuesta encontrar información. Es uno de los mayores problemas de este framework, de ahí que decidiera hacer este pequeño post.
  • ruben_ortiz
    Anda, hoy si funciona, gracias.

    Me interesaba ver como precargaba. Antes no pasaba se queda precargando.

    Habra que encontrar una forma para resolver este desierto con Extjs, es
    justificado el pago para su uso comercial pero el no poder realizar una
    aplicación que pueda ayudarte a promover o vender un idea para un sistema
    por falta de aprendizaje o de ayuda lo hace autodestructivo.


    El 8 de marzo de 2010 22:36, Disqus
    <>escribió:
  • jamesjara
    hahaha yo creo que es facill.......

    amigo interexante yo tambien soy de costa rica, ya e desarrollado varias aplicaciones grande en extjs, si le sirve jamesjara@hotmail.com podemos "ayudarnos"..

    http://3plej-life.blogspot.com/
  • rpacosta
    Hola, la verdad es que quiero empezar a trabajar con la librería pero me está costando un poco de trabajo esto de enviar un formulario. Tengo una duda, primero despues que se envía el formulario como lo recibo en el servidor, supondo que manda un json, pero como recibo ese json ?
    La otra cosa por qué le paso los parámetros form y action a la funcion failure en este caso:
    function(form, action)
    Bueno espero su ayuda, gracias de antemano
  • Hola

    ExtJS te hace el request por medio de un post, y este post tiene como variables los nombres de los campos del formulario con su respectivo valor, asi que si por ejemplo querés capturarlo desde php sería algo como:

    $valor = $_POST['campo_de_extjs'];

    Con respecto a porqué en el failure puse function(form, action), es porque ExtJS llena los objetos form y action cuando se ejecuta, form tiene lo correspondiente al componente y action lo correspondiente a la respuesta que recibió, más específicamente el failureType.

    Te aconsejo que usés Firebug, es una extensión indispensable de Firefox, y te ayuda a ver que está pasando por debajo de todo el código. También te sirve para reflejar los request que hace la librería y los valores que envía.

    Un saludo
blog comments powered by Disqus
  • Mail
  • Delicious
  • Digg
  • StumbleUpon
  • Twitter
  • Technorati