$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) {
}
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');
}
}
}
$skipColumnHeader = $this->controller->exportValue('DataSource', 'skipColumnHeader');
$this->_entity = $this->controller->exportValue('DataSource', 'entity');
- $mapperKeys = [];
$mapper = [];
$mapperKeys = $this->controller->exportValue($this->_name, 'mapper');
$mapperKeysMain = [];
$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();
}
}
$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);
$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;
+ }
+
}