diff --git a/CRM/UF/Page/ProfileEditor.php b/CRM/UF/Page/ProfileEditor.php index 466278a3fa46..061b7ce742bc 100644 --- a/CRM/UF/Page/ProfileEditor.php +++ b/CRM/UF/Page/ProfileEditor.php @@ -192,7 +192,20 @@ public static function getSchema($entityTypes) { break; default: - throw new CRM_Core_Exception("Unrecognized entity type: $entityType"); + if (strpos($entityType, 'Model') !== FALSE) { + $entity = str_replace('Model', '', $entityType); + $backboneModel = self::convertCiviModelToBackboneModel( + $entity, + ts('%1', [1 => $entity]), + $availableFields + ); + if (!empty($backboneModel['schema'])) { + $civiSchema[$entityType] = $backboneModel; + } + } + if (!isset($civiSchema[$entityType])) { + throw new CRM_Core_Exception("Unrecognized entity type: $entityType"); + } } } diff --git a/tests/phpunit/CRM/UF/Page/ProfileEditorTest.php b/tests/phpunit/CRM/UF/Page/ProfileEditorTest.php index 6ee808a43561..7ea035594e0d 100644 --- a/tests/phpunit/CRM/UF/Page/ProfileEditorTest.php +++ b/tests/phpunit/CRM/UF/Page/ProfileEditorTest.php @@ -45,4 +45,28 @@ public function testGetSchema() { } + /** + * Test that with an extension adding in UF Fields for an enttiy that isn't supplied by Core e.g. Grant + * That an appropriate entitytype can be specfied in the backbone.marionette profile editor e.g. GrantModel + */ + public function testGetSchemaWithHooks() { + CRM_Utils_Hook::singleton()->setHook('civicrm_alterUFFields', [$this, 'hook_civicrm_alterUFFIelds']); + $schema = CRM_UF_Page_ProfileEditor::getSchema(['IndividualModel', 'GrantModel']); + $this->assertEquals('Grant', $schema['GrantModel']['schema']['grant_decision_date']['civiFieldType']); + } + + /** + * Tries to load up the profile schema for a model where there is no corresponding set of fields avaliable. + * + * @expectedException \CRM_Core_Exception + */ + public function testGetSchemaWithHooksWithInvalidModel() { + CRM_Utils_Hook::singleton()->setHook('civicrm_alterUFFields', [$this, 'hook_civicrm_alterUFFIelds']); + $schema = CRM_UF_Page_ProfileEditor::getSchema(['IndividualModel', 'GrantModel', 'PledgeModel']); + } + + public function hook_civicrm_alterUFFIelds(&$fields) { + $fields['Grant'] = CRM_Grant_BAO_Grant::exportableFields(); + } + }