Combos encadenados en formulario, version 6.x

Buenas.

He estado buscando por el foro sin demasiado éxito. Necesito incluir en un formulario de registro dos combos encadenados, uno que cambie sus valores en función de lo que hay seleccionado en el otro (el clásico selecciono país y en otro combo se muestran las provincias de ese país).

Gracias de antemano, un saludo.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Aquí está hecho pero con una

Aquí está hecho pero con una versión anterior de Drupal...

Saludos

Hola, he conseguido

Hola,

he conseguido hacerlo.

sigue este ejemplo de la Web de Drupal

Espero que te sirva

¿Cómo consigues capturar el

¿Cómo consigues capturar el valor del primer combo? Ese es el gran problema ... :S

Ahora mismo el problema que tengo es que cuando cambio el primer combo, el formulario entero reacciona (se recarga, lo cual no es lo suyo) y me arroja los siguientes errores:

El campo Nombre es obligatorio.
El campo Apellidos es obligatorio.
El campo Login es obligatorio.
El campo Contraseña es obligatorio.
El campo Confirmación de la contraseña es obligatorio.
El campo Dirección de email es obligatorio.
warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'test_form' not found or invalid function name in C:\xampp\htdocs\includes\form.inc on line 372.

Los primeros errores me hacen pensar que al cambiar el primer combo se hace un submit. 'test_form' es la función que uso para generar mi formulario.

Perdona por tardar tanto en

Perdona por tardar tanto en contestarte, es que ando liado

yo no empleé AHAH...preferí usar AJAX.

mi caso es el siguiente:
tengo 2 selects. uno de taxonomía y otro de suscritos a la taxonomía
simplemente observé en el código fuente el valor del id del primero y cree un fichero .js con el evento asociado al cambio. En dicho evento se llama a una página .php que es la que hace la consulta con la base de datos. Esta consulta se devuelve al fichero .js. El fichero .js establece el valor del segundo select. Este fichero .js debes añadirlo a drupal empleando la función drupal_add_js().

Mi problema es que ahora no recoge el valor del segundo select al enviar el segundo formulario ya que mi segundo select fue añadido sin emplear hook_form_alter(). Voy a intentar añadirlo empleando este hook y te cuento.

Mira este ejemplo

Espero que te sirva

Bueno pues, parece que voy

Bueno pues, parece que voy avanzando, pero leeeeentamente.

Ahora mismo consigo que los dos selects funcionen correctamente y además puedo capturar los valores de dichos selects desde $form_state['values'][etc]. Ahora, los problemas que se me presentan son otros, tengo la sensación de que hacer que cada pequeña cosa funcione requiere una desmesurada cantidad de tiempo.

Mi primer problema es que después de hacer click en el boton de submit no me redirige a la página que tengo especificada ($form['#redirect'] = 'node/10'). Este código lo he metido dentro de la función que genera el formulario, dentro del callback, dentro del código del botón submit... nada.

Otro problema es que si pongo campos como requeridos, al cambiar el valor del primer select me saca mensajes de "tal campo es obligatorio". Sigo pensando que cada vez que se hace click en el primer select, se llama al submit handler, vamos, que se recarga el formulario entero. Y es ahí donde el valor ['#redirect'] se pierde.

En fin. Sigo con ello.

Quizá tengas que poner la

Quizá tengas que poner la dirección del redirect en la caché del formulario.

En cuanto al segundo problema, claramente estás haciendo un submit de todo el formulario. Para que no haga un submit tienes que crear un menu_callback en el hook_form
algo así

$items['newsletter/cambia_select_js'] = array(
'page callback' => 'ahah_select2',
'type' => MENU_CALLBACK,
'access arguments' => array('access content'),
);

donde ahah_select2 es el nombre de la función que va a modificar el segundo select en función de lo que hayas seleccionado en este
Luego en las propiedades del select pones lo siguiente
'#ahah' => array(
'event' => 'change',
'path' => 'newsletter/cambia_select_js',
'wrapper' => 'select2',
'effect' => 'fade',
'method' => 'replace'
)

wrapper es el div del segundo select...
El problema es que en Drupal tienes que realizar este cambio también en el formulario que se encuentra en la caché.

Otra forma de hacerlo es usando un fichero javascript y otro fichero php en el que realizas la consulta para el segundo select. El caso es que para que no tengas que andar con el formulario de la caché, creas este select en el contenido manualmente, lo rellenas con todos los datos posibles y lo ocultas usando javascript si no se ha seleccionado nada en el primer select. Una vez que se seleccione algo en el primero, harás la llamada AJAX y harás visible el segundo select con los datos relacionados con el primero. Este fichero javascript deberás añadirlo a Drupal, usando la función drupal_add_js

La verdad, es que en esto, Drupal es un "poco" coñazo...

mmmm... he encontrado un

mmmm...

he encontrado un módulo que supuestamente sirve para todos los países y provincias. Igual te sirve: Addresses

ED: y este para ayudarte con AHAH: AHAH Helper

Muchas gracias, ahora le echo

Muchas gracias, ahora le echo un vistazo y te comento.

mmm...una pregunta: Los 2

mmm...una pregunta:

Los 2 selects se muestran de partida en el formulario o primero se selecciona el país y seguidamente aparece otro select con las provincias?

Si es el primer caso, entonces hay que usar JQuery (AJAX)

Si es el segundo, entonces hay que usar AHAH.

AHAH es más complicado, ya que tienes que tener el 'formulario-cache' y el formulario mostrado en pantalla sincronizados, ya que si no puede dar problemas...Lee aquí para más información.

Ahora estoy intentando hacerlo con JQuery, ya que AHAH me da problemas...

Un saludo

Supongo que en la función

Supongo que en la función modulo_fill_data debes hacer la consulta. sería algo así:

$output = db_query("SELECT nombre_provincia FROM {provincias} where id_pais=%d",$id_pais);

Lo que no se es como accedes al valor de $id_pais (probablemente puedas hacerlo empleando $form['Datos Personales']['profile_nombre_pais']

Otra cosa que no tengo muy clara es que si esa consulta te vale así o tienes que convertirla en un array con db_fetch_array() o en un objeto con db_fetch_object()

También hay una serie de cosas importantes sobre como realizar correctamente las consultas en Drupal que deberías mirar en drupal.org

Si averiguo algo más ya te aviso.

Un saludo