Imagen de bea

Formularios Multi-Step, formularios por pasos..

A continuación explico un método para crear un formulario multistep.
La forma en que lo muestro es en un módulo llamado multistep.
En resumen lo que hace es lo siguiente:

  1. Sólo podrán acceder al formulario los que tengan el permiso "form multistep"
  2. El formulario comienza al entrar en: /formulario/multistep
  3. El primer formulario muestra lo siguiente
    ¿¿¿Pregunta 1???
    - Respuesta A
    - Respuesta B

    Limpiar Formulario Siguiente >>

  4. Rellenado el primer formulario, accedes al siguiente
    ¿¿¿Pregunta 2???
    - Respuesta C
    - Respuesta D

    Limpiar Formulario Siguiente >>

  5. Y por último ...
    ¿¿¿Pregunta 3???
    - Respuesta E
    - Respuesta F

    Limpiar Formulario Enviar

<?php
// permisos para realizar el formulario
function multistep_perm() {
 
$perms =  array('form multistep');
  return
$perms;
}
?>
<?php
// función para crear el enlace para rellenar el formulario
function multistep_menu() {
 
$items = array();
 
$items['formulario/multistep'] = array(
   
'title' => t('Multi-step'),
   
'description' => t('formulario multi-step..'),
   
'page callback' => 'multistep_form',
   
'page arguments' => array('multistep_usuario_add_form'),
   
'access arguments' => array('form multistep'),
   
'type' => MENU_CALLBACK,
  );

return

$items;
}
?>
<?php
function multistep_form() {
  return
drupal_get_form('multistep_my_form');
}

function

multistep_my_form($form_state) {
 
$form = array();
 
// si page_two es TRUE, entonces irá al formulario 2
 
if ($form_state['storage']['page_two'] == 1) {
    return
multistep_my_form_page_two($lugar);
  }
 
// y si page_tres es TRUE, entonces irá al form 3
 
elseif ($form_state['storage']['page_tres'] == 1) {
    return
multistep_my_form_page_tres();
  }

 

// y si no... pues hace el primero..
  
$form['pregunta_1'] = array(
   
'#type' => 'radios',
   
'#options' => array ('Respuesta A' => t('Respuesta A'), 'Respuesta B' => t('Respuesta B')),
   
'#title' => t('¿¿¿Pregunta 1???'),
   
'#default_value' => '',
   
'#required' => 1,
  );
$form['clear'] = array(
   
'#type' => 'submit',
   
'#value' => t('Limpiar formulario'),
   
'#validate' => array('multistep_my_form_clear'),
  );

 

$form['next'] = array(
   
'#type' => 'submit',
   
'#value' => t('Siguiente >>'),
  );

  return

$form;
}
?>
<?php
// el segundo formulario...

function multistep_my_form_page_two($lugar) {
  
$form['pregunta_2'] = array(
   
'#type' => 'radios',
   
'#options' => array ('Respuesta C' => t('Respuesta C'), 'Respuesta D' => t('Respuesta D')),
   
'#title' => t('¿¿¿Pregunta 2???'),
   
'#default_value' => '',
   
'#required' => 1,
   
'#description' => t('descripción de la pregunta 2..'),
  );

$form['clear'] = array(
   
'#type' => 'submit',
   
'#value' => t('Limpiar formulario'),
   
'#validate' => array('multistep_my_form_clear'),
  );
 
$form['next2'] = array(
   
'#type' => 'submit',
   
'#value' => t('Siguiente >>'),
  );

  return

$form;
}
?>
<?php
// el tercer formulario
function multistep_my_form_page_tres() {
  
$form['pregunta_3'] = array(
   
'#type' => 'radios',
   
'#options' => array ('Respuesta E' => t('Respuesta E'), 'Respuesta F' => t('Respuesta F')),
   
'#title' => t('¿¿¿Pregunta 3???'),
   
'#default_value' => '',
   
'#required' => 1,
  );
  
$form['clear'] = array(
   
'#type' => 'submit',
   
'#value' => t('Limpiar formulario'),
   
'#validate' => array('multistep_my_form_clear'),
  );
 
$form['submit'] = array(
   
'#type' => 'submit',
   
'#value' => 'Enviar',
  );
  return
$form;
}
?>
<?php
// función submit..
function multistep_my_form_submit($form, &$form_state) {
// si el id es "edit-next", significa que se acaba de rellenar el primer formulario, asi que ponemos TRUE el 2º. ($form_state['storage']['page_two'] = TRUE;)
if ($form_state['clicked_button']['#id'] == 'edit-next') {
   
$form_state['storage']['page_two'] = TRUE;
   
$form_state['storage']['page_one_values'] = $form_state['values'];
   
drupal_set_message(t('Mensaje que se envia despues de rellenar la primera pregunta')); }
//al contrario si es edit-next2, es que el rellenado es el segundo..
elseif ($form_state['clicked_button']['#id'] == 'edit-next2') {
   
$form_state['storage']['page_tres'] = TRUE;
   
$form_state['storage']['page_two'] = $form_state['values'];
   
drupal_set_message(t('Mensaje que se envia despues de rellenar la segunda pregunta'));
}
// y edit-submit es cuando se ha rellenado el tercero..
elseif ($form_state['clicked_button']['#id'] == 'edit-submit') {
   
drupal_set_message(t('Muchas gracias por rellenar la encuesta...'));

    unset (

$form_state['storage']);
   
$form_state['redirect'] = '<front>'; // Después de rellenar el formulario se redigirá a la home

}
?>
<?php
//Función para borrar los datos ...
function multistep_my_form_clear($form, &$form_state) {
  unset (
$form_state['values']);
 
$form_state['rebuild'] = TRUE;
}
?>

Comentarios

Muy bueno y una duda

Soy nueva en esto de drupal y me está dando unos quebraderos de cabeza tremendos pero bueno, ¿a donde se colocan estos códigos php que en el artículo se han expuesto.??..Please no tengo ni idea de donde colocarlos..

Muchas gracias

Gracias

Gracias por el artículo.
A mi me parece que la API de drupal5 está más currada que la del 6. Entender cómo funicionaban las forms en drp5 no me costó, pero ahora con la drp6 me está costando... espero que tu artículo me "ilumine" puesto que estoy hasta el gorro y eso que lo único que estoy haciendo es adaptar un módulo de drp5 a drp6.

dudas grandes

hola ante todo buenos dias soy nuevo con php y mysql y quiero tener idea con un ejemplo de como enviar varios formularios a una base de datos...
es decir digamos que sea una ficha de dtos socioeconimicos de una persona pero para mostrar en un solo formulario es mucha informacion.. entonces para esto dividimos la ficha en varios formularios los cuales se podran navegar por medio de botones siguiente y anterior hasta el final que seria enviar datos... de tener una respuesta se los agradezco..
amesia18@gmail.com

form multistep

Tengo una duda, ¿esta es la forma estandar de hacer los formularios multi_step de Drupal 6?

Un saludo y gracias

Oskar

Si es la version "oficial"

hola oskar

Pues si esta es segun la documentación una de las formas de resolver el tema de un formulario tipo asistente. En drupal 5-x el tema se complica ya que no esta el parámetro $form_state, en este elemento esta el estado que envía y comprueba en los submit.

Karlos
http://www.investic.net/blog/karlos

Gracias

Muchas gracias por la rápida contestación Karlos, creo que viendo esto me voy a pasar a d6 más rápido de lo que pensaba.

Un saludo

Oskar

Documentados, soluciones con software libre

Drupal 6 mola pero con matices

De nada oskar. De todos modos respecto a drupal 6 en algunas cosas es una pasada y lo cierto es que me gusta mucho como los cambios de versiones son con sentido y no por las inercias del sector.

Pero, (siempre hay peros) drupal 6 esta muy bien cuando el proyecto no tiene una complejidad muy elevada que requiera de módulos de "tercer nivel", me explico.

En los diferentes análisis que estoy haciendo sobre la relación de los módulos contribuidos (aquí no entran los del core) me encuentro con tres niveles de módulos.

-Primer nivel (imprescindibles) : CCK, Views, pathauto, etc. Esta serie de módulos aun siendo muy complejos se tiene unas garantías de que los posibles bugs se corrigen rápido.

-Segundo nivel (funcionalidades extras): estos módulos son Og, panel, simple news, Media mover etc. Estos módulos hacen que drupal sea otra cosas y son parte de la potencia de nuestro entorno, pero al ser muy concretos su soporte es mas lento, y su relación con drupal 6 es buena pero con paciencia.

-Tercer nivel (apoyo o cobertura) En estos módulos incluyo toda una serie de módulos que permiten añadir funcionalidades al resto, como el export table cvs, jquerys varios, widget cck, relación mail etc. Es aqui donde drupal 6 flaquea un poco.

En resumen sin con los módulos del primer nivel se puede contemplar un desarrollo casi completo, sin ninguna duda Drupal 6, incluso si se tiene que hacer uso de algunos de los módulos de segundo nivel soportados en drupal 6 también es interesante plantear esta opción ya que es lo que nos viene encima, pero teniendo muy en cuenta que nos podemos encontrar con varios muros, los del tercer nivel.

Espero que se entienda.
Karlos
http://www.investic.net/blog/karlos

Gracias

Por supuesto, es uno de los motivos por los que en Documentados aun seguimos tirando de D5, no hay tanto soporte para los módulos de 3º nivel, y miedo me da cuando pasemos a d7 lo que pasará con los módulos de 3º nivel y de 2º nivel también.

Creo que estamos corriendo mucho en las versiones, y aunque d6 es una gran mejora, hay que tener en cuenta que no todos los módulos están desarrollados por empresas,y aquellos programadores altruistas no siempre tienen tiempo para migrar, y menos aun para mantener 2, 3 o 4 versiones.

En fins, mi idea es un módulo sencillito (que mentiroso soy), y solo tira del core.

Un saludo y gracias

Oskar

Documentados, soluciones con software libre

Gracias por el articulo, un

Gracias por el articulo, un dia de estos he de ponerme con este tipo de formularios.

Lo unico "malo" que veo en hacer asi los formularios, es que el cliente no puede modificarlos (a no ser que sepa php claro).

Pero al menos, se puede hacer formularios multistep :)

Sabes si hay planes para ampliar webform en este sentido?

Todavía estamos montando esta cocina con Drupal, así que probablemente más de un detalle esté sin acabar en esta web

Inicio de sesión

Navegación

Comentarios recientes

Nuevos

  • fernando
  • dsevila
  • zialdoka
  • ek10
  • juanramonperez