From 33250757a5b6913e06ad32d6bc296f79c5ac1177 Mon Sep 17 00:00:00 2001 From: Jon Goldberg Date: Wed, 10 May 2023 14:55:30 -0400 Subject: [PATCH] proper EntityRef joins --- ext/search_kit/Civi/Search/Admin.php | 18 +++++++ .../tests/phpunit/Civi/Search/AdminTest.php | 18 +++++++ .../SearchRunWithCustomFieldTest.php | 50 +++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/ext/search_kit/Civi/Search/Admin.php b/ext/search_kit/Civi/Search/Admin.php index b8866bdfc3..4bd9114294 100644 --- a/ext/search_kit/Civi/Search/Admin.php +++ b/ext/search_kit/Civi/Search/Admin.php @@ -366,6 +366,24 @@ class Admin { } } } + // Custom EntityRef joins + foreach ($fields as $field) { + if ($field['type'] === 'Custom' && $field['input_type'] === 'EntityRef') { + $targetEntity = $allowedEntities[$field['fk_entity']]; + // Add the EntityRef join + [, $bareFieldName] = explode('.', $field['name']); + $alias = $entity['name'] . '_' . $field['fk_entity'] . '_' . $bareFieldName; + $joins[$entity['name']][] = [ + 'label' => $entity['title'] . ' ' . $field['title'], + 'description' => $field['description'], + 'entity' => $field['fk_entity'], + 'conditions' => self::getJoinConditions($field['name'], $alias . '.id'), + 'defaults' => [], + 'alias' => $alias, + 'multi' => FALSE, + ]; + } + } } } return $joins; diff --git a/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php b/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php index 2bd83b68b5..7093a165ec 100644 --- a/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php +++ b/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php @@ -126,4 +126,22 @@ class AdminTest extends \PHPUnit\Framework\TestCase implements HeadlessInterface $this->assertCount(1, $optionValueToGroup); } + public function testEntityRefGetJoins(): void { + \Civi\Api4\CustomGroup::create()->setValues([ + 'title' => 'EntityRefFields', + 'extends' => 'Individual', + ])->execute(); + \Civi\Api4\CustomField::create()->setValues([ + 'label' => 'Favorite Nephew', + 'name' => 'favorite_nephew', + 'custom_group_id.name' => 'EntityRefFields', + 'html_type' => 'Autocomplete-Select', + 'data_type' => 'EntityReference', + 'fk_entity' => 'Contact', + ])->execute(); + $allowedEntities = Admin::getSchema(); + $joins = Admin::getJoins($allowedEntities); + $this->assertContains('Contact Favorite Nephew', array_column($joins['Contact'], 'label')); + } + } diff --git a/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunWithCustomFieldTest.php b/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunWithCustomFieldTest.php index 9497758b10..5096e3f03c 100644 --- a/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunWithCustomFieldTest.php +++ b/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunWithCustomFieldTest.php @@ -453,4 +453,54 @@ class SearchRunWithCustomFieldTest extends CustomTestBase { $this->assertEquals("$lastName zero", $result[1]['columns'][1]['val']); } + public function testEntityReferenceJoins() { + CustomGroup::create()->setValues([ + 'title' => 'EntityRefFields', + 'extends' => 'Individual', + ])->execute(); + CustomField::create()->setValues([ + 'label' => 'Favorite Nephew', + 'name' => 'favorite_nephew', + 'custom_group_id.name' => 'EntityRefFields', + 'html_type' => 'Autocomplete-Select', + 'data_type' => 'EntityReference', + 'fk_entity' => 'Contact', + ])->execute(); + $nephewId = $this->createTestRecord('Contact', ['first_name' => 'Dewey', 'last_name' => 'Duck'])['id']; + $uncleId = $this->createTestRecord('Contact', ['first_name' => 'Donald', 'last_name' => 'Duck', 'EntityRefFields.favorite_nephew' => $nephewId])['id']; + $contact = Contact::get(FALSE) + ->addSelect('first_name', 'EntityRefFields.favorite_nephew.first_name') + ->addWhere('id', '=', $uncleId) + ->execute() + ->first(); + $this->assertEquals('Donald', $contact['first_name']); + $this->assertEquals('Dewey', $contact['EntityRefFields.favorite_nephew.first_name']); + + $params = [ + 'checkPermissions' => FALSE, + 'return' => 'page:1', + 'savedSearch' => [ + 'api_entity' => 'Contact', + 'api_params' => [ + 'version' => 4, + 'select' => ['EntityRefFields.favorite_nephew.first_name'], + 'where' => [['id', '=', $uncleId]], + ], + "join" => [ + [ + "Contact+AS+Contact_Contact_favorite_nephew_01", + "LEFT", + [ + "EntityRefFields.favorite_nephew", + "=", + "Contact_Contact_favorite_nephew_01.id", + ], + ], + ], + ], + ]; + $result = civicrm_api4('SearchDisplay', 'run', $params); + $this->assertEquals('Dewey', $result[0]['columns'][0]['val']); + } + } -- 2.25.1