You are here

function flexiform_conditional_fields_element_after_build in Flexiform 7

After build on flexiform form elements.

Add conditional fields information.

1 string reference to 'flexiform_conditional_fields_element_after_build'
flexiform_conditional_fields_element_info_alter in flexiform_conditional_fields/flexiform_conditional_fields.module
Implements hook_flexiform_build_alter().

File

flexiform_conditional_fields/flexiform_conditional_fields.module, line 57
Main module code for flexiform conditional fields integrations.

Code

function flexiform_conditional_fields_element_after_build($element, &$form_state) {

  // If we are not in a flexiform, pass onto the normal conditional fields after
  // build. Otherwise we take it over completely.
  if (empty($form_state['flexiform_state'])) {
    return conditional_fields_element_after_build($element, $form_state);
  }

  // Ensure that the element is a field.
  if (isset($element['#field_name'])) {
    $field =& $element;
  }
  elseif (isset($element['#language'], $element[$element['#language']], $element[$element['#language']]['#field_name'])) {

    // Some fields are wrapped in containers before processing.
    $field =& $element[$element['#language']];
  }
  elseif (!empty($element['#support_flexiform_conditional_fields'])) {
    $field =& $element;
  }
  if (empty($field)) {
    return $element;
  }

  // Only act on flexiforms.
  $total_form =& $form_state['complete form'];
  $form = FALSE;

  // Get the nearest parent flexiform. Do not store in flexiform state as it
  // kills the conditional fields in nexted forms.
  $array_parents = $field['#array_parents'];
  while (array_pop($array_parents) !== NULL) {
    $form =& drupal_array_get_nested_value($total_form, $array_parents);
    if (!empty($form['#flexiform_builder'])) {
      break;
    }
  }
  if (empty($form['#flexiform'])) {
    return $element;
  }
  $flexiform = $form['#flexiform'];
  $dependencies = flexiform_conditional_fields_load_depencies($flexiform);
  if (!$dependencies) {
    return $element;
  }

  // Work out the field_array_parents.
  $field_array_parents = $field['#array_parents'];
  $flexiform_element = $field;
  while (count($field_array_parents) && empty($flexiform_element['#flexiform_element'])) {
    array_pop($field_array_parents);
    $flexiform_element = drupal_array_get_nested_value($total_form, $field_array_parents);
  }
  if (empty($flexiform_element['#flexiform_element'])) {
    return $element;
  }
  $element_namespace = $flexiform_element['#flexiform_element']
    ->getElementNamespace();
  $field_name = !empty($field['#field_name']) ? $field['#field_name'] : NULL;
  $field['#field_name'] = $element_namespace;

  // Attach dependent.
  if (isset($dependencies['dependents'][$element_namespace])) {
    foreach ($dependencies['dependents'][$element_namespace] as $id => $dependency) {
      if (!isset($total_form['#conditional_fields'][$element_namespace]['dependees'][$id])) {
        if (!empty($field['#field_parents'])) {
          $field_parents = $field['#field_parents'];
        }
        $field['#field_parents'] = $field_array_parents;
        array_pop($field['#field_parents']);
        conditional_fields_attach_dependency($total_form, array(
          '#field_name' => $dependency['dependee'],
        ), $field, $dependency['options'], $id);
        if (!empty($field_parents)) {
          $field['#field_parents'] = $field_parents;
        }

        // Add validator to check required status on submit.
        // We add this to the actual input item rather than the container.
        if (!empty($field['#type']) && $field['#type'] != 'container' && in_array($dependency['options']['state'], array(
          'required',
          '!required',
        )) && !empty($form[$dependency['dependee']]['#flexiform_element'])) {
          $field['#fcfv_elements'][$dependency['dependee']] = array(
            'element' => $form[$dependency['dependee']],
            'state' => $dependency['options']['state'],
            'options' => $dependency['options'],
          );
        }
      }
    }
  }

  // Attach dependee.
  // TODO: collect information about every element of the dependee widget, not
  // just the first encountered. This bottom-up approach would allow us to
  // define per-element sets of dependency values.
  if (isset($dependencies['dependees'][$element_namespace])) {
    foreach ($dependencies['dependees'][$element_namespace] as $id => $dependency) {
      if (!isset($total_form['#conditional_fields'][$element_namespace]['dependents'][$id])) {
        conditional_fields_attach_dependency($total_form, $field, array(
          '#field_name' => $dependency['dependent'],
        ), $dependency['options'], $id);
      }
    }
  }
  if (!empty($field_name)) {
    $field['#field_name'] = $field_name;
    unset($form['#conditional_fields'][$field_name]);
  }

  // We must make sure flexiform's after build goes last.
  foreach ($form['#after_build'] as $key => $after) {
    if ($after == 'flexiform_conditional_fields_form_after_build') {
      unset($form['#after_build'][$key]);
    }
  }
  _conditional_fields_element_add_property($total_form, '#after_build', 'flexiform_conditional_fields_form_after_build', 'append');
  return $element;
}