Webeando (con perdón)

Categorías:

Archivos:

<Marzo 2017
Lu Ma Mi Ju Vi Sa Do
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    


Blogalia

[CF] Seleccionado varios valores de una lista a través de 'checkboxes'

Respondiendo a un comentario en otro post, aprovecho para comentar aquí una solución sencilla (al menos, la más sencilla que yo he encontrado) a un problema con el que nos encontramos a menudo: dada una lista de resultados, seleccionar mediante checkbox algunos de ellos para pasárselos vía formulario a otro script. Yo lo uso mucho para seleccionar elementos que deben ser eliminados en paneles de control, para selección de los temas de suscripción en listas de correo, y cosas por el estilo...

Partimos de tres detalles a tener en cuenta:

- ColdFusion permite recuperar en una variable, form.fieldnames, una lista de todas las variables enviadas por el formulario (usando el método post, que, por otro lado, es el más recomendable).
- los checkbox no marcados no se envían al programa que trata el formulario. Un input tipo texto en el que no se escriba nada envía el nombre de la variable, con el contenido vacío. Un checkbox no. Sólo se envía, con el valor 'on', si está marcado. Si no lo está, no envía nada, nisquiera el nombre de la variable.
- ColdFusion permite hacer bucles sobre listas, dándole el valor de cada uno de sus elementos a una variable en cada iteración.

El primer paso es construir el formulario. Suponemos que tenemos una consulta que nos devuelve una lista de empleados, llamada empleados, cada uno con un identificador único (id) y su nombre (nombre):

<form action="recibe.cfm" method="post">

(... otros campos ...)

<ul>
<cfoutput query="empleados">
	<li><input type="checkbox" name="codigo#empleados.Id#">#empleados.nombre#</li>
</cfoutput>
</ul>

(... otros campos ...)

</form>


(dado que se trata de una lista de empleados, parece que meterlo en una lista es lo más adecuado. Es irrelevante para lo que nos interesa)

Esto generará una lista tal que, por ejemplo:

<form action="recibe.cfm" method="post">

(... otros campos ...)

<ul>
	<li><input type="checkbox" name="codigo15">Pedro</li>
	<li><input type="checkbox" name="codigo26">Juan</li>
	<li><input type="checkbox" name="codigo32">Felipe</li>
</ul>

(... otros campos ...)

</form>


El meollo de la cuestión está en el nombre que tienen los checkbox, compuesto por una cadena de caracteres, más el identificador que devuelve la consulta. Esta cadena puede ser cualquier cosa al gusto del chef, siempre que no coincida con el nombre de ningún otro campo en el formulario, y siempre que no comience por un número (CF no se lleva bien con las variables que empiezan por un número) (tampoco se recomienda usar caracteres no ingleses, ni, en general, nada que no deba ir en un nombre de variable). Y en concreto, es importante fijarse en la longitud que tiene esta cadena. En este ejemplo, la longitud de "codigo" es 6.

recibe.cfm, el script que trata los datos del formulario, recibirá los checkbox que hayamos marcado, el resto de campos del formulario, y un par más de variables, de las cuales la que más nos interesa es form.fieldnames (si se dispone de la versión 6 o superior de CF, es interesante hacer un <cfdump var="#form#">, para ver qué es exactamente lo que envía el formulario).

Suponiendo que hayamos marcado las casillas de Pedro y Felipe, y que hayan dos campos más en el formulario llamados autorizado y horario (por poner algo), form.fieldnames tendrá el valor "autorizado,codigo15,codigo32,horario"

La idea es ir recorriendo esa cadena e ir viendo que nombres de campo corresponden en su parte izquierda con la cadena que asignamos en el formulario, y tomar los valores que quedan en la parte derecha:

<cfloop list="#form.FieldNames#" index="indice">
<cfif (Left(indice,6) eq "codigo")>

	<cfset Id=Right(indice,Len(indice)-6)>
		
	(... hacer cosas con el código recuperado, por ejemplo, ListAdd() para crear una lista sólo con los identificadores seleccionados ...)

</cfif>
</cfloop>


La traza es muy sencilla: en la primera iteración, la variable indice toma el valor autorizado. No se cumple la condición, y pasa al segundo valor de la lista, codigo15. Cumple la condición, por lo que la variable Id toma el valor 15. Hace lo que tenga que hacer con ella, y pasa al tercer elemento de la lista, codigo32, que también cumple la condición, etc, etc...

El "número mágico" que aparece, el 6, es la longitud de la cadena usada.

Al final del bucle, habremos tratado todos los campos del formulario que se corresponden con los elementos checkbox marcados, y habremos extraído los valores que nos interesaban.

Nótese que no nos hemos interesado para nada en el valor de las variables del formulario (que por otro lado, es siempre el mismo para los checkbox: on). No nos hace falta, toda la información que necesitamos de estos campos se transmite en el nombre del mismo.

Espero que les sea útil. Puede parecer algo rebuscado, pero no he encontrado manera más sencilla. Si alguien la conoce, se agradecen comentarios y sugerencias ;)

2007-03-21 00:48 | Categoría: ColdFusion | 4 Comentarios | Enlace

Referencias (TrackBacks)

URL de trackback de esta historia http://webcraft.blogalia.com//trackbacks/48096

Comentarios

1
De: Char_lie Fecha: 2007-04-03 19:23

Muchisimas gracias por la ayuda, creeme que me salvaste de una.... logre hacer que me funcionara los checkboxes.

Aprovechando tengo otra duda y es que resulta que ahora tengo que realizar unos reportes y tengo que hacerlos con el ColdFusion Report Builder, pero no se como hacer para enviar parametros de una forma hacia el reporte, alguien me podría ayudar?

Gracias.



2
De: Netito Fecha: 2007-04-06 15:10

De nada :)

Mmmmm.... pues la verdad es que aún no he tenido la ocasión de usar el Report Builder, y por lo que he leído está más orientado a informes desde bases de datos, pero no creo que sea demasiado problema enviarle parámetros.... Recomendaría una lectura detallada de la documentación, a ver que dice al respecto...



3
De: Sergio Fecha: 2011-10-24 18:56

Hola, esta muy bien la información, lo probé y me funciono muy bien.

Tengo una pregunta... por ejemplo tengo un listado con un cfoutput donde al nombre de la variable le asigno Proveedor mas un guion bajo y el código del artículo. Ej: (Proveedor_235) a un cfselect, donde el value es igual al ID del proveedor y el display es igual al nombre del proveedor, todos estos los carga al entrar a la pagina así que no se ha hecho ningún Post y no tengo el form.fieldnames definido.

Lo que quiero es hacer una lista por ejemplo de los N resultados que haya arrojado el cfoutput con los id de los proveedores que seleccione en el cfselect y hacer el post y enviar la lista.

Para esto no me sirve el form.fieldnames ya que aun no están definidos, no tendrás por ahí algún otro truco que me pueda ayudar? Te estaría muy agradecido ;)



4
De: Netito Fecha: 2011-11-18 14:02

Hola Sergio,

No te sigo... si no lo he entendido mal, la lista que quieres crear con los proveedores seleccionados se haría en la página que reciba el formulario, una vez que lo envíes. Ahí ya tendrías el form.fieldnames y podrías aplicar este mismo método...



Nombre
Correo-e
URL
Dirección IP: 54.197.74.137 (ab6ac1b4cb)
Comentario

© 2004 - 2005 Netito
Powered by Blogalia