Создание многошаговых форм (multistep form)
14 января 2017
Пример создания формы из трёх шагов:
/** * Form builder. */ function modulename_test_form($form, &$form_state) { if (!isset($form_state['step'])) { $form_state['step'] = 1; $form_state['steps_values'] = array(); } $step = $form_state['step']; $max_step = 3; $values = &$form_state['values']; // Step 1 if ($step == 1) { $form['firstname'] = array( '#type' => 'textfield', '#title' => 'First name', '#default_value' => isset($values['firstname']) ? $values['firstname'] : '', ); } // Step 2 elseif ($step == 2) { $form['lastname'] = array( '#type' => 'textfield', '#title' => 'Last name', '#default_value' => isset($values['lastname']) ? $values['lastname'] : '', ); } // Step 3 elseif ($step == 3) { ... } // Buttons $form['actions'] = array( '#type' => 'actions', ); if ($step > 1) { $form['actions']['prev'] = array( '#type' => 'submit', '#value' => 'Prev', '#submit' => array('modulename_test_form_prev'), '#limit_validation_errors' => array(), ); } if ($step < $max_step) { $form['actions']['next'] = array( '#type' => 'submit', '#value' => 'Next', '#submit' => array('modulename_test_form_next'), ); } else { $form['actions']['submit'] = array( '#type' => 'submit', '#value' => 'Finish', ); } return $form; } /** * Next callback. */ function modulename_test_form_next($form, &$form_state) { $step = &$form_state['step']; $form_state['rebuild'] = TRUE; // Save current step values $form_state['steps_values'][$step] = $form_state['values']; // Change step $step++; // Restore next step values $form_state['values'] = isset($form_state['steps_values'][$step]) ? $form_state['steps_values'][$step] : array(); } /** * Prev callback. */ function modulename_test_form_prev($form, &$form_state) { $step = &$form_state['step']; $form_state['rebuild'] = TRUE; // Change step $step--; // Restore prev step values $form_state['values'] = $form_state['steps_values'][$step]; } /** * Finish callback. */ function modulename_test_form_submit($form, &$form_state) { // Merge steps values $form_state['values'] += call_user_func_array('array_merge', $form_state['steps_values']); dsm($form_state['values']); }