Blog

Combo box cargados local y remotamente (Ajax)

Jun 09, 2009 | Español | By Crysfel | 15 Comments

El día de hoy vamos a hablar de un componente que es muy completo: el ComboBox. Veremos cómo configurar un Combo Box de manera local y de manera remota. Describiremos algunas de sus propiedades en la configuración, crearemos un plantilla para que nuestro Combo Box tenga un formato agradable, y al final daremos un recorrido por las diferentes variaciones del Combo Box que nos ofrece ExtJS, por ejemplo el TimeField.

Combo box cargados local y remotamente (Ajax)
Author: Crysfel

I'm a software developer with 6+ years of experience, when I'm not developing software I may be writing a tutorial, you can follow me on twitter

Material de apoyo

Para poder continuar necesitamos descargar el material de apoyo. Recuerda que este tutorial pertenece a la parte de formularios, y al final del tutorial agregaremos nuestro ComboBox al formulario pero para evitar algunas confusiones haremos este tutorial en un archivo diferente.

Empaquetando el tutorial.

Procedemos a empaquetar nuestro código.

Ext.ns('com.quizzpot.tutorial');

Ext.BLANK_IMAGE_URL = '../ext-3.0/resources/images/default/s.gif';

com.quizzpot.tutorial. ComboBoxTutorial= {
	init: function(){
		//aqui va el codigo del tutorial
       }
}
Ext.onReady(com.quizzpot.tutorial. ComboBoxTutorial.init,com.quizzpot.tutorial. ComboBoxTutorial);

Ventana

A continuación vamos a crear una ventana que alojará nuestros diferentes tipos de ComboBox. Esta ventana nos sirve para visualizar nuestros distintos ComboBoxes que crearemos en este tutorial.

var win=new Ext.Window({
	title: 'ComboBox example',
	bodyStyle:'padding: 10px',		//alejamos los componentes de los bordes
	width:400,
	height:360,
	layout:'form'					//tipo de organización de los componentes
});
win.show();

Del código anterior podemos resaltar la propiedad “layout:’form’“, que para una ventana, el layout por defecto es el “fit“, por lo tanto sobre escribimos la propiedad para mostrar los componentes distribuidos como un formulario.

Ventana

Ventana que contendrá los ComboBox

ComboBox Local

Una vez creada nuestra ventana ahora vamos a crear nuestros ComboBoxes; lo primero que necesitamos son los datos que se cargarán en nuestro ComboBox, la manera más simple de cargar datos en nuestro ComboBox es mediante el uso de un arreglo de datos.

var data=['Code Igniter','Cake Php','Symfony','Zend'];

var comboLocal =new Ext.form.ComboBox({
	fieldLabel:'Frameworks PHP',
	name:'cmb-data',
	forceSelection:true,
	store:data,
	emptyText:'Select a framework...',
	triggerAction: 'all',
	//hideTrigger:true,
	editable:false,
	//minChars:3
});

El código anterior genera un ComboBox, con datos correspondientes a algunos Frameworks existentes de PHP en el mercado. Vamos a ver el significado de las propiedades con las que configuramos nuestro ComboBox:

forceSelection: esta opción obliga al usuario a seleccionar un valor del combo, esto es independiente del tipo de validación allowBlank, que discutiremos en un tema posterior.
store: es la fuente de datos que nuestro combo mostrará, ya hemos hablado sobre este componente.
emptyText: es el texto que se muestra cuando en nuestro combo no se ha seleccionado nada.
triggerAction: esta opción le indica al combo que siempre muestre todos los datos de su store, cuando utilizamos un store remoto aquí le pondríamos el query que se mandaría a nuestra fuente de datos remota.
editable: el combo no puede ser editado, es decir no se le puede escribir algún valor.
hideTrigger: poniendo esta propiedad en true hacemos que el combo aparezca sin el iconito de la flecha hacia abajo (“disparador”).
minChars: nos indica cuantos caracteres debemos de escribir antes de que el combo empiece a mostrar información, en nuestro caso debemos comentar la propiedad editable y no comentar la propiedad minChars para ver su funcionalidad.

Ahora lo agregamos a nuestra ventana:

var win=new Ext.Window({
	bodyStyle:'padding: 10px',//alejamos los componentes de los bordes
	width:400,
	height:360,
	items: comboLocal, //agregamos el combo a la ventana
	layout:'form'		//tipo de organización de los componentes
});
win.show();

Combo sencillo

Un combo cargado con información local

ComboBox Remoto

Ahora vamos a crear un combo que cargaremos con datos de manera remota utilizando Ajax. En esta ocasión usaremos PHP, pero como ya sabemos podemos utilizar cualquier otro lenguaje servidor.

En el ComboBox remoto utilizaremos para nuestra fuente de datos un store de tipo JSON, este componente no se va a detallar debido a que en un tutorial anterior se habló sobre dicho componente.

El código JS queda de la siguiente manera:

//se crea el store
var store= new Ext.data.JsonStore({
		url:'combo.php',
		root: 'data',
		totalProperty: 'num',
		fields: [
			{name:'name', type: 'string'},
			{name:'desc', type: 'string'},
			{name:'logo', type: 'string'},
		]
});

//se crea el combo asignandole el store
var comboRemote=new Ext.form.ComboBox({
	fieldLabel:'Data Base',
	name:'cmb-DBs',
	forceSelection: true,
	store: store, //asignandole el store
	emptyText:'pick one DB...',
	triggerAction: 'all',
	editable:false,
	displayField:'name',
        valueField: 'name'
});

Como podemos observar en las propiedades de nuestro combo le agregamos la propiedad displayField, con esta propiedad le decimos al ComboBox que información mostrar, en este caso nos va a mostrar solo los datos ‘name’ y utilizando la propiedad “valueField” le especificamos cual campo del store utilizar como “value”, puede ser un ID numérico pero en este caso utilizamos el nombre.

Cuando usamos un store remoto podemos utilizar paginación con la propiedad ‘pageSize’, esta propiedad nos permite configurar el número de datos que queremos mostrar en nuestro combo.

Por último es necesario agregar el combo que acabamos de crear a la ventana, de la siguiente manera:

var win=new Ext.Window({
	title: 'ComboBox example',
	bodyStyle:'padding: 10px',		//alejamos los componentes de los bordes
	width:400,
	height:360,
	items: [comboLocal,comboRemote],//se agrega el combo remoto
	layout:'form'					//tipo de organización de los componentes
});
win.show();

Combo remoto

Un ComboBox cargado remotamente utilizando Ajax

Mediante código PHP vamos a exponer la información que mostrará el combo, esta información puede salir de una base de datos, o un servicio web, para poner las cosas simples y entendibles la información esta “hardcode” en arreglos.

<?php
	$dataDB = array(
				array(
					"name"=>"MySQL",
					"desc"=>"The world's most popular open source database",
					"logo"=>"mysql.png"
				),
				array(
					"name"=>"PostgreSQL",
					"desc"=>"The world's advanced open source database",
					"logo"=>"postgresql.png"
				),
				array(
					"name"=>"Oracle",
					"desc"=>"The world's largest enterprise software company",
					"logo"=>"oracle.png"
				),
	);

	$o = array(
			"num"=>count($dataDB),
			"data"=>$dataDB
		);
	echo json_encode($o);
?>

Nótese que se han definidos los campos que el JsonStore acepta, además mediante la función json_decode se esta generando el JSON a partir de un arreglo de PHP.

Datos con formato

Muy bien ahora vamos a darle formato a nuestra información, ocuparemos la información de nuestro combo remoto, así que empecemos. Vamos a crear un nuevo ComboBox que se cargará con los mismos datos que nos proporciona el PHP, ocupando el mismo store del combo anterior.

Para darle formato a nuestro ComboBox ocupamos una plantilla, así que se la vamos a asignar a nuestro nuevo combo mediante una de sus propiedades (“tpl” de “template”). La plantilla está escrita en HTML con un poco de CSS para que la información se presente de una manera más detallada.

var comboRemoteTpl = new Ext.form.ComboBox({
	fieldLabel:'Data Base',
	name:'cmb-Tpl',
	forceSelection:true,
	store:store,
	emptyText:'pick one DB...',
	triggerAction: 'all',
	mode:'remote',
	itemSelector: 'div.search-item',
	tpl: new Ext.XTemplate('<tpl for="."><div class="search-item" style="background-image:url({logo})"><div class="name">{name}</div><div class="desc">{desc}</div></div></tpl>'),
	displayField:'name'
});

Las propiedades que aparecen ahora son:
tpl: le asigna un plantilla a mostrar para cada dato del combo, la plantilla que se crea es una cadena de HTML y con algunos estilos y clases de CSS, en próximos temas se dedicará un tutorial completo para analizar el funcionamiento del objeto “Ext.XTemplate“, por ahora solo es importante mencionar que mediante un ciclo se recorre todos los registros del store y va generando la lista de opciones a presentar al usuario.
itemSelector: esta propiedad nos indica cual va a ser la propiedad del DOM que dispara al evento select de nuestro combo.

Hasta ahora hemos modificado el markup o HTML de la lista desplegable del combo, lo que falta es darle los estilos necesarios de la siguiente manera:

	.search-item{
		border:1px solid #fff;
		padding:3px;
		background-position:right bottom;
		background-repeat:no-repeat;
	}
	.desc{
		padding-right:10px;
	}
	.name{
		font-size:16px !important;
		color:#000022;
	}

Combo personalizado

ComboBox personalizado con un template

Una variación del ComboBox

Existe un componente en ExtJs que es una variación del ComboBox este componente se llama TimeField y sirve para mostrar valores respectivos al tiempo. La mayoría de sus propiedades son las mismas que el ComboBox.

var timeField=new Ext.form.TimeField({
       	fieldLabel: 'Time Field',
       minValue: '4:00',
       maxValue: '23:59',
       increment: 15,
       format:'H:i',
       name:'cb-time'
});

Combo de tiempo

Un combo con el tiempo

Como podemos ver sin mayor complicación hemos creado un nuevo ComboBox que nos muestra datos en formatos de tiempo.

Expliquemos algunas de sus propiedades.
minValue: es el valor mínimo que va a mostrar nuestro campo.
maxValue: el valor máximo que mostrará.
increment: el tamaño del incremento de los valores de nuestro campo.
format: el formato en el que se mostrará nuestros valores de tiempo.

Conclusiones

El día de hoy hemos visto un componente muy completo llamado ComboBox, este componente tiene muchos diferente tipos de configuraciones que lo hacen un componente muy recurrido en todo tipo de aplicaciones con Ext JS.

Para poder ver más de las bondades de este componente no olviden consultar el API de ExtJS.

Si tienes alguna sugerencia no olvides dejar un comentario o inscríbete en el Foro para aclarar tus dudas.

15 Responses to “Combo box cargados local y remotamente (Ajax)”

  • Crysfel Jun 09, 2009

    Este tutorial fué realizado por Jose Armando (@manduks) pronto acabaremos el curso con la ayuda de todos ustedes. :D

  • DrMartin Jun 14, 2009

    Maravilloso ejemplo, exactamente estaba buscando como hacer este tipo de combos en ExtJS.
    ¡gracias!

    :D

  • jose Jun 15, 2009

    Buenas, crysfel como se pondria un title a una windows desde fuera de la creación de la ventana.
    Sigue así, lo que haces es una gran ayuda para todos, gracias.

  • manduks Jun 15, 2009

    hola jose, bueno todos los paneles tienen al metodo setTitle(“Nuevo Titulo”). :) ,
    te recomiendo que te des de alta en los foros donde encontraras respuestas a tus dudas mas rapido y con mayor detalle.

  • Robert Aug 04, 2009

    Muy bien, solo que segui los pasos y la propiedad
    background-repeat:no-repeat; solo funciona para el elemento seleccionado, para los demas me muestra el background repetido :s Saludos

  • Isaac Aug 05, 2009

    como hago para obtener el value de un combox,”solo es value”,no el text

    • Crysfel Aug 05, 2009

      Utiliza el método “cmb.getValue()” ;)

  • Leonid Sep 10, 2009

    Hola, muy bueno e interesante tu tutorial. Y como deberia hacer cuando quiero cargar un combo tomando como base la informacion de un combo anterior. Algo asi como un combo de paises y un segundo de ciudades del pais seleccionado

  • Elías Manchón Sep 11, 2009

    Hice la versión con Mapas en JSP.

    Saludos.

  • Gustavo Sep 15, 2009

    Buenisimo ejemplo, pero llegue hasta aca para aprender a hacer un combo con suggestion box, o sea, que se autocomplete.
    por ejemplo, una lista de paises, si tecleo a, me saldrian todos los paises que empiezan con a, si sigo tecleando hasta ar->se muestren los paises que empiezen con ar y asi sucesivamente.

    Gracias, buenisimo blog!

  • cfontes Sep 22, 2009

    Estoy manejando un combo el cual lleno con los estados de la republica mexicana, quisiera saber como le hago para que por default me aparezca el nombre del primer estado de la lista en vez de aparecer en blanco en espera de una seleccion.

  • Rafael Mar 08, 2010

    en ie este ejemplo no funciona, pero es por el ultimo combo y en la version que tengo de ie no me deja instalar el iedeveloper tool bar

    si encuentro el problema o alguien lo encuentra por favor informelo

  • Rafael Mar 08, 2010

    perdon, es el antepenultimo combo,
    version de ie 7.0.0.573.13

  • jose Jul 27, 2010

    hola
    oye como agrando el largo del jcombox?

    • Crysfel Jul 28, 2010

      Usa la propiedad “width”.

      Saludos

Leave a Reply







Updates

RSS

Subscribe to our feeds to receive updates of our newest posts and free tutorials.

Site search

Maybe we have what you need, would you like to search first?

Donations

Would you buy me a cup of coffee? I am sharing my knowledge and time with you, help this project grow. Thank you!