From 5c1d7fad396fb6f9053e310511777bba34bdd5e4 Mon Sep 17 00:00:00 2001 From: Vangelis Pantazis Date: Wed, 29 May 2019 11:54:38 +0100 Subject: [PATCH] Fixes contact's displayname not appearing in membership edit, if no registered email is found Add a unit test to lock in fix to dev/core#1000 --- CRM/Contact/BAO/Contact/Location.php | 33 +++++++++++++------ tests/phpunit/CRM/Contact/BAO/ContactTest.php | 14 ++++++++ 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/CRM/Contact/BAO/Contact/Location.php b/CRM/Contact/BAO/Contact/Location.php index 8e7a12f373..4d7c24eaa2 100644 --- a/CRM/Contact/BAO/Contact/Location.php +++ b/CRM/Contact/BAO/Contact/Location.php @@ -45,21 +45,34 @@ class CRM_Contact_BAO_Contact_Location { * Array of display_name, email, location type and location id if found, or (null,null,null, null) */ public static function getEmailDetails($id, $isPrimary = TRUE, $locationTypeID = NULL) { - $params = [ - 'location_type_id' => $locationTypeID, + $params = array( 'contact_id' => $id, - 'return' => ['contact_id.display_name', 'email', 'location_type_id', 'id'], - ]; + 'return' => array('display_name', 'email.email'), + 'api.Email.get' => array( + 'location_type_id' => $locationTypeID, + 'sequential' => 0, + 'return' => array('email', 'location_type_id', 'id'), + ), + ); if ($isPrimary) { - $params['is_primary'] = 1; + $params['api.Email.get']['is_primary'] = 1; } - $emails = civicrm_api3('Email', 'get', $params); - if ($emails['count'] > 0) { - $email = reset($emails['values']); - return [$email['contact_id.display_name'], $email['email'], $email['location_type_id'], $email['id']]; + $contacts = civicrm_api3('Contact', 'get', $params); + if ($contacts['count'] > 0) { + $contact = reset($contacts['values']); + if ($contact['api.Email.get']['count'] > 0) { + $email = reset($contact['api.Email.get']['values']); + } } - return [NULL, NULL, NULL, NULL]; + $returnParams = array( + (isset($contact['display_name'])) ? $contact['display_name'] : NULL, + (isset($email['email'])) ? $email['email'] : NULL, + (isset($email['location_type_id'])) ? $email['location_type_id'] : NULL, + (isset($email['id'])) ? $email['id'] : NULL, + ); + + return $returnParams; } /** diff --git a/tests/phpunit/CRM/Contact/BAO/ContactTest.php b/tests/phpunit/CRM/Contact/BAO/ContactTest.php index cc168dfeac..2556b203e2 100644 --- a/tests/phpunit/CRM/Contact/BAO/ContactTest.php +++ b/tests/phpunit/CRM/Contact/BAO/ContactTest.php @@ -1623,4 +1623,18 @@ class CRM_Contact_BAO_ContactTest extends CiviUnitTestCase { $this->contactDelete($contactId); } + /** + * Test that contact details are still displayed if no email is present. + * + * @throws \Exception + */ + public function testContactEmailDetailsWithNoPrimaryEmail() { + $params = $this->contactParams(); + unset($params['email']); + $contact = CRM_Contact_BAO_Contact::create($params); + $contactId = $contact->id; + $result = CRM_Contact_BAO_Contact_Location::getEmailDetails($contactId); + $this->assertEquals([$contact->display_name, NULL, NULL, NULL], $result); + } + } -- 2.25.1