Import - Fix loading and saving multiValued custom data field mapping
authorColeman Watts <coleman@civicrm.org>
Tue, 4 Jan 2022 02:51:37 +0000 (21:51 -0500)
committerColeman Watts <coleman@civicrm.org>
Tue, 4 Jan 2022 02:51:37 +0000 (21:51 -0500)
CRM/Custom/Import/Form/MapField.php

index 30db99f01f138eb5a2de005dbc8d8f89cafb858f..64cc0c6287504b59f6cb2e1387d51b1159dd8dcd 100644 (file)
@@ -55,18 +55,31 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
     $this->addFormRule(['CRM_Custom_Import_Form_MapField', 'formRule']);
   }
 
+  /**
+   * Override contact import metadata with multi-value custom fields.
+   *
+   * Used to match saved mapping fields.
+   *
+   * @return array
+   */
+  protected function getContactImportMetadata(): array {
+    $contactFields = CRM_Contact_BAO_Contact::importableFields('All', FALSE, FALSE, FALSE, TRUE, TRUE);
+    $contactFields['contact_id'] = $contactFields['id'];
+    $contactFields['contact_id']['name'] = 'contact_id';
+    return $contactFields;
+  }
+
   /**
    * Global validation rules for the form.
    *
    * @param array $fields
    *   Posted values of the form.
    *
-   * @return array
+   * @return array|bool
    *   list of errors to be posted back to the form
    */
   public static function formRule($fields) {
     $errors = [];
-    $fieldMessage = NULL;
     if (!array_key_exists('savedMapping', $fields)) {
       $importKeys = [];
       foreach ($fields['mapper'] as $mapperPart) {
@@ -89,7 +102,7 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
       }
       else {
         if (CRM_Core_BAO_Mapping::checkMapping($nameField, CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Mapping', 'mapping_type_id', 'Import Multi value custom data'))) {
-          $errors['saveMappingName'] = ts('Duplicate ' . $self->_mappingType . 'Mapping Name');
+          $errors['saveMappingName'] = ts('Duplicate Mapping Name');
         }
       }
     }
@@ -136,7 +149,6 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
     $skipColumnHeader = $this->controller->exportValue('DataSource', 'skipColumnHeader');
     $this->_entity = $this->controller->exportValue('DataSource', 'entity');
 
-    $mapperKeys = [];
     $mapper = [];
     $mapperKeys = $this->controller->exportValue($this->_name, 'mapper');
     $mapperKeysMain = [];
@@ -171,12 +183,7 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
         $updateMappingFields->mapping_id = $params['mappingId'];
         $updateMappingFields->column_number = $i;
 
-        $explodedValues = explode('_', $mapperKeys[$i][0]);
-        $id = $explodedValues[0] ?? NULL;
-        $first = $explodedValues[1] ?? NULL;
-        $second = $explodedValues[2] ?? NULL;
-
-        $updateMappingFields->name = $mapper[$i];
+        $updateMappingFields->name = $this->getMappingFieldName($mapper[$i]);
         $updateMappingFields->save();
       }
     }
@@ -195,12 +202,7 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
         $saveMappingFields->mapping_id = $saveMapping->id;
         $saveMappingFields->column_number = $i;
 
-        $explodedValues = explode('_', $mapperKeys[$i][0]);
-        $id = $explodedValues[0] ?? NULL;
-        $first = $explodedValues[1] ?? NULL;
-        $second = $explodedValues[2] ?? NULL;
-
-        $saveMappingFields->name = $mapper[$i];
+        $saveMappingFields->name = $this->getMappingFieldName($mapper[$i]);
         $saveMappingFields->save();
       }
       $this->set('savedMapping', $saveMappingFields->mapping_id);
@@ -216,4 +218,13 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
     $parser->set($this);
   }
 
+  private function getMappingFieldName($label) {
+    $name = array_search($label, $this->_mapperFields);
+    // The `CRM_Import_ImportProcessor::getNameFromLabel` function expects custom fields like "fieldLabel :: groupLabel"
+    if ($name && strpos($name, 'custom_') === 0) {
+      return $label . ' :: ' . CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $this->_multipleCustomData, 'title');
+    }
+    return $label;
+  }
+
 }