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:
Limpiar Formulario Siguiente >>
Limpiar Formulario Siguiente >>
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;
}
?>