Drupal simplifies form creation by handling the underlying HTML. You define the fields, and Drupal generates the form. While simple forms are straightforward, complex forms with numerous fields can overwhelm users. This article details building multi-page forms in Drupal to improve user experience.
$form_state
array tracks the form's progress and submitted values across pages.Create the Module: Create a directory sites/all/modules/multipageform
and add these files:
multipageform.info
:
<code>name = multipageform description = Creates a multi-page form. core = 7.x</code>
multipageform.module
:
<?php /** * @file * Main module file. */ /** * Implements hook_help(). */ function multipageform_help($path, $arg) { if ($path == 'admin/help#multipageform') { $output = '<h3>' . t('About') . '</h3>'; $output .= '<p>' . t('The multipageform module demonstrates creating a multi-page form.') . '</p>'; return $output; } }
Enable the Module: Enable the multipageform
module in your Drupal administration.
Menu Item: Add a menu item to access the form using hook_menu
:
/** * Implements hook_menu(). */ function multipageform_menu() { $items['multipageform/form1'] = array( 'type' => MENU_CALLBACK, 'access arguments' => array('access content'), 'page callback' => 'drupal_get_form', 'page arguments' => array('multipageform_form1') ); return $items; }
Form Definition: Define the multi-page form using multipageform_form1
and a helper function getForm
:
function multipageform_form1($form, &$form_state) { if (isset($form_state['values'])) { $currstep = $form_state['step'] + 1; } else { $currstep = 0; } $form_state['step'] = $currstep; $allsteps = getForm(); $currform = $allsteps[$currstep]; return $currform; } function getForm() { $form = array(); // Step 1 $step1['name'] = array( '#type' => 'textfield', '#title' => t('Enter your name'), '#description' => t('Your first name') ); $step1['last_name'] = array( '#type' => 'textfield', '#title' => t('Enter your last name'), '#description' => t('Your last name') ); $step1['submit'] = array( '#type' => 'submit', '#value' => t('Next') ); $form[] = $step1; // Step 2 (and so on...) Add more steps as needed. // ... return $form; }
The multipageform_form1_submit
function handles form submission and state persistence:
function multipageform_form1_submit($form, &$form_state) { $form_state['storedvalues'][$form_state['step']] = $form_state['values']; if ($form_state['step'] + 1 != getNumberOfSteps()) { $form_state['rebuild'] = TRUE; } else { // Process final form values (e.g., save to database) $finalformvalues = array(); $currStep = 0; foreach (getForm() as $step) { foreach ($step as $key => $value) { if (strcmp($key, "submit") != 0) { $finalformvalues[$key] = $form_state['storedvalues'][$currStep][$key]; } } $currStep++; } // Store $finalformvalues } } function getNumberOfSteps() { return count(getForm()); }
Add validation to each step using multipageform_form1_validate
:
function multipageform_form1_validate($form, $form_state) { switch ($form_state['step']) { case 0: if (empty($form_state['values']['name'])) { form_set_error('name', t('Name cannot be empty')); } // ... other validations break; // ... other steps } }
This enhanced explanation provides a more structured and comprehensive guide to creating multi-page forms in Drupal using the Form API. Remember to replace placeholder comments with your actual data processing and storage logic. This approach promotes better user experience by breaking down complex forms into manageable steps.
The above is the detailed content of Building a Multi-Page Wizard-like Form in Drupal. For more information, please follow other related articles on the PHP Chinese website!