<?php
function multipage_form_example_help($section) {
switch ($section) {
case 'admin/modules#description':
return t('An example module showing how to handle multipage forms in FAPI.');
case 'node/add#multipage_form_example':
return t('This will show you an example multipage form submission.');
}
}
function multipage_form_example_menu($may_cache) {
$items = array();
if (!$may_cache) {
$items[] = array('title' => t('multipage form example'),
'path' => 'node/add/multipage_form_example',
'access' => TRUE,
);
}
return $items;
}
function multipage_form_example_access($op, $node) {
return TRUE;
}
function multipage_form_example_node_info() {
return array('multipage_form_example' => array('name' => t('multipage form example'), 'base' => 'multipage_form_example'));
}
function multipage_form_example_form(&$node) {
$form = array();
$form['test_hidden_array'] = array(
'#type' => 'hidden_array',
'#values' => array('n' => 'north', 'e' => 'east', 'w' => 'west', 's' => 'south', ),
);
$form['#pre_render'] = array('multipage_form_example_pre_render');
$form['title'] = array(
'#type' => 'textfield',
'#title' => t('Title'),
'#default_value' => isset($node->title) ? $node->title : NULL,
'#description' => t("Enter a title for your favorites section."),
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
);
$form['body'] = array(
'#type' => 'textarea',
'#title' => t('Description'),
'#default_value' => isset($node->body) ? $node->body : NULL,
'#description' => t('Add any additional info about your favorites.'),
'#rows' => 20,
);
$form['person'] = array(
'#type' => 'fieldset',
'#title' => t('Your favorite person'),
);
$form['person']['fav_person'] = array(
'#type' => 'textfield',
'#title' => t('Name'),
'#default_value' => isset($node->fav_person) ? $node->fav_person : NULL,
'#description' => t('Enter their real name, or their code name if they like to fly stealth.'),
'#required' => TRUE,
);
$form['person']['fav_person_desc'] = array(
'#type' => 'textarea',
'#title' => t('Description'),
'#default_value' => isset($node->fav_person_desc) ? $node->fav_person_desc : NULL,
'#description' => t('Juicy details go here...'),
'#required' => TRUE,
);
$form['person']['fav_gummi'] = array(
'#type' => 'checkbox',
'#default_value' => isset($node->fav_gummi) ? $node->fav_gummi : 0,
'#title' => t('Do they like gummi bears?'),
);
$form['fav_color'] = array(
'#type' => 'select',
'#title' => t('Favorite color'),
'#default_value' => isset($node->fav_color) ? $node->fav_color : 'red',
'#options' => array('red' => t('Red'), 'green' => t('Green'), 'blue' => t('Blue'), 'yellow' => t('Yellow')),
'#required' => TRUE,
);
$form['fav_number'] = array(
'#type' => 'textfield',
'#title' => t('Favorite number'),
'#default_value' => isset($node->fav_number) ? $node->fav_number : NULL,
'#required' => TRUE,
);
$form['fav_movie'] = array(
'#type' => 'textfield',
'#title' => t('Favorite movie'),
'#default_value' => isset($node->fav_movie) ? $node->fav_movie : NULL,
'#required' => TRUE,
);
$form['fav_tv'] = array(
'#type' => 'radios',
'#title' => t('How often do you watch your favorite tv show?'),
'#default_value' => isset($node->fav_tv) ? $node->fav_tv : 'daily',
'#options' => array('daily' => t('Daily'), 'weekly' => t('Weekly'), 'monthly' => t('Monthly'),),
'#required' => TRUE,
);
$form['back'] = array(
'#type' => 'button',
'#value' => t('Back'),
'#weight' => 35,
);
return $form;
}
function theme_multipage_form_example_node_form($form) {
$content = '';
if (in_array($form['page']['#value'], array(3,4))) {
$content .= '<p>'. t('Your favorite person is %person, and they %like gummi bears.', array('%person' => check_plain($form['person']['fav_person']['#value']), '%like' => ($form['person']['fav_gummi']['#value'] ? t('like') : t('don\'t like')))) .'</p>';
}
if (in_array($form['page']['#value'], array(4))) {
$content .= '<p>'. t('Your favorite color is %color, and your favorite number is %number.', array('%color' => check_plain($form['fav_color']['#value']), '%number' => check_plain($form['fav_number']['#value'])));
}
foreach (element_children($form) as $key) {
$content .= form_render($form[$key]);
}
return $content;
}
function multipage_form_example_form_alter($form_id, &$form) {
if ($form_id == 'multipage_form_example_node_form') {
$form['page'] = array(
'#type' => 'hidden',
'#value' => isset($_POST['edit']['page']) ? $_POST['edit']['page'] : 1,
);
if ($_POST['op'] == t('Back')) {
$form['page']['#value']--;
}
multipage_form_example_pre_render($form_id, $form, FALSE);
$form['#validate'] = array_merge($form['#validate'], array('multipage_form_example_custom_validate' => array()));
$form['#submit'] = array_merge($form['#submit'], array('multipage_form_example_custom_submit' => array()));
}
return $form;
}
function multipage_form_example_custom_validate() {
global $form_values;
if (($form_values['page'] == 3 ) && !is_numeric($form_values['fav_number']) && ($_POST['op'] != t('Back'))) {
form_set_error('fav_number', t('Favorite number is a <em>number</em>, dummy!'));
}
}
function multipage_form_example_pre_render($form_id, &$form, $next_page = TRUE) {
global $form_values;
if ($form_id == 'multipage_form_example_node_form') {
if ($next_page && isset($_POST['edit']['page']) && ($_POST['op'] != t('Back')) && ($_POST['op'] != t('Preview'))) {
$form['page']['#value'] = $form['page']['#value'] + 1;
}
if (form_get_errors()) {
$form['page']['#value']--;
}
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)));
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);
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)));
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);
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);
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']];
}
}
}
function multipage_form_example_custom_submit() {
global $form_values;
foreach ($form_values as $key => $value) {
if (in_array($key, array('fav_person', 'fav_person_desc', 'fav_gummi', 'fav_color', 'fav_number', 'fav_movie', 'fav_tv',))) {
$array[$key] = $value;
}
}
if (isset($form_values['nid'])) {
$nid = $form_values['nid'];
}
else {
$nid = db_result(db_query("SELECT id FROM {sequences} WHERE name = 'node_nid'"));
}
variable_set('multipage_form_example_'. $nid, $array);
}
function multipage_form_example_load($node) {
$additions = variable_get('multipage_form_example_'. $node->nid, NULL);
$additions = (object) $additions;
return $additions;
}
function multipage_form_example_delete($node) {
variable_del('multipage_form_example_'. $node->nid);
}
function multipage_form_example_view(&$node, $teaser = FALSE, $page = FALSE) {
$node = node_prepare($node, $teaser);
$favorites = theme('multipage_form_example', $node);
$node->body .= $favorites;
$node->teaser .= $favorites;
}
function theme_multipage_form_example($node) {
$person_display = t('Your favorite person is %person, and they %like gummi bears. <br \>', array('%person' => check_plain($node->fav_person), '%like' => ($node->fav_gummi ? t('like') : t('don\'t like'))));
$color_number_display = t('Your favorite color is %color, and your favorite number is %number. <br \>', array('%color' => check_plain($node->fav_color), '%number' => check_plain($node->fav_number)));
$tv_movie_display = t('Your favorite movie is %movie, and you watch your favorite tv show %watch.', array('%movie' => check_plain($node->fav_movie), '%watch' => check_plain($node->fav_tv)));
$output = '<div class="multipage_form_example">';
$output .= $person_display . $color_number_display . $tv_movie_display;
$output .= '</div>';
return $output;
}
function multipage_form_set_element_visibility(&$element, $visible, $next_page = TRUE) {
multipage_form_restore_attributes($element);
if (!$visible) {
switch ($element['#type']) {
case 'textfield':
case 'textarea':
case 'select':
multipage_form_set_attribute($element, '#type', 'hidden');
multipage_form_set_attribute($element, '#required', FALSE);
break;
case 'radios':
if ($next_page) {
multipage_form_set_attribute($element, '#type', 'hidden');
multipage_form_set_attribute($element, '#required', FALSE);
}
break;
case 'radio':
case 'checkbox':
if ($next_page) {
multipage_form_set_attribute($element, '#type', 'hidden');
}
break;
case 'fieldset':
multipage_form_set_attribute($element, '#type', NULL);
break;
case 'button':
if ($next_page) {
multipage_form_set_attribute($element, '#type', 'value');
}
break;
case 'submit':
if ($next_page) {
multipage_form_set_attribute($element, '#type', 'button');
}
break;
}
}
foreach (element_children($element) as $key) {
multipage_form_set_element_visibility($element[$key], $visible, $next_page);
}
}
function multipage_form_set_attribute(&$element, $key, $new_value) {
$element['#multipage_form_original_'. $key] = $element[$key];
$element[$key] = $new_value;
}
function multipage_form_restore_attributes(&$element) {
foreach (array_filter(array_keys($element), create_function('$key', 'return (strpos($key, "#multipage_form_original_") === 0);')) as $key) {
$element[str_replace('#multipage_form_original_', '', $key)] = $element[$key];
}
}
function multipage_form_example_elements() {
$type['hidden_array'] = array('#input' => TRUE, '#process' => array('expand_hidden_array' => array()), '#tree' => TRUE);
return $type;
}
function expand_hidden_array($element) {
$values = is_array($element['#values']) ? $element['#values'] : array();
$element['#tree'] = TRUE;
foreach ($values as $key => $value) {
$element[$key] = array('#type' => 'hidden', '#processed' => TRUE, '#value' => $value);
}
return $element;
}
function theme_hidden_array($element) {
return $element['#children'];
}