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;
}
?>