You are here

function _crm_core_data_import_attach_fields_form in CRM Core 7

Entity fields and bundles.

1 call to _crm_core_data_import_attach_fields_form()
crm_core_data_import_field_mapping in modules/crm_core_data_import/crm_core_data_import.admin.inc
Page callback for field mapping page.

File

modules/crm_core_data_import/crm_core_data_import.admin.inc, line 658
Configuration pages for CRM Core Data Import.

Code

function _crm_core_data_import_attach_fields_form(&$form, &$form_state, $source_fields) {
  $importer = $form_state['importer'];

  // Button which was triggered.
  $triggering_element = !empty($form_state['triggering_element']) ? $form_state['triggering_element'] : FALSE;

  // If button is remove bundle.
  if (!empty($triggering_element['#parents'][2]) && $triggering_element['#parents'][2] == 'remove_bundle') {
    $key = $triggering_element['#parents'][1];
    if (!empty($form_state['values']['mapping'][$key])) {
      unset($form_state['values']['mapping'][$key]);
    }
  }

  // If buttons are move up or move down.
  if (!empty($triggering_element['#parents'][2]) && ($triggering_element['#parents'][2] == 'move_down' || $triggering_element['#parents'][2] == 'move_up')) {
    $key = $triggering_element['#parents'][1];
    $search = FALSE;
    $swap_mapping = $form_state['values']['mapping'];

    // If move up, reverse array.
    if ($triggering_element['#parents'][2] == 'move_down') {
      $mapping = $form_state['values']['mapping'];
    }
    else {
      $mapping = array_reverse($form_state['values']['mapping']);
    }
    foreach ($mapping as $mapping_key => $mapping_item) {
      if ($mapping_key == $key) {
        $search = TRUE;
      }
      elseif ($search == TRUE && is_array($mapping_item)) {
        $search = FALSE;
        $swap_mapping = _crm_core_data_import_array_swap($swap_mapping, $key, $mapping_key);
      }
    }
    $form_state['values']['mapping'] = $swap_mapping;
  }

  // If button is remove field.
  if (!empty($triggering_element['#parents'][4]) && $triggering_element['#parents'][4] == 'remove_field') {
    $entity_bundle_key = $triggering_element['#parents'][1];
    $field_key = $triggering_element['#parents'][3];
    unset($form_state['values']['mapping'][$entity_bundle_key]['fields'][$field_key]);
  }

  // Build form from form_state.
  if (!empty($form_state['values']['mapping'])) {

    // Attach elements entity fields.
    foreach ($form_state['values']['mapping'] as $key => $mapping) {
      if (is_array($mapping)) {
        list($entity_type, $entity_bundle, $bundle_delta) = explode(':', $key);
        $destination = crm_core_data_import_load_plugin_instance('crm_core_data_import_destination', $entity_type);
        $fields = $destination
          ->getFields($entity_bundle);
        $html_id = drupal_html_id($key);

        // Add field with count of entities.
        $entity_key = $entity_type . ':' . $entity_bundle;
        $form['mapping'][$entity_key . '_delta'] = array(
          '#type' => 'value',
          '#value' => $form_state['values']['mapping'][$entity_key . '_delta'],
        );

        // If was triggered add-more-button, add new field.
        if (strpos($triggering_element['#id'], 'add-more') !== FALSE && $triggering_element['#parents'][1] == $key) {
          $form_state['values']['mapping'][$key]['fields'][] = array(
            'source_field' => '',
            'destination_field' => '',
          );
        }
        foreach ($form_state['values']['mapping'][$key]['fields'] as $delta => $field) {
          $source_fields_values = $source_fields;
          $importer->source_plugin
            ->mappingSourceFieldsAlter($source_fields_values, crm_core_data_import_get_destination_entity_type($entity_type), $entity_bundle, $importer);
          if ($delta === 'primary') {

            // Attach primary field.
            _crm_core_data_import_attach_elements_primary_fieldset($form, $form_state, $entity_type, $entity_bundle, $key, $html_id, $source_fields_values, $bundle_delta);
          }
          else {

            // Attach form elements for fields.
            _crm_core_data_import_attach_elements_field($form, $form_state, $key, $delta, $source_fields_values, $fields);
          }
        }

        // Attach add more button.
        _crm_core_data_import_attach_elements_add_more_button($form, $form_state, $key, $html_id);
      }
    }
  }

  // Add fieldset form new entity.
  if (!empty($form_state['values']['entity_form']['entity_type']) && !empty($form_state['values']['entity_form']['entity_bundle']) && $triggering_element['#id'] == 'add-entity-button') {
    $entity_type = $form_state['values']['entity_form']['entity_type'];
    $entity_bundle = $form_state['values']['entity_form']['entity_bundle'];
    $key = $entity_type . ':' . $entity_bundle;

    // Save count of entity bundle. Need to support multiple bundles.
    if (empty($form_state['values']['mapping'][$key . '_delta'])) {

      // If initial adding.
      $form_state['values']['mapping'][$key . '_delta'] = 1;
      $bundle_delta = 1;
    }
    else {

      // If bundle already exist.
      $form_state['values']['mapping'][$key . '_delta']++;
      $bundle_delta = $form_state['values']['mapping'][$key . '_delta'];
    }
    $form['mapping'][$key . '_delta'] = array(
      '#type' => 'value',
      '#value' => $bundle_delta,
    );
    $key .= ':' . $bundle_delta;
    $html_id = drupal_html_id($key);
    $source_fields_values = $source_fields;
    $importer->source_plugin
      ->mappingSourceFieldsAlter($source_fields_values, crm_core_data_import_get_destination_entity_type($entity_type), $entity_bundle, $importer);
    _crm_core_data_import_attach_elements_primary_fieldset($form, $form_state, $entity_type, $entity_bundle, $key, $html_id, $source_fields_values, $bundle_delta);
    _crm_core_data_import_attach_elements_add_more_button($form, $form_state, $key, $html_id);
  }
  $importer->source_plugin
    ->fieldMappingFormAlter($form, $form_state);
}