APIv4 - Get dynamic list of entity types
authorColeman Watts <coleman@civicrm.org>
Thu, 24 Feb 2022 02:59:44 +0000 (21:59 -0500)
committerColeman Watts <coleman@civicrm.org>
Thu, 24 Feb 2022 02:59:44 +0000 (21:59 -0500)
Switches APIv4 Entity.get to dynamically fetch a list of entity types
instead of using a hardcoded list.

Civi/Api4/Entity.php

index 9fc1dd7348078c5d733e75f9216538bfc574b362..b65738f43417fa0dc23c6dff423643891bdf01b9 100644 (file)
@@ -35,7 +35,7 @@ class Entity extends Generic\AbstractEntity {
    * @return Generic\BasicGetFieldsAction
    */
   public static function getFields($checkPermissions = TRUE) {
-    return (new Generic\BasicGetFieldsAction('Entity', __FUNCTION__, function() {
+    return (new Generic\BasicGetFieldsAction('Entity', __FUNCTION__, function(Generic\BasicGetFieldsAction $getFields) {
       return [
         [
           'name' => 'name',
@@ -53,15 +53,7 @@ class Entity extends Generic\AbstractEntity {
           'name' => 'type',
           'data_type' => 'Array',
           'description' => 'Base class for this entity',
-          'options' => [
-            'AbstractEntity' => 'AbstractEntity',
-            'DAOEntity' => 'DAOEntity',
-            'CustomValue' => 'CustomValue',
-            'BasicEntity' => 'BasicEntity',
-            'SortableEntity' => 'SortableEntity',
-            'ManagedEntity' => 'ManagedEntity',
-            'EntityBridge' => 'EntityBridge',
-          ],
+          'options' => $getFields->getLoadOptions() ? self::getEntityTypes() : TRUE,
         ],
         [
           'name' => 'description',
@@ -160,4 +152,20 @@ class Entity extends Generic\AbstractEntity {
     ];
   }
 
+  /**
+   * Collect the 'type' values from every entity.
+   *
+   * @return array
+   */
+  private static function getEntityTypes() {
+    $provider = \Civi::service('action_object_provider');
+    $entityTypes = [];
+    foreach ($provider->getEntities() as $entity) {
+      foreach ($entity['type'] ?? [] as $type) {
+        $entityTypes[$type] = $type;
+      }
+    }
+    return $entityTypes;
+  }
+
 }