APIv4 - smarter parsing of Entity docblocks
authorColeman Watts <coleman@civicrm.org>
Sun, 31 Jul 2022 14:51:45 +0000 (10:51 -0400)
committerColeman Watts <coleman@civicrm.org>
Sun, 31 Jul 2022 14:51:45 +0000 (10:51 -0400)
Civi/Api4/Generic/AbstractEntity.php
Civi/Api4/Generic/Traits/DAOActionTrait.php
Civi/Api4/Utils/ReflectionUtils.php

index 06cab372074d04468ebaf5bdbbef0ac7ea724637..bc99c02a41274641846510f7873e14a25f41c8be 100644 (file)
@@ -158,19 +158,30 @@ abstract class AbstractEntity {
     foreach (ReflectionUtils::getTraits(static::class) as $trait) {
       $info['type'][] = self::stripNamespace($trait);
     }
+    // Get DocBlock from APIv4 Entity class
     $reflection = new \ReflectionClass(static::class);
-    $info = array_merge($info, ReflectionUtils::getCodeDocs($reflection, NULL, ['entity' => $info['name']]));
+    $docBlock = ReflectionUtils::getCodeDocs($reflection, NULL, ['entity' => $info['name']]);
+    // Convert docblock keys to snake_case
+    foreach ($docBlock as $key => $val) {
+      $docBlock[\CRM_Utils_String::convertStringToSnakeCase($key)] = $val;
+    }
+    // Filter docblock to only declared entity fields
+    foreach (\Civi\Api4\Entity::$entityFields as $field) {
+      if (isset($docBlock[$field['name']])) {
+        $val = $docBlock[$field['name']];
+        // Convert to array if data_type == Array
+        if (isset($field['data_type']) && $field['data_type'] === 'Array' && is_string($val)) {
+          $val = \CRM_Core_DAO::unSerializeField($val, \CRM_Core_DAO::SERIALIZE_COMMA);
+        }
+        $info[$field['name']] = $val;
+      }
+    }
+
     if ($dao) {
       $info['description'] = $dao::getEntityDescription() ?? $info['description'] ?? NULL;
     }
-    unset($info['package'], $info['method']);
 
-    // Ensure all keys are snake_case
-    $keys = array_keys($info);
-    foreach ($keys as &$key) {
-      $key = \CRM_Utils_String::convertStringToSnakeCase($key);
-    }
-    return array_combine($keys, array_values($info));
+    return $info;
   }
 
   /**
index c7661f70751fe7300acbeb0c0c5c2f9d547f33f0..d8e511e70009b176a46a098149d9be03c5bace12 100644 (file)
@@ -336,7 +336,6 @@ trait DAOActionTrait {
     if (!isset($record[$weightField]) && !empty($record[$idField])) {
       return;
     }
-    $daoFields = $daoName::getSupportedFields();
     $newWeight = $record[$weightField] ?? NULL;
     $oldWeight = empty($record[$idField]) ? NULL : \CRM_Core_DAO::getFieldValue($daoName, $record[$idField], $weightField);
 
index f09d8841d96259bc855798659e1eb123c6010248..29e5c4d6c6c4fbe8f303969dcc7b416adc8f7907 100644 (file)
@@ -88,7 +88,7 @@ class ReflectionUtils {
         elseif ($key == 'return') {
           $info['return'] = explode('|', $words[0]);
         }
-        elseif ($key == 'options' || $key == 'ui_join_filters' || $key == 'groupWeightsBy') {
+        elseif ($key == 'options') {
           $val = str_replace(', ', ',', implode(' ', $words));
           $info[$key] = explode(',', $val);
         }