Skip to content

Commit

Permalink
Merge pull request #15018 from eileenmcnaughton/metadata
Browse files Browse the repository at this point in the history
[Ref] [Import] move metadata calculations to a trait
  • Loading branch information
seamuslee001 authored Aug 18, 2019
2 parents a596705 + 91b4c63 commit bdc9aa3
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 43 deletions.
122 changes: 122 additions & 0 deletions CRM/Contact/Import/MetadataTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
<?php

/**
* Trait CRM_Contact_Import_MetadataTrait
*
* Trait for handling contact import specific metadata so it
* does not need to be passed from one form to the next.
*/
trait CRM_Contact_Import_MetadataTrait {

/**
* Get metadata for contact importable fields.
*
* @return array
*/
protected function getContactImportMetadata(): array {
$cacheKey = 'importable_contact_field_metadata' . $this->getContactType() . $this->getContactSubType();
if (Civi::cache('fields')->has($cacheKey)) {
return Civi::cache('fields')->get($cacheKey);
}
$contactFields = CRM_Contact_BAO_Contact::importableFields($this->getContactType());
// exclude the address options disabled in the Address Settings
$fields = CRM_Core_BAO_Address::validateAddressOptions($contactFields);

//CRM-5125
//supporting import for contact subtypes
$csType = NULL;
if ($this->getContactSubType()) {
//custom fields for sub type
$subTypeFields = CRM_Core_BAO_CustomField::getFieldsForImport($this->getContactSubType());

if (!empty($subTypeFields)) {
foreach ($subTypeFields as $customSubTypeField => $details) {
$fields[$customSubTypeField] = $details;
}
}
}

foreach ($this->getRelationships() as $key => $var) {
list($type) = explode('_', $key);
$relationshipType[$key]['title'] = $var;
$relationshipType[$key]['headerPattern'] = '/' . preg_quote($var, '/') . '/';
$relationshipType[$key]['import'] = TRUE;
$relationshipType[$key]['relationship_type_id'] = $type;
$relationshipType[$key]['related'] = TRUE;
}

if (!empty($relationshipType)) {
$fields = array_merge($fields, [
'related' => [
'title' => ts('- related contact info -'),
],
], $relationshipType);
}
Civi::cache('fields')->set($cacheKey, $fields);
return $fields;
}

/**
* Get sorted available relationships.
*
* @return array
*/
protected function getRelationships(): array {
$cacheKey = 'importable_contact_relationship_field_metadata' . $this->getContactType() . $this->getContactSubType();
if (Civi::cache('fields')->has($cacheKey)) {
return Civi::cache('fields')->get($cacheKey);
}
//Relationship importables
$relations = CRM_Contact_BAO_Relationship::getContactRelationshipType(
NULL, NULL, NULL, $this->getContactType(),
FALSE, 'label', TRUE, $this->getContactSubType()
);
asort($relations);
Civi::cache('fields')->set($cacheKey, $relations);
return $relations;
}

/**
* Get an array of header patterns for importable keys.
*
* @return array
*/
public function getHeaderPatterns() {
return CRM_Utils_Array::collect('headerPattern', $this->getContactImportMetadata());
}

/**
* Get an array of header patterns for importable keys.
*
* @return array
*/
public function getDataPatterns() {
return CRM_Utils_Array::collect('dataPattern', $this->getContactImportMetadata());
}

/**
* Get an array of header patterns for importable keys.
*
* @return array
*/
public function getFieldTitles() {
return CRM_Utils_Array::collect('title', $this->getContactImportMetadata());
}

/**
* Get configured contact type.
*/
protected function getContactType() {
return $this->_contactType ?? 'Individual';
}

/**
* Get configured contact sub type.
*
* @return string
*/
protected function getContactSubType() {
return $this->_contactSubType ?? NULL;
}

}
49 changes: 6 additions & 43 deletions CRM/Contact/Import/Parser/Contact.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
* class to parse contact csv files
*/
class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser {

use CRM_Contact_Import_MetadataTrait;

protected $_mapperKeys = [];
protected $_mapperLocType = [];
protected $_mapperPhoneType;
Expand Down Expand Up @@ -2054,49 +2057,9 @@ public static function getParameterForParser($count) {
* Set field metadata.
*/
protected function setFieldMetadata() {
$contactFields = CRM_Contact_BAO_Contact::importableFields($this->_contactType);
// exclude the address options disabled in the Address Settings
$fields = CRM_Core_BAO_Address::validateAddressOptions($contactFields);

//CRM-5125
//supporting import for contact subtypes
$csType = NULL;
if (!empty($this->_contactSubType)) {
//custom fields for sub type
$subTypeFields = CRM_Core_BAO_CustomField::getFieldsForImport($this->_contactSubType);

if (!empty($subTypeFields)) {
foreach ($subTypeFields as $customSubTypeField => $details) {
$fields[$customSubTypeField] = $details;
}
}
}

//Relationship importables
$this->_relationships = $relations
= CRM_Contact_BAO_Relationship::getContactRelationshipType(
NULL, NULL, NULL, $this->_contactType,
FALSE, 'label', TRUE, $this->_contactSubType
);
asort($relations);

foreach ($relations as $key => $var) {
list($type) = explode('_', $key);
$relationshipType[$key]['title'] = $var;
$relationshipType[$key]['headerPattern'] = '/' . preg_quote($var, '/') . '/';
$relationshipType[$key]['import'] = TRUE;
$relationshipType[$key]['relationship_type_id'] = $type;
$relationshipType[$key]['related'] = TRUE;
}

if (!empty($relationshipType)) {
$fields = array_merge($fields, [
'related' => [
'title' => ts('- related contact info -'),
],
], $relationshipType);
}
$this->setImportableFieldsMetadata($fields);
$this->setImportableFieldsMetadata($this->getContactImportMetadata());
// Probably no longer needed but here for now.
$this->_relationships = $this->getRelationships();
}

}

0 comments on commit bdc9aa3

Please sign in to comment.