You are here

function subform_parent_after_build in Subform 7

After-build callback for form elements containing subform elements.

Registers this callback.

See also

subform_element_process()

1 string reference to 'subform_parent_after_build'
subform_element_process in ./subform.module
Processes a subform element.

File

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

Code

function subform_parent_after_build(&$element, &$form_state) {

  // Subform elements may contain the first button in the whole form. If the
  // parent form contains no actual triggering element, set this subform to
  // be the triggering element.
  if (!empty($form_state['temporary']['subform']) && !isset($form_state['triggering_element'])) {
    foreach ($form_state['temporary']['subform'] as $subform_name => &$subform_state) {
      $subform_element =& subform_array_get_nested_value($element, $subform_state['subform_element_parents'], $subform_exists);
      if ($subform_exists && !empty($subform_element['#subform_has_first_button'])) {
        $form_state['triggering_element'] = $subform_element;
        break;
      }
    }
  }
  foreach ($form_state['temporary']['subform'] as $subform_name => &$subform_state) {

    // The triggering element of the parent form may set specific triggering
    // elements for its subforms using #subform_triggering_element which accepts
    // the following format:
    //
    // @code
    // array(
    //   $form_id => array($parents, $of, $subforms, $triggering_element),
    // );
    // @endcode
    if (isset($form_state['triggering_element']['#subform_triggering_element'][$subform_state['complete form']['#form_id']])) {
      $triggering_element =& subform_array_get_nested_value($subform_state['complete form'], $form_state['triggering_element']['#subform_triggering_element'][$subform_state['complete form']['#form_id']], $triggering_element_exists);
      if ($triggering_element_exists) {
        subform_set_triggering_element($triggering_element, $subform_state);
      }
    }

    // If the input is not going to be processed cache the subform here. Caching
    // the subforms here allows for making changes to subform states in any
    // process or after-build callback.
    if ((!$form_state['process_input'] || !$subform_state['process_input']) && empty($subform_state['programmed']) && $subform_state['cache'] && empty($subform_state['no_cache'])) {
      form_set_cache($subform_state['complete form']['#build_id'], $subform_state['temporary']['subform_unprocessed'], $subform_state);
    }
  }

  // While this is also done later in form_builder() we need the triggering
  // element here to set the after-validate/submit handlers correctly.
  if (!$form_state['programmed'] && !isset($form_state['triggering_element']) && !empty($form_state['buttons'])) {
    $form_state['triggering_element'] = $form_state['buttons'][0];
  }

  // Add after-validate/submit handlers to this parent form.
  foreach (array(
    'validate',
    'submit',
  ) as $type) {
    if (isset($form_state['triggering_element']['#' . $type])) {
      $form_state['triggering_element']['#' . $type]['subform_parent_after_' . $type] = 'subform_parent_after_' . $type;
    }
    else {
      if (!isset($element['#' . $type])) {
        $element['#' . $type] = array();
      }
      $element['#' . $type]['subform_parent_after_' . $type] = 'subform_parent_after_' . $type;
    }
  }
  return $element;
}