Mostrando entradas con la etiqueta JavaScript. Mostrar todas las entradas
Mostrando entradas con la etiqueta JavaScript. Mostrar todas las entradas

viernes, 24 de junio de 2016

Trabajo con jquery.validation (jQuery)

 1280px-JQuery_logo.svg

Como desarrollador web y sistemas de gestión, validar formularios es un paso obligatorio y de cierta forma repetitivo.

En este artículo veremos cómo trabajar con jquery.validation como una potente herramienta para las validaciones de formularios.

Para comenzar a utilizar jquery.validation, simplemente debemos agregar una referencia a las librerías jQuery y jquery.validation en nuestra página.

[sourcecode language='php'  padlinenumbers='true']
<script src="jquery-x-x/jquery-x.x.x.js" type="text/javascript"></script> 
<script src=" jquery-x-x /jquery.validate.js" type="text/javascript"></script>
[/sourcecode]

Conceptos básicos

Si trabajamos con jquery.validation hay que tener claros que son los métodos de validación y las reglas de validación.

Los métodos de validación implementan el código necesario para validar un elemento.

De serie contamos con un número considerable de métodos de validación para las comprobaciones más habituales, pero siempre es posible agregar a jquery.validation nuestras propias validaciones personalizadas.

Por ejemplo, un método de validación sería el código necesario para validar que la entrada es numérica o un e-mail, y las reglas de validación permiten asociar un elemento de nuestro formulario a uno o más métodos de validación.

A continuación se muestran las distintas formas de cómo se pueden asociar a un elemento las reglas de validación:

1- A través de nombres de clases css en atributo class. Por ejemplo class=”required” especifica que nuestro elemento será requerido, si se desea asociar a más de una regla se hace seguido de un espacio: class=”required number”, especifica que será requirido y solo aceptará números. Estos nombres de clases no tienen por qué existir en tu hoja de estilos, son clases que utilizará sólo jquery.validation.

2- Con atributos personalizados que requieren parámetros. Por ejemplo <input type=”text” minlength=”3”>, especifica que el contenido de nuestra caja de texto no debería ser menor a 3 caracteres

3- A través de código javascript y añadiendo las reglas a través del objeto rules.

Un primer ejemplo

[sourcecode language='php' ]
<form method="post" id="ejForm">
    <p>
        Nombre
        <input type="text" id="nombre" name="nombre" class="required" />
    </p>
    <p>
        Edad
        <input type="text" id="edad" name="edad" class="required digits" />
    </p>
    <p>
        <input type="submit" value="Enviar" />
    </p>
    </form>

    <script type="text/javascript">
        $().ready(function () {
$("#ejForm").validate();
        });
    </script>
[/sourcecode]

Estas reglas no son excluyentes y pueden combinarse según nuestras necesidades.

En este formulario:

Se han especificado las reglas de validación a través de nombres de clases.

Se ha llamado al método validate() para el elemento ejForm, que configura el formulario para que sea validado.

A partir de este momento, el formulario no podrá ser enviado si no cumple con las reglas impuestas.

Si ampliamos el ejemplo anterior para que el nombre tenga al menos 3 caracteres y la edad esté comprendida entre 18 y 99 años, tendremos que especificar estas reglas de validación a través de atributos con parámetros:

[sourcecode language='php' ]
<form method="post" id=" ejForm ">
<p>
    Nombre
    <input type="text" id="nombre" name="nombre" class="required" minlength="3" />
</p>
<p>
    Edad
    <input type="text" id="edad" name="edad" class="required digits" min="18" max="99" />
</p>
<p>
    <input type="submit" value="Enviar" />
</p>
</form>

[/sourcecode]

Otra forma de especificar las reglas es utilizar javascript para acceder al objeto rules y declararlas por código:

 

[sourcecode language='php' ]
  <form method="post" id=" ejForm ">
    <p>
        Nombre
        <input type="text" id="nombre" name="nombre" />
    </p>
    <p>
        Edad
        <input type="text" id="edad" name="edad" />
    </p>
    <p>
      <input type="submit" value="Enviar" />
   </p>
    </form>
    <script type="text/javascript">
        $().ready(function () {
            $("# ejForm ").validate({
                rules: {
                    nombre: {
                        required: true,
                        minlength: 3
                    },
                    edad: {
                        required: true,
                        digits: true,
                        min: 18,
                        max: 99
                    }
                }
            });
        });
    </script>

[/sourcecode]

Mensajes de error

Algo importante cuando validamos, es cómo y dónde se muestran los mensajes de error.

Cuando sucede un error durante la validación, por defecto jquery.validation agrega dinámicamente una etiqueta label a continuación del campo validado. Además, el mensaje de esta etiqueta es igualmente predefinido y está en inglés.

Referente al nuevo elemento label creado, es posible especificar el tipo de elemento que queremos crear para mostrar un error, en qué lugar del documento queremos que aparezca, mostrar resúmenes de errores para agrupar los mensajes, etc.

Más adelante se mostraran unas breves indicaciones de cómo personalizar estos mensaje.

Algo muy importante es la traducción del mensaje y la forma más sencilla de traducir los mensajes es bajarse la traducción de los mismos al lenguaje que necesites. Por defecto, jquery.validation está traducido a más de 41 idiomas, pero si aun así tu idioma no está disponible te resultará bastante sencillo traducirlo.

En la misma descarga del plugin hay una carpeta localization donde están todos los ficheros de idioma.

Si por ejemplo, queremos los mensajes en español bastaría con incluir la siguiente referencia a nuestra página, siempre después de la referencia a jquery.validation.

 

[sourcecode language='php' ]
<script src=" jquery-x-x /messages_es.js" type="text/javascript"></script>

[/sourcecode]

Una vez hemos traducido los mensajes predefinidos, podríamos querer mostrar mensajes personalizados o simplemente un mensaje especial para un campo concreto.

jquery.validation resuelve la búsqueda del mensaje a mostrar de la siguiente forma:

1- Primero busca si se ha especificado un mensaje para el elemento a través de javascript. Si lo encuentra, este será siempre el mensaje mostrado. Con javascript podemos especificar un único mensaje para todos los errores de validación o mostrar un mensaje por cada tipo de error de validación.

2- Segundo busca si nuestro elemento tiene definido el atributo title. Si lo encuentra, el valor del mismo será mostrado.

3- Por último, si no encuentra mensajes desde javascript ni el atributo title, buscará en los mensajes predefinidos.

Un ejemplo de personalización a través de javascript:

[sourcecode language='php' ]
$().ready(function () {
            $("#ejForm").validate({
                rules: {
                    nombre: {
                        required: true,
                        minlength: 3
                    },
                    edad: {
                        required: true,
                        digits: true,
                        min: 18,
                        max: 99
                    }
                },
                messages: {
                    nombre: {
                        required: "Nombre es obligatorio",
                        minlength: function (p, element) {
                            return "Nombre tiene que ser igual o mayor que " + p;
                        }
                    },
                    edad: "Este será el único mensaje para edad"
                }
            });
        });

[/sourcecode]

Reglas y métodos de validación personalizados

Es posible también implementar nuestras propias reglas de validación si no nos sirven las incluidas en jquery.validation.

Por ejemplo, crearemos una regla que validará si el nombre suministrado cumple con ciertas condiciones.

La regla de validación se llamara valid_nombre y al método de validación le llamaremos esNombreValido. En la práctica, el método de validación suele llamarse igual que la regla de validación, pero en este ejemplo las he llamado distintas para que veas que no es necesario asociar una regla y su método por nombre.

1. Definir método de validación personalizado

[sourcecode language='php' ]
function esNombreValido (value, element, param) {
    //value es el valor actual del elemento que se está validando
    //element es el elemento DOM que se está validando
    //param son los parámetros especificados por el método
    //  p. ej. en el caso de minlength="3", param será 3
    //  en caso de que el método no tenga parámetros, param será true

    if (value == ‘Pedro”) {
        return true; //supera la validación
    }
    else {
        return false; //error de validación
    }
}

[/sourcecode]

2. Registrar regla de validación, método de validación y mensaje por defecto

[sourcecode language='php' ]
$.validator.addMethod("valid_nombre ", esNombreValido, "No eres Pedro");

[/sourcecode]

3. Utilizar nueva regla de validación

[sourcecode language='php' ]
$().ready(function () {
    $("#ejForm").validate({
        rules: {
            nombre: {
                valid_nombre: true
            }
        }
    });
});

[/sourcecode]

Remote

Remote es muy sencillo de entender. Simplemente se delega la validación del elemento en una llamada a una url que validará el valor en el servidor y tiene que devolver en formato JSON un true si la validación ha tenido éxito o false (o cualquier otro valor distinto de true) en caso contrario.

En codeIgniter podríamos agregar por ejemplo una función p llevar a cabo la tarea de validación en el servidor.

[sourcecode language='php' ]
function nombre_funcion_ajax() {
        $nombre = $this->input->post(‘nombre’);
//se hace la comprobación de que el valor cumpla las condiciones deseadas
        if ($this->nombre_model->value_exist($nombre)) {
            echo 'false';
        } else
            echo 'true';
    }
[/sourcecode]

Y el código javascript necesario para utilizarlo sería:

[sourcecode language='php' ]
$("# ejForm ").validate({
            rules: {
                nombre: {
                required: true,
                remote:{
                    url:"<?php echo base_url(); ?>mi_controlador/ nombre_funcion_ajax ",
                    type:"post",
                    data:{
                        nombre: function(){
                            return $('# nombre ').val();
                        }
                    }
                }
                }},
            messages: {
                nombre: {
                    required: “El valor es requerido”,
                    remote: "el valor no cumple con la condición x"
                }
            }
        });

[/sourcecode]

Por defecto, remote hace una petición GET con los parámetros nombre=valor.

En cualquier caso, remote permite configurar todo lo que queremos la petición AJAX a través de su parámetro options.

En el ejemplo mostrado se envía por el método post y se adjunta como dato el nombre esto no es necesario ya que por defecto se envía el parámetro validado, pero se utiliza en caso de querer enviar algún otro dato junto con el validado.

Además de todas las funcionalidades mencionadas posee muchas más, todas estas configurables que nos permiten enriquecer el trabajo de los datos en el lado del cliente.

Espero les haya servido de ayuda.

Saludos

{ Leer Más }


lunes, 16 de junio de 2014

Lógica de aplicación en QtQuick con JavaScript.

QtQuick es una biblioteca del framework Qt para el desarrollo de aplicaciones con QML. En este artículo veremos cómo implementar la lógica de una aplicación con interfaz gráfica desarrollada en QML mediante un fichero JavaScript, para esto emplearemos un ejemplo desarrollado con la versión 5.2 de Qt. Lo primero que haremos será crear un proyecto de QtQuick. En la pantalla de bienvenida de Qt Creator seleccionamos “New Project”.

clip_image001

Luego en el asistente de nuevo proyecto escogemos la plantilla “Applications” y de las opciones escogemos “Qt Quick Application

clip_image003 clip_image004

Al seleccionar esta plantilla aparece el asistente para llenar los datos del proyecto. Introducimos el nombre, la ubicación, la selección de componentes de Qt Quick (dejamos por defecto Qt Quick 2), el kit de compilación (por defecto) y por último seleccionamos “Finish”. Una vez creado el proyecto se abre el “main.qml” que debe verse así:

clip_image006

Ahora vamos a crear el fichero JavaScript, para esto damos clic derecho en la raíz del árbol del proyecto y seleccionamos “Add new…”. Al abrir el asistente escogemos como plantilla “Qt” y en las opciones seleccionamos “JS File”:

clip_image008 clip_image010

Al abrir el asistente para crear el fichero ponemos el nombre, por ejemplo “logic”, y en la ubicacion seleccionamos la carpeta donde se encuentran los QML del proyecto; esto facilita la localizacion del fichero a la hora de importarlo. Dejamos las opciones por defecto y damos clic en “Finish”. Ya está creado el fichero, ahora vamos a diseñar una inerfaz sencilla para calcular el cuadrado de un número entrado por el usuario. Para esto sustituimos el código del main.qml por esto:

Rectangle {
width: 360
height: 200

Column{
anchors.centerIn: parent
spacing: 10

Rectangle{
anchors.horizontalCenter: parent.horizontalCenter
color: "lightgrey"; width: 40; height: 20

TextInput{
id: inputNum
anchors.fill: parent; color: "black"
font.pointSize: 15.0
}
}

Text { id: result; text: qsTr("El cuadrado es: ")
anchors.horizontalCenter: parent.horizontalCenter }

Text {
text: qsTr("CALCULAR")
anchors.horizontalCenter: parent.horizontalCenter

MouseArea {
anchors.fill: parent
onClicked: {

}
}
}
}
}

Se utiliza un elemento TextInput para obtener la entrada del usuario, un elemento Text para mostrar el resultado y otro para ejecutar el método que implementaremos más adelante. Es importante señalar aquí la propiedad “id” del TextInput y del Text que mostrará el resultado. Esta propiedad es el identificador mediante el cual se puede acceder a todas las propiedades del objeto desde el fichero JavaScript o desde los métodos de los otros elementos en el mismo QML; por eso es necesario que sea único para cada objeto que se declare en el fichero. Ahora, vamos a escribir la directiva que permite importar el fichero JavaScript desde el código QML, en la parte superior del código agregar:

import "logic.js" as Logic

Esto significa que vamos a utilizar los métodos implementados en el fichero “logic.js” a través del id “Logic”. La manera específica de hacerlo lo veremos más adelante. Ahora, abrimos el fichero JavaScript e implementamos el método para calcular el cuadrado del número entrado por el usuario:

function square(num) {
var r = num * num
result.text = "EL cuadrado es: " + r
}

Es un método sencillo, pero lo importante aquí es notar que podemos cambiar la propiedad “text” del elemento Text del fichero QML a través del identificador definido. Lo mismo podemos hacer con cualquiera de sus otras propiedades.

Ya podemos usar el método implementado, para esto vamos al método onClicked del elemento MouseArea y escribimos lo siguiente:

Logic.square(inputNum.text)

Aquí notar dos cosas: primero, que podemos acceder a los métodos del fichero JavaScript a través del id definido en la directiva import como si fuera un objeto y segundo, que desde aquí también podemos acceder a las propiedades de los elementos QML mediante su identificador. En este caso el texto del TextInput.

De esta manera se ha implementado un método sencillo, pero en una aplicación más compleja donde se necesiten más métodos la manera de llamarlos es la misma. Una vez terminado todo solo falta probarlo, para esto compilamos la aplicación y comprobamos que todo funcione bien.

Hasta aquí el artículo de hoy, en resumen hemos visto cómo utilizar los métodos de un fichero JavaScript en el código QML y como acceder a las propiedades de los elementos QML a través de su identificador.

{ Leer Más }


miércoles, 5 de febrero de 2014

Cómo mostrar Popup utilizando Jquery sobre CodeIgniter.

En algunas aplicaciones web a veces es deseado mostrar una apariencia de aplicación de escritorio donde al dar clic sobre las acciones que deseamos realizar, en lugar de cargar páginas nuevas con la información deseada, nos mantenemos en la misma vista y lo que mostramos son ventanas emergentes (Popup) que podemos manipular siempre desde la misma vista principal.

En este artículo estaremos mostrando como mostrar esos Popup utilizando Jquery y a través de Ajax traemos la información necesaria para ello.

Lo primero que hay que tener es desde donde vamos a dar clic para que salga nuestra nueva ventana, por ejemplo algún link de este tipo:

<a href="#" class="mi_popup">Nueva Ventana</a>

Notar como hemos definido la clase “mi_popup” que es la que vamos a utilizar posteriormente para invocar la llamada a la controladora y nos traiga la información deseada.

Luego tendríamos que tener algún componente html vacío para poner en él la vista que vamos a traer desde nuestra controladora, sería algo como:

<div id="dialog_mi_popup" style="display: none" title="Nueva Ventana"></div>

En la controladora tendríamos la función en la que llamamos la vista, con la característica que hacemos un echo a la función $this->load->view('mi_ventana', '', true):

public function mostrar_ventana()
{
echo $this->load->view('mi_ventana', '', true);
}

En esta función, para este ejemplo tan sencillo no estamos trayendo a la vista datos desde la controladora en el segundo parámetro de la función, y definimos finalmente el último parámetro en true para traer los datos como una cadena, incluso después podemos hacer algún procesamiento con estos datos antes de mostrarlos.

En el código script, básicamente debemos realizar dos cosas, una: definir las propiedades del Popup que vamos a mostrar, que si nos fijamos es el componente html vacío que definimos anteriormente, y otra en el evento clic del link definido hacer la llamada controladora/función que hemos definido y finalmente con esta información mostrar el Popup.

$(document).ready(function()
{
//definiendo las propiedades del popup
$("#dialog_mi_popup").dialog({
autoOpen: false,
height: 550,
width: 650,
modal: true
});

//mostrando el popup en el evento click del link
$(document).on('click', '.mi_popup', function(ev)
{
ev.preventDefault();
$.post('<?php echo site_url().'controladora/mostrar_ventana/'; ?>',
function(data){

$("#dialog_mi_popup").html(data);

$("#dialog_mi_popup").dialog( "open" );
});

});
}

A la función que estamos llamando se le pueden pasar valores, muy útil para cuando la vista que deseamos mostrar en la nueva ventana depende de valores seleccionados en la vista general, como por ejemplo cuando seleccionamos un elemento de un grid y veremos más detalles del elemento en la ventana Popup.

$.post('<?php echo site_url().'controladora/mostrar_ventana/'; ?>', {valor:valor_seleccionado},

Donde por ejemplo valor_seleccionado se alimenta de algún id que estamos guardando en algún componente visual que tenemos oculto…

var valor_seleccionado = $('#id').val();

Tenemos que tener en cuenta entonces que esos valores tienen que ser recibidos en la función de la controladora que estamos llamando de la siguiente forma:

$id = $this->input->post('valor');

Con estos sencillos pasos tendremos nuestros Popup funcionando, hay otros elementos que tenemos que tener en cuenta, como por ejemplo si estamos mostrando un formulario en la ventana Popup y realizando las validaciones en el servidor, se “perdería” la ventana que estamos mostrando al hacer el envío del formulario cuando este falla, ese efecto podríamos evitarlo haciendo las validaciones de nuestro formulario desde el código script. Lo otro que tendríamos que tener en cuenta es que si estamos abriendo y cerrando continuamente varios Popup desde la misma ventana principal, tenemos todo un mismo código html y puede dar conflictos si tenemos variables con el mismo nombre en las diferentes vistas que estamos cargando.

Es todo, espero haya sido de utilidad.

{ Leer Más }


miércoles, 24 de abril de 2013

Desarrollar una aplicación web usando el patrón MVC con ZK.

El presente artículo tiene el objetivo de iniciarle en el desarrollo de aplicaciones web, usando el patrón MVC (modelo-vista-controlador) con el framework ZK. Le permitirá aprender a manejar los componentes de la vista manualmente e implementar la lógica necesaria para que funcione nuestra aplicación.

Importar y ejecutar la aplicación de ejemplo.

Se provee un proyecto eclipse, en un fichero zip, que contiene el código fuente completo de la aplicación de ejemplo; usted puede descargar e importarlo para su Eclipse, para que no tenga que iniciar desde cero.

Para usar la aplicación de ejemplo, siga los siguientes pasos:

Declarando una Clase de Dominio

Lo siguiente es la clase de dominio que representa a un carro.

Extraído de Car.java:

public class Car {

   private Integer id;

   private String name;

   private String company;

   private String preview;

   private String description;

   private Integer price;

   //omit getter and setter for brevity

}

Para ver el código completo de la clase puedes ir a continuación, a la sección de referencias [3].

Ahora definimos una interfaz para implementarla en una clase de servicio que contendrá la lógica de negocio necesaria en el ejemplo, como buscar los carros.

Extraído de CarService.java:

public interface CarService {

   /**

    * Retrieve all cars in the catalog.

    * @return all cars

    */

   public List findAll();

   /**

    * search cars according to keyword in name and company.

    * @param keyword for search

    * @return list of car that match the keyword

    */

   public List search(String keyword);

}

En este ejemplo, hemos definido la clase CarServeImpl que implementa la interfaz anterior. Para simplificar, usamos una lista estática de objetos como modelo de datos. Puedes reescribirla para que se conecte a una base de datos en una aplicación real. Los detalles de la implementación no están cubiertos en el ámbito de este artículo, puedes echar una ojeada a continuación en la sección de referencias [4].

Creando la Interfaz de Usuario

Diseñar la interfaz de usuario es un buen comienzo para crear una aplicación, además de que te ayuda a definir el alcance de tu aplicación.

ZK nos provee de cientos de componentes, listos para ser usados en el interfaz del usuario, por lo tanto un desarrollador puede crear la interfaz de usuario que desee combinando y mezclando esos componentes sin tener que crearlos desde 0.

En ZK puedes usar el ZK Markup Language para la creación del Interfaz del usuario (ZUML) [5], que es un lenguaje estructurado como un XML, que te permite definir la Interfaz del Usuario.

La convención que se utiliza en ZK es que para los ficheros en formato ZUML utilicemos la extensión .zul como sufijo. En los ficheros zul, podemos representar un componente como un elemento del XML (tag) y configurarlo (estilo, comportamiento, funcionalidad) mediante los atributos del elemento XML. [6]

En el caso de esta aplicación de ejemplo, primero, queremos diseñar una ventana con un título específico y bordes normales, como si fuera el borde exterior (marco) de la aplicación.

Extraído de search.zul:

<window title="Search" width="600px" border="normal">
   <!-- put child components inside a tag's body -->
</window>

Como "window" es el componente que contiene al resto, lo llamamos componente raíz o "root". El componente "window" (ventana) normalmente se usa como contenedor de otros componentes, porque en esencia, simplemente muestra una ventana vacía como en una aplicación de escritorio tradicional, y en esta podemos añadir los componentes que queramos.

Los componentes dentro de la ventana los llamaremos hijos o "child", y deben estar dentro del cuerpo del elemento "window".

Por ejemplo, hacemos que aparezca el título de la ventana estableciendo texto en el atributo "title" del elemento "window", y hacemos visible el borde de la ventana estableciendo el atributo "border". En el caso del ancho, usaremos el atributo "width", pero en este caso estableceremos el valor de la propiedad CSS, es decir "800px" o "60%".

Básicamente, el interfaz de usuario de nuestra aplicación de ejemplo se divide en 3 áreas dentro de la ventana ("window"), que son (de arriba a abajo): área del buscador, área de listado de los carros y área de detalles del carro.


Área del buscador

Trabajar con los componentes de ZK es como trabajar construir bloques de código, puedes combinar y mezclar componentes que existan (incluso crear los tuyos propios) para crear la interfaz de usuario que desees.

Para permitir a los usuarios buscar, necesitamos un componente que les permita escribir el texto, es decir un "input", y un botón para lanzar la búsqueda.

A continuación vemos un ejemplo de cómo podemos usar algunos componentes simples para cubrir estos requisitos.

Extraído de search.zul:

<hbox align="center">
   Keyword:
   <textbox id="keywordBox" />
   <button id="searchButton" label="Search" image="/img/search.png" />
</hbox>

hbox es un componente contenedor, que ordena horizontalmente los componentes que contenga. Seguro que has adivinado, la "h" de "hbox" significa horizontal. Como los componentes hijos o "child", tienen diferentes tamaños, establecemos el atrubuto "align" con valor "center" para que se alineen, entre ellos sobre su línea central.

En algunos componentes del ejemplo también especificamos un atributo "id", esto nos permitirá referirnos a ellos y por lo tanto poder controlarlos usando el "id". Si quieres convertir el botón en un botón con imagen solo tienes que especificar el path de la imagen en el atributo "image" del mismo.

Área de listado de los coches

ZK dispone de muchos componentes para mostrar un conjunto de datos, como por ejemplo los componentes de lista "listbox", malla "grid" y árbol "tree". En este ejemplo, hemos elegido usar una lista "listbox" para mostrar un listado de coches, con tres columnas: Nombre, Compañía y Precio.

Establecemos el atributo "height", de forma que se mostrarán tantas filas como quepan; puedes navegar con la barra de scroll para ver el resto de filas.

El atributo "emptyMessage" se usa para mostrar un mensaje cuando la lista no contiene elementos.

Puesto que el componente de lista "listbox" también es un componente contenedor puedes añadirle un componente "listhead" para mostrar y definir los nombres de las columnas. También puedes añadirle un componente "listitem" para mostrar los datos, y dentro de este componente "listcell", tantos como columnas hayas definido (en el "listhead" por ejemplo).

En el siguiente código de ejemplo usamos "listcell" con contenido estático (3 listcells) para mostrar la estructura de un componente "listitem", pero a continuación, te mostramos cómo crear un listitem dinámicamente, de acuerdo a los datos que recibe.

Extraído de search.zul:

<listbox id="carListbox" height="160px" emptyMessage="No car found in the result">
   <listhead>
       <listheader label="Name" />
       <listheader label="Company" />
       <listheader label="Price" width="20%"/>
   </listhead>
   <listitem>
       <listcell label="product name"></listcell>
       <listcell label="company"></listcell>
       <listcell>$<label value="price" /></listcell>
   </listitem>
</listbox>

Área de detalles del coche

Al igual que el "hbox", "vbox" es un componente que distribuye los componentes hijos "child", pero en este caso en vertical. Combinando estos 2 componentes contenedores, podemos mostrar más información en la pantalla. El atributo "style" permite personalizar el estilo del componente escribiendo en él CSS directamente.

Extraído de search.zul

<hbox style="margin-top:20px">
   <image id="previewImage" width="250px" />
   <vbox>
       <label id="nameLabel" />
       <label id="companyLabel" />
       <label id="priceLabel" />
       <label id="descriptionLabel"/>
   </vbox>
</hbox>

Para ver el fichero search.zul diríjase a la sesión de referencias [7].

Manipulando la lógica de la UI.

El próximo paso después de construir una UI (Interfaz Gráfica de Usuario) es hacer que responda al usuario. A continuación realizaremos una aproximación al mecanismo para controlar los componentes de la UI por ti mismo. Este mecanismo puede ser clasificado en el patrón de diseño  Modelo-Vista-Controlador (MVC) [8]. Este patrón divide la aplicación en tres partes:

El Modelo consiste en los datos de la aplicación y las reglas del negocio. CarService y otras clases usadas por ella representan esta parte de la aplicación de ejemplo.

La Vista representa la interfaz de usuario. La página zul que contiene los componentes ZK representa esta parte. La interacción del usuario con los componentes genera eventos que son lanzados a los controladores.

El Controlador juega el papel de coordinador entre la Vista y el Modelo. Recibe los eventos desde la Vista para actualizar el Modelo y busca datos en el modelo para cambiar la presentación de la Vista.


Referencias:

{ Leer Más }


miércoles, 17 de abril de 2013

Profundización en el estudio del framework ZK.

En la entrada anterior conocimos que ZK es un framework para desarrollar Interfaces Gráficas de Usuario (UI), que permite construir increíbles aplicaciones para la web y los móviles, sin tener que aprender JavaScript o AJAX [1]. Entre otros temas se abordó el proceso de composición de las UI y la definición del controlador de la UI. En esta entrada profundizaremos el estudio del framework ZK, dando continuidad al código de ejemplo que sirvió para ilustrar la entrada previa.

Manipulando la acción del usuario
Una de las ventajas de la aplicación de ejemplo “formulario de registro“, es que el “Submit button” está habilitado solamente cuando el usuario marca el “Accept Term of use” checkbox.

Primeramente, el botón “Submit” está deshabilitado cuando “Accept Term of use” checkbox  permanece sin marcar.

Cuando el "Accept Term" checkbox, es marcado, el botón “Submit” es habilitado con un icono de cheque.


ZK es un framework manejado por eventos, es por ello que la acción del usuario es manipulada escuchando a los eventos del componente. ZK proporciona una anotación @Listen qué puede usarse en un método para escuchar el evento de un componente especificado por usted. Para lograr la funcionalidad anterior, usted podría anotar un método para escuchar el evento "onCheck" del "Accept Term of Use" checkbox". Siempre que un usuario marque/desmarque la casilla de verificación para activar el evento del "onCheck", ZK invoca el método anotado. Nosotros implementamos este efecto  en la UI, cambiando las propiedades del componente (Objetos Java) en la anotación del método.


Línea 7: Uso de @Listen para declarar un método que manipula el evento onCheck del "acceptTermBox".

Línea 10,11: Habilitando el botón “Submit” y mostrando el icono de chequeado cuando el "Accept Term of Use" checkbox está marcado.

Línea 13,14: Deshabilitando el botón “submit” y limpiar el icono que representa el chequeo.

Con la ayuda de ZK, usted puede fácilmente adicionar a su aplicación efectos de UI elegantes como el tooltip, drag & drop, and hot key, etc. [2]

Fácil integración con otro Framework de Java.
Como ZK te permite manipular las interfaces gráficas de usuario a través del controlador en el lado del servidor, la clase controladora es por tanto el principal punto de extensión para integrar cualquier biblioteca o framework de Java. Para integrar ZK con otro framework, escribe el código de tu controlador para usar clases de la biblioteca que construye tu negocio o la capa de persistencia.

Integrar bibliotecas de terceros.
Con la ayuda del Controlador de UI de ZK,  SelectorCompose, es fácil integrar el legado de tu sistema servicio clase, objeto del dominio y cualquier otra biblioteca de terceros como por ejemplo Log4j.


Línea 4,12: Llamada a Log4j para almacenar la traza de un error.
Línea 5,11: Uso del legado de tu sistema de objetos en el controlador.
Línea 6,11: Uso de su propio objeto de dominio.
Integrando los frameworks de las capas de Negocio y de Persistencia
Es muy importante que un framework de UI pueda cooperar con otros frameworks de las capas de Negocio y de Persistencia  al construir una aplicación web multicapas. ZK es fácilmente el integrable con otros frameworks de la capa de negocio como “Spring”. 
Asuma que usted ha implementado algunas clases según el patrón Objeto de Acceso de Datos (DAO, como la capa de persistencia de su aplicación con Hiberne, JPA u otro framework de persistencia. En la clase controladora usted debe usar estas clases para implementar los requisitos de su aplicación.



Línea 1: Para usar CDI, simplemente use la clase: org.zkoss.zkplus.cdi.DelegatingVariableResolver.class

Línea 4: Para las variables que tengan @WireVariable, ZK inyectara “beans” calificados recuperándolos del contexto Spring.

{ Leer Más }


martes, 16 de abril de 2013

Introducción al framework ZK.

¿Qué es ZK?

ZK es un framework para desarrollar Interfaces Gráficas de Usuario, que permite construir increíbles aplicaciones para la web y los móviles, sin tener que aprender JavaScript o AJAX [1]. 

Composición rápida de Interfaces Graficas de Usuario
Construir interfaces gráficas con  ZK es fácil; simplemente puede realizar combinaciones de los centenares de componentes ya existentes. Usted puede rápidamente crear su propia interfaz del usuario con varios componentes de ZK. Se puede configurar el estilo, el comportamiento y la función de cada componente para ajustarse a sus deseos.
Imagen 1: Ejemplo de formulario de registro. 

ZUL, un lenguaje estructurado al estilo XML y fácil de leer, se usa para describir el formulario de registro, mostrado arriba. 
Imagen 2: Fichero .ZUL para formulario de registro.
Línea 1: Una anotación representa un componente. Algunos componentes están habilitados para contener componentes hijos dentro de ellos. En este ejemplo, una ventana contiene una rejilla (grid).
Línea 29: Usted puede asignar el atributo “id” a un componente, de esta forma puede controlarlo luego, en el código de una clase controladora de Interface de Usuario.
ZK también le permite crear interfaces graficas de usuario, programadas de forma similar a Java Swing dentro de un Richlet [2].
Los componentes para interfaces gráficas de ZK son como bloques; usted puede combinar, mezclar o heredar para crear un nuevo componente para cumplir con requisitos diversos. Esta versatilidad aumenta la reusabilidad y la modularidad [3].
Control intuitivo de la interfaz gráfica de usuario.
ZK es un framework basado en componentes, con un modelo de programación manejado por eventos, es por ello, que los desarrolladores adicionan métodos para responder a los eventos de los componentes que son disparados por la interacción de los usuarios.
Controlador de la interfaz gráfica de usuario.
Para controlar la interfaz gráfica de usuario, primeramente, usted necesita implementar una clase controladora que herede de la clase SelectorConposer de ZK para un ZUL. Entonces, usted puede recuperar el objeto de Java del componente de UI anotando @wire en las variables controlador. Después de haber hecho esto, usted puede controlar y manipular la interfaz gráfica accediendo a las variables miembro que fueron anotadas.
Imagen 3: Controlador de interfaz de usuario.  

Líneas 7, 10: Las variables con nombres  "submitButton" y "acceptTermBox" corresponden a los componentes cuyo atributo id fue especificado en el mencionado ZUL en la sección  previa.
Nosotros podemos usar el controlador de arriba para controlar nuestros componentes de la interfaz de usuario especificando el atributo “apply” en el ZUL. 
Imagen 4: Uso de "apply" en el ZUL. 
Línea 2: Aplicando el controlador al componente raíz, usted puedo controlar todos los componentes hijos dentro del componente raíz.
En las próximas entradas estaremos profundizando en las ventajas de trabajar con el framework ZK, a través de sus numerosas funcionalidades para la creación de interfaces gráficas de usuario.
 

 

{ Leer Más }


miércoles, 10 de abril de 2013

Creando una aplicación web HTML5 en Netbeans en 5 minutos que consume datos a través de un servicio RESTful.

Exponer datos a través de una aplicación web siempre es un requerimiento en cualquier aplicación. Los IDE de desarrollo en menor o mayor grado hacen de este trabajo cada vez una simpleza mayor. Para ilustrar esta afirmación les traigo en esta entrada como exponer la información de una tabla a través de un servicio RESTful y cómo construir un cliente de este servicio que se despliega  en una aplicación HTML5. No se preocupen, no tienen que saber nada de esto. Solo seguir los pasos:

Prerrequisitos:

  • Tener un Sistema Gestor de Bases de Datos instalado, con una base de datos y tablas con información guardada. Estás serán consumidas por el servicio a desarrollar.
  • Tener un servidor de aplicaciones. Puede ser Apache tomcat o Glassfish. Almacenará la aplicación y el servicio.
  • Tener el Netbeans 7.3 con un servidor configurado para el tomcat o el Glassfish que tienes desplegado.
Paso 1:

Abrir el Netbeans y crear un proyecto web con Maven:

Paso 2:

Seleccionar en el wizard para crear un servicio RESTful con acceso a una base de datos relacional:

Paso 3:

En dependencia de como tengas la conexión a la base de datos ya sea por JNDI o creando una conexión directa con JDBC seleccionas la o las tablas necesarias y se mapean contra las entidades JPA.
Paso 4:
Luego de terminado el paso 3 tendrás esta estructura en tu proyecto:


Ahí podrás probar  el funcionamiento del servicio dando clic derecho encima de una de las operaciones y dándole a la segunda opción.

Así en 4 pasos has creado un servicio RESTful que accede a una base de datos relacional usando JPA. Ahora vamos a ver como se crea una aplicación con HTML5.

Es importante que este proyecto esté configurado para ser levantado desde el servidor tomcat y que se haya creado correctamente la conexión a la base de datos.

Paso 1:

Creas un nuevo proyecto “HTML5 Application”.


Paso 2:

En el wizard seleccionas que vas a crear un nuevo fichero que tendrá un cliente JavaScript para un servicio RESTful.


Paso 3:

Termina de configurar este cliente especificándole la salida de interfaz de usuario que deseas y el proyecto donde está  el servicio RESTful.


Cuando termines tendrás algo como esto:


Finalmente cuando ejecutes el proyecto y te habrá  en la aplicación en el servidor verás algo como esto:


Es válido aclarar que debes usar el navegador Chrome y un componente para su uso con Netbeans, de lo contrario no te funcionará.

{ Leer Más }


IconIconIcon