multipage_form_example_pre_render
developer/examples/multipage_form_example.module, строка 231
- Версии
- 5 – 6
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.
Код
<?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']];
}
}
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии