multipage_form_example_pre_render

Versions
4.7 – 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.

▾ 1 function calls multipage_form_example_pre_render()

multipage_form_example_form_alter in developer/examples/multipage_form_example.module
Implementation of hook_form_alter(). Here, we set up the 'page' field, which keeps track of what stage the form is in.

Code

developer/examples/multipage_form_example.module, line 231

<?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']];
    }
  }
}
?>
Login or register to post comments
 
 

All source code and documentation on this site is released under the terms of the GNU General Public License, version 2 and later. Drupal is a registered trademark of Dries Buytaert.