Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Ref] [Import] move metadata calculations to a trait #15018

Merged
merged 1 commit into from
Aug 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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()) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added functions to avoid enotices here

//custom fields for sub type
$subTypeFields = CRM_Core_BAO_CustomField::getFieldsForImport($this->getContactSubType());
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and here


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 {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And this is just a subset that is also useful elsewhere as it's own fn

$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();
}

}