You are here

function subform_element_value in Subform 7

Value callback for the subform element.

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

File

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

Code

function subform_element_value(&$element, $input, &$form_state) {
  $element['#name'] = $subform_name = (isset($form_state['subform_name']) ? $form_state['subform_name'] : 'subform') . '-' . implode('-', $element['#parents']);
  if (!isset($form_state['temporary']['subform'][$subform_name])) {
    $form_state['temporary']['subform'][$subform_name] = array();
  }
  $subform_state =& $form_state['temporary']['subform'][$subform_name];

  // Ensure some defaults; if already set they will not be overridden.
  $subform_state += form_state_defaults();
  $subform_state['subform_name'] = $subform_name;
  $subform_state['subform_element_parents'] = $element['#array_parents'];
  $subform_state['subform_parent'] = array(
    'form_id' => $form_state['complete form']['#form_id'],
    'build_id' => $form_state['complete form']['#build_id'],
  );
  $subform_state['temporary']['subform_parent_state'] =& $form_state;

  // Pass in subform arguments.
  if (!empty($element['#subform_arguments'])) {
    $subform_state['build_info']['args'] = $element['#subform_arguments'];
  }

  // Load subform files.
  if (!empty($element['#subform_file'])) {
    $file = $element['#subform_file'];
    if (is_array($file)) {
      $file += array(
        'type' => 'inc',
        'name' => $file['module'],
      );
      module_load_include($file['type'], $file['module'], $file['name']);
    }
    elseif (file_exists($file)) {
      require_once DRUPAL_ROOT . '/' . $file;
    }
    $subform_state['build_info']['files'][] = $element['#subform_file'];
  }

  // The subform inherits certain properties from the subform element.
  foreach (array(
    '#access',
    '#disabled',
    '#allow_focus',
    '#subform_default_triggering_element',
  ) as $property) {
    if (isset($element[$property]) && !isset($subform[$property])) {
      $subform_state['subform_properties'][$property] = $element[$property];
    }
  }
  if (isset($form_state['input'][$subform_name]) && is_array($form_state['input'][$subform_name])) {
    $input = $form_state['input'][$subform_name];
  }
  elseif (isset($element['#default_value']) && is_array($element['#default_value'])) {
    $input = $element['#default_value'];

    // Prevent default value from triggering form validation/submission.
    unset($input['form_id']);
  }

  // Include nested subform input.
  if (!empty($form_state['input'])) {
    foreach ($form_state['input'] as $name => $value) {
      if (strpos($name, $subform_name . '-') === 0) {
        $input[$name] = $value;
      }
    }
  }
  return $input;
}