View source
<?php
define('DEFAULT_MULTIFORM_ID', 'multiform');
function multiform_init_settings(&$settings) {
$settings += array(
'#multiform_id' => DEFAULT_MULTIFORM_ID,
);
$submits_form = array(
'form_id' => 'multiform_submits_form',
'args' => array(
$settings,
),
);
array_push($settings['#subforms'], $submits_form);
foreach ($settings['#subforms'] as $k => $subform) {
$settings['#subforms'][$k] += array(
'args' => array(),
'#before_execute' => array(),
'#after_execute' => array(),
'#preprocess_form_state' => array(),
);
}
}
function multiform_init_form(&$build_id_hash) {
$form = element_info('form');
$form['#id'] = 'multiform';
$build_id_hash = md5(uniqid(mt_rand(), TRUE));
$multiform_build_id = 'multiform_settings-' . $build_id_hash;
$form['multiform_settings_build_id'] = array(
'#type' => 'hidden',
'#value' => $multiform_build_id,
'#id' => $multiform_build_id,
'#name' => 'multiform_settings_build_id',
'#attributes' => array(),
);
return $form;
}
function multiform_init_subform_state($subform_id, $subform_args, $settings, $subform) {
$subform_state = array(
'no_redirect' => TRUE,
);
$subform_state['build_info']['args'] = $subform_args;
$subform_state['#multiform'] = TRUE;
$subform_state['#subform_index'] = $subform_id;
foreach ($subform['#preprocess_form_state'] as $function) {
$function($form_state);
}
$subform_state['#multiform_settings'] = $settings;
return $subform_state;
}
function multiform_delayed_submit_prepare(&$multiform, $subform_form, $subform_state, $subform_id, $unprocessed_subform) {
$multiform['#subforms'][$subform_id] = array(
'form' => $subform_form,
'form_state' => $subform_state,
'unprocessed_form' => $unprocessed_subform,
);
}
function multiform_delayed_submit_execute(&$multiform, &$subform_form, &$subform_state, $subform_id) {
$subform_form = $multiform['#subforms'][$subform_id]['form'];
$subform_state = $multiform['#subforms'][$subform_id]['form_state'];
$unprocessed_subform = $multiform['#subforms'][$subform_id]['unprocessed_form'];
multiform_drupal_process_form_finish($subform_id, $subform_form, $subform_state, $unprocessed_subform);
$multiform['#subforms'][$subform_id]['form'] = $subform_form;
$multiform['#subforms'][$subform_id]['form_state'] = $subform_state;
$subform_settings = $multiform['#subforms'][$subform_id]['#subform_settings'];
if ($subform_state['executed'] == TRUE) {
foreach ($subform_settings['#after_execute'] as $function) {
$function($multiform, $subform_id);
}
}
}
function multiform_submits_form($form, $form_state, $settings) {
$form = array();
if (!empty($settings['#submit_map']['#submits'])) {
foreach ($settings['#submit_map']['#submits'] as $k => $info) {
$form[$k] = $info;
}
}
return $form;
}
function multiform_cache_prepare($build_id_hash, $settings, &$multiform_form) {
$cache = array();
$cache['settings'] = array(
$settings,
);
$form_keys = array();
foreach ($multiform_form['multiform'] as $k => $subform) {
$form_id = $subform['#form_id'];
if ($form_id != 'multiform_submits_form') {
$form_keys[$form_id] = $k;
}
}
foreach ($settings['#subforms'] as $k => $subform) {
if (!empty($subform['#map']) && isset($form_keys[$subform['form_id']])) {
$form_key = $form_keys[$subform['form_id']];
foreach ($subform['#map'] as $m => $map) {
$key_exists = FALSE;
$form_key = $form_keys[$subform['form_id']];
$element = drupal_array_get_nested_value($multiform_form['multiform'][$form_key], $map['#parents'], $key_exists);
if ($key_exists) {
$element['#name'] = 'op';
$settings['#subforms'][$k]['#map'][$m]['#element'] = $element;
drupal_array_set_nested_value($multiform_form['multiform'][$form_key], array_merge($map['#parents'], array(
'#printed',
)), TRUE, TRUE);
}
}
}
}
cache_set('multiform_settings-' . $build_id_hash, $settings, 'cache', CACHE_TEMPORARY);
}
function multiform_preprocess_post(&$post, $settings) {
if (isset($post['multiform']['multiform_submits_form'])) {
if (!empty($post['multiform']['multiform_submits_form']['op'])) {
if (empty($post['multiform_settings_build_id'])) {
return;
}
$multiform_settings_build_id = $post['multiform_settings_build_id'];
$cache = cache_get($multiform_settings_build_id, 'cache');
if (empty($cache)) {
return;
}
$cached_settings = $cache->data;
$name = $post['multiform']['multiform_submits_form']['op'];
foreach ($settings['#submit_map']['#submits'] as $k => $data) {
if ($name == $data['#value']) {
$key = $k;
break;
}
}
if (!empty($key)) {
foreach ($settings['#subforms'] as $k => $data) {
if (!empty($data['#map'])) {
$form_id = $data['form_id'];
foreach ($data['#map'] as $m => $map) {
if (in_array($key, $map['#triggering_submit'])) {
$parents = $map['#parents'];
if (!empty($cached_settings['#subforms'][$k]['#map'][$m]['#element'])) {
$element = $cached_settings['#subforms'][$k]['#map'][$m]['#element'];
$post['multiform'][$form_id][$element['#name']] = $element['#value'];
}
}
}
}
}
}
}
unset($post['multiform']['multiform_submits_form']);
}
}