'hidden', '#value' => 'multiform', '#id' => drupal_html_id("edit-multiform"), '#name' => 'form_id', '#attributes' => array(), ); $build_id = 'form-' . md5(uniqid(mt_rand(), TRUE)); // We need a $form_build_id because the buttons are cached and the values // belonging to them in $_POST are handed to each form so those can recognize // the buttons pressed. $form['form_build_id'] = array( '#type' => 'hidden', '#value' => $build_id, '#id' => $build_id, '#name' => 'form_build_id', '#attributes' => array(), ); // This is where buttons will be collected. $form['buttons'] = array(); $form['buttons']['#weight'] = 1000; $form_state_save = array(); $button_names = array(); // The only way to support $_GET would be to accept $form_state. Maybe later. if ($_POST && $_POST['form_id'] == 'multiform' && !empty($_POST['form_build_id'])) { $form_state_save['input'] = $_POST; $_files_save = $_FILES; // Retrieve buttons. if ($button_elements = form_get_cache($_POST['form_build_id'], $form_state_save)) { foreach ($button_elements as $button) { // For each button, save it's name. Later on we will need the button // names because the buttons are used in the multiform but their values // in $_POST (if it exists) needs to be handed down to each form so // those can recognize the button press. $name = isset($button_elements['#name']) ? $button_elements['#name'] : 'op'; $button_names[$name] = $name; } } } foreach ($all_args as $key => $args) { $form_id = array_shift($args); // Reset $form_state and disable redirection. $form_state = array('no_redirect' => TRUE); // This line is copied literally from drupal_get_form(). $form_state['build_info']['args'] = $args; $index = $form_id . '_' . $key; if (isset($form_state_save['input']['multiform'][$index])) { // drupal_build_form() honors our $form_state['input'] setup. $form_state['input'] = $form_state_save['input']['multiform'][$index]; // Pass in the information about pressed buttons too. foreach ($button_names as $name) { if (isset($form_state_save['input'][$name])) { $form_state['input'][$name] = $form_state_save['input'][$name]; } } } if (isset($_files_save['multiform']['name'][$index])) { $_FILES = array(); foreach (array('name', 'type', 'tmp_name', 'error', 'size') as $files_key) { // PHP is seriously messed up, dude. foreach ($_files_save['multiform'][$files_key][$index] as $running_out_of_indexes => $data) { $_FILES[$running_out_of_indexes][$files_key] = $data; } } } // Build and process this form. $current_form = drupal_build_form($form_id, $form_state); // Do not render the