View source
<?php
function multiform_init() {
if (isset($_POST['multiform']) && isset($_POST['_triggering_element_name']) && isset($_POST['ajax_page_state'])) {
$subform_index = multiform_subform_ajax_index($_POST);
$_POST += $_POST['multiform'][$subform_index];
unset($_POST['multiform']);
}
}
function multiform_subform_ajax_index($post) {
$triggering_element_name = $post['_triggering_element_name'];
$parents = explode('[', str_replace(']', '', $triggering_element_name));
foreach ($post['multiform'] as $index => $subform) {
$key_exists = FALSE;
drupal_array_get_nested_value($subform, $parents, $key_exists);
if ($key_exists) {
break;
}
}
return $index;
}
function multiform_get_form($settings) {
module_load_include('inc', 'multiform');
module_load_include('inc', 'multiform', 'multiform.form');
$build_id_hash = multiform_init_settings($settings);
multiform_sharedfields_process($settings);
multiform_preprocess_post($_POST, $settings);
$subforms = $settings['#subforms'];
$build_id_hash = NULL;
$form = multiform_init_form($build_id_hash);
$post = !empty($_POST) ? $_POST : array();
$rebuild = FALSE;
$multiform = array();
foreach ($subforms as $index => $subform) {
$subform_id = $subform['form_id'];
$subform_args = $subform['args'];
if (isset($post['multiform'][$subform_id])) {
$_POST = $post['multiform'][$subform_id];
}
$subform_state = multiform_init_subform_state($subform_id, $subform_args, $settings, $subform);
$unprocessed_subform = array();
$subform_form = multiform_drupal_build_subform($subform_id, $subform_state, $unprocessed_subform);
multiform_delayed_submit_prepare($multiform, $subform_form, $subform_state, $subform_id, $unprocessed_subform);
$multiform['#subforms'][$subform_id]['#subform_settings'] = $subform;
if ($subform_state['rebuild']) {
$rebuild = TRUE;
}
}
$errors = form_get_errors();
if ($rebuild) {
foreach ($multiform['#subforms'] as $subform_id => $subform_prepare) {
$multiform['#subforms'][$subform_id]['form_state']['rebuild'] = TRUE;
}
}
if (empty($errors) && !empty($post['multiform']) && module_exists('multiform_log')) {
$context = array(
'rebuild' => $rebuild,
);
$entry_data = array(
'multiform_id' => !empty($settings['#multiform_id']) ? $settings['#multiform_id'] : DEFAULT_MULTIFORM_ID,
'timestamp' => time(),
'post_array' => $post,
'context_data' => $context,
);
multiform_log_create_entry($entry_data);
}
foreach ($subforms as $index => $subform) {
$subform_id = $subform['form_id'];
$subform_form = $subform_state = array();
multiform_delayed_submit_execute($multiform, $subform_form, $subform_state, $subform_id);
$subform_form['#theme_wrappers'] = array(
'container',
);
$disallowed_attributes = array(
'enctype',
'action',
'method',
);
$subform_form['#attributes'] = array_diff_key($subform_form['#attributes'], array_flip($disallowed_attributes));
$form['multiform'][] = $subform_form;
if (isset($subform_state['has_file_element'])) {
$form['#attributes']['enctype'] = 'multipart/form-data';
}
}
if (!empty($settings['#multiform_id'])) {
$form['#theme'] = array(
$settings['#multiform_id'],
);
}
multiform_cache_prepare($build_id_hash, $settings, $form);
$errors = form_get_errors();
if (empty($errors) && !empty($post['multiform']) && isset($settings['#redirect_path']) && !$rebuild) {
drupal_goto($settings['#redirect_path']);
}
if (isset($settings['#title'])) {
drupal_set_title($settings['#title']);
}
return $form;
}
function multiform_form_alter(&$form, &$form_state, $form_id) {
if (!empty($form_state['#multiform'])) {
$form['#after_build'][] = 'multiform_form_after_build';
}
}
function multiform_form_after_build(&$form, &$form_state) {
multiform_sharedfields_process(NULL, $form, $form_state);
$form_id = $form_state['#subform_index'];
_multiform_get_form($form, $form_id);
multiform_multiform_ids($form_id);
return $form;
}
function _multiform_get_form(&$element, $form_id) {
foreach (element_children($element) as $key) {
_multiform_get_form($element[$key], $form_id);
}
if (isset($element['#name'])) {
$element['#name'] = "multiform[{$form_id}]" . preg_replace('/^[^[]+/', '[\\0]', $element['#name']);
}
}
function multiform_multiform_ids($form_id = NULL) {
$multiform_ids =& drupal_static(__FUNCTION__);
if (!empty($form_id)) {
$multiform_ids[] = $form_id;
}
return $multiform_ids;
}
function multiform_sharedfields_process($settings, &$form = NULL, &$form_state = NULL) {
module_load_include('inc', 'multiform', 'multiform.sharedfields');
if ($settings) {
$sharedfields_info = multiform_sharedfields_info($settings);
if (!empty($_POST)) {
multiform_sharedfields_set_post_values($settings, $sharedfields_info);
}
}
elseif (!$settings && !empty($form) && isset($form_state['#multiform_settings'])) {
$settings = $form_state['#multiform_settings'];
$sharedfields_info = multiform_sharedfields_info($settings);
multiform_sharedfields_hide_elements($settings, $sharedfields_info, $form, $form_state);
}
}