| Versions | |
|---|---|
| 4.7 – 5 | multipage_form_example_pre_render($form_id, &$form, $next_page = TRUE) |
The #pre_render of a form allows us to make changes AFTER validation (unlike hook_form_alter()), but BEFORE the form has actually been displayed. We use it to control which form elements are shown, which are hidden, and which values to set based on validate elements, not $_POST. This is a necessity for our complicated multipage example form.
developer/
<?php
function multipage_form_example_pre_render($form_id, &$form, $next_page = TRUE) {
global $form_values;
// Make sure it's our multipage form.
if ($form_id == 'multipage_form_example_node_form') {
// Are we ready for the next page in our form?
if ($next_page && isset($_POST['edit']['page']) && ($_POST['op'] != t('Back')) && ($_POST['op'] != t('Preview'))) {
$form['page']['#value'] = $form['page']['#value'] + 1;
}
// Validation errors? Show previous page for correcting.
if (form_get_errors()) {
$form['page']['#value']--;
}
// Modify the #required/#type values depending on our current page.
// The arrays tell us the pages the changes should take place in.
// Title/body, stage 1
multipage_form_set_element_visibility($form['title'], in_array($form['page']['#value'], array(1)));
multipage_form_set_element_visibility($form['body'], in_array($form['page']['#value'], array(1)));
// Person, stage 2
multipage_form_set_element_visibility($form['person'], in_array($form['page']['#value'], array(2)));
multipage_form_set_element_visibility($form['person']['fav_person'], in_array($form['page']['#value'], array(2)));
multipage_form_set_element_visibility($form['person']['fav_person_desc'], in_array($form['page']['#value'], array(2)));
multipage_form_set_element_visibility($form['person']['fav_gummi'], in_array($form['page']['#value'], array(2)), $next_page);
// Color and number, page 3
multipage_form_set_element_visibility($form['fav_color'], in_array($form['page']['#value'], array(3)));
multipage_form_set_element_visibility($form['fav_number'], in_array($form['page']['#value'], array(3)));
// Movie and tv show, page 4
multipage_form_set_element_visibility($form['fav_movie'], in_array($form['page']['#value'], array(4)));
multipage_form_set_element_visibility($form['fav_tv'], in_array($form['page']['#value'], array(4)), $next_page);
// Buttons
multipage_form_set_element_visibility($form['back'], in_array($form['page']['#value'], array(2, 3, 4)), $next_page);
multipage_form_set_element_visibility($form['preview'], in_array($form['page']['#value'], array(4)), $next_page);
multipage_form_set_element_visibility($form['submit'], in_array($form['page']['#value'], array(4)), $next_page);
// The button text actually helps determine if a form has actually been
// submitted because the name is also the value of a clicked button. By
// changing it for building, but not rendering, the form is not fully
// sumbitted until we name it 'Submit', the usual value.
if ($next_page) {
$submit_text = array(NULL, t('Next (person)'), t('Next (color/number)'), t('Next (tv/movie)'), t('Submit'));
$form['submit']['#value'] = $submit_text[$form['page']['#value']];
}
}
}
?>