You are here

function subform_element_process in Subform 7

Processes a subform element.

Contains code that is duplicated here.

See also

drupal_build_form()

drupal_process_form()

1 string reference to 'subform_element_process'
subform_element_info in ./subform.module
Implements hook_element_info().

File

./subform.module, line 200
Defines a subform element type.

Code

function subform_element_process($element, &$form_state) {
  $form_id = $element['#subform_id'];
  $subform_name = $element['#name'];
  $subform_state =& subform_get_state($subform_name, $form_state);
  $subform_state['input'] = isset($element['#value']) && is_array($element['#value']) ? $element['#value'] : array();
  $element['#subform_errors'] = array();
  $element['#subform_error_messages'] = array();
  if ($subform_state['rebuild']) {
    $subform = subform_element_rebuild($element, $form_state);
  }
  else {
    subform_buffer('start', $element);

    // Copied from drupal_build_form()
    // Check the cache for a copy of the subform in question.
    $check_cache = isset($subform_state['input']['form_id']) && $subform_state['input']['form_id'] == $form_id && !empty($subform_state['input']['form_build_id']);
    if ($check_cache) {
      $subform = form_get_cache($subform_state['input']['form_build_id'], $subform_state);
    }

    // Build subform from scratch.
    if (!isset($subform)) {
      if ($check_cache) {
        $subform_state_before_retrieval = $subform_state;
      }
      $subform = drupal_retrieve_form($form_id, $subform_state);
      drupal_prepare_form($form_id, $subform, $subform_state);
      if ($check_cache) {
        $uncacheable_keys = array_flip(array_diff(form_state_keys_no_cache(), array(
          'always_process',
          'temporary',
        )));
        $subform_state = array_diff_key($subform_state, $uncacheable_keys);
        $subform_state += $subform_state_before_retrieval;
      }
    }

    // Copied from drupal_process_form()
    $subform_state['values'] = array();

    // With $_GET, these forms are always submitted if requested.
    if ($subform_state['method'] == 'get' && !empty($subform_state['always_process'])) {
      if (!isset($subform_state['input']['form_build_id'])) {
        $subform_state['input']['form_build_id'] = $subform['#build_id'];
      }
      if (!isset($subform_state['input']['form_id'])) {
        $subform_state['input']['form_id'] = $form_id;
      }
      if (!isset($subform_state['input']['form_token']) && isset($subform['#token'])) {
        $subform_state['input']['form_token'] = drupal_get_token($subform['#token']);
      }
    }

    // Retain the unprocessed $subform in case it needs to be cached.
    $subform_state['temporary']['subform_unprocessed'] = $subform;
    $subform = form_builder($form_id, $subform, $subform_state);

    // Display any errors thrown during form building.
    subform_buffer('end', $element, TRUE);
  }

  // If the subform contains a file element, update the parent form accordingly.
  if (isset($subform_state['has_file_element'])) {
    $form_state['has_file_element'] = TRUE;
  }

  // Subform elements are allowed to set #limit_validation_errors to TRUE, to
  // limit validation errors to errors within the subform only.
  if (isset($element['#limit_validation_errors']) && $element['#limit_validation_errors'] === TRUE) {
    $element['#limit_validation_errors'] = array(
      $element['#parents'],
    );
  }

  // If the subform contains a triggering element, set the subform element to be
  // the triggering element of the parent form.
  if (isset($subform_state['triggering_element']) && empty($subform_state['temporary']['subform_no_triggering_element'])) {
    $element['#executes_submit_callback'] = $subform_state['triggering_element']['#executes_submit_callback'];
    $form_state['triggering_element'] = $element;
  }
  $form_state['complete form']['#after_build']['subform_parent_after_build'] = 'subform_parent_after_build';
  $element['#subform'] = $subform;
  return $element;
}