Merge pull request #10486 from mickadoo/CRM-20710_get-valid-types-function
[civicrm-core.git] / api / v3 / CustomValue.php
index 27cf82c4c2e8bcef0c2a3063577f900533e0fe20..8c45ece601149687851bd528f7c51107653f3953 100644 (file)
@@ -233,3 +233,152 @@ function _civicrm_api3_custom_value_get_spec(&$params) {
   $params['entity_id']['api.required'] = 1;
   $params['entity_id']['title'] = 'Entity ID';
 }
+
+/**
+ * CustomValue.gettree API specification
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ */
+function _civicrm_api3_custom_value_gettree_spec(&$spec) {
+  $spec['entity_id'] = array(
+    'title' => 'Entity Id',
+    'description' => 'Id of entity',
+    'type' => CRM_Utils_Type::T_INT,
+    'api.required' => 1,
+  );
+  $entities = civicrm_api3('Entity', 'get');
+  $entities = array_diff($entities['values'], $entities['deprecated']);
+  $spec['entity_type'] = array(
+    'title' => 'Entity Type',
+    'description' => 'API name of entity type, e.g. "Contact"',
+    'type' => CRM_Utils_Type::T_STRING,
+    'api.required' => 1,
+    'options' => array_combine($entities, $entities),
+  );
+  // Return params for custom group, field & value
+  foreach (CRM_Core_DAO_CustomGroup::fields() as $field) {
+    $name = 'custom_group.' . $field['name'];
+    $spec[$name] = array('name' => $name) + $field;
+  }
+  foreach (CRM_Core_DAO_CustomField::fields() as $field) {
+    $name = 'custom_field.' . $field['name'];
+    $spec[$name] = array('name' => $name) + $field;
+  }
+  $spec['custom_value.id'] = array(
+    'title' => 'Custom Value Id',
+    'description' => 'Id of record in custom value table',
+    'type' => CRM_Utils_Type::T_INT,
+  );
+  $spec['custom_value.data'] = array(
+    'title' => 'Custom Value (Raw)',
+    'description' => 'Raw value as stored in the database',
+    'type' => CRM_Utils_Type::T_STRING,
+  );
+  $spec['custom_value.display'] = array(
+    'title' => 'Custom Value (Formatted)',
+    'description' => 'Custom value formatted for display',
+    'type' => CRM_Utils_Type::T_STRING,
+  );
+}
+
+/**
+ * CustomValue.gettree API
+ *
+ * @param array $params
+ * @return array API result
+ * @throws API_Exception
+ */
+function civicrm_api3_custom_value_gettree($params) {
+  $ret = array();
+  $options = _civicrm_api3_get_options_from_params($params);
+  $toReturn = array(
+    'custom_group' => array(),
+    'custom_field' => array(),
+    'custom_value' => array(),
+  );
+  foreach (array_keys($options['return']) as $r) {
+    list($type, $field) = explode('.', $r);
+    if (isset($toReturn[$type])) {
+      $toReturn[$type][] = $field;
+    }
+  }
+  // We must have a name if not indexing sequentially
+  if (empty($params['sequential']) && $toReturn['custom_field']) {
+    $toReturn['custom_field'][] = 'name';
+  }
+  switch ($params['entity_type']) {
+    case 'Contact':
+      $ret = array('entityType' => 'contact_type', 'subTypes' => 'contact_sub_type');
+      break;
+
+    case 'Activity':
+    case 'Campaign':
+    case 'Case':
+    case 'Contribution':
+    case 'Event':
+    case 'Grant':
+    case 'Membership':
+    case 'Relationship':
+      $ret = array('subTypes' => strtolower($params['entity_type']) . '_type_id');
+      break;
+
+    case 'Participant':
+      // todo
+  }
+  $treeParams = array(
+    'entityType' => $params['entity_type'],
+    'subTypes' => array(),
+    'subName' => NULL,
+  );
+  // Fetch entity data for custom group type/sub-type
+  // Also verify access permissions (api3 will throw an exception if permission denied)
+  if ($ret || !empty($params['check_permissions'])) {
+    $entityData = civicrm_api3($params['entity_type'], 'getsingle', array(
+      'id' => $params['entity_id'],
+      'return' => array_merge(array('id'), array_values($ret)),
+    ));
+    foreach ($ret as $param => $key) {
+      if (isset($entityData[$key])) {
+        $treeParams[$param] = $entityData[$key];
+      }
+    }
+  }
+  $tree = CRM_Core_BAO_CustomGroup::getTree($treeParams['entityType'], $toReturn, $params['entity_id'], NULL, $treeParams['subTypes'], $treeParams['subName'], TRUE, NULL, FALSE, CRM_Utils_Array::value('check_permissions', $params, TRUE));
+  unset($tree['info']);
+  $result = array();
+  foreach ($tree as $group) {
+    $result[$group['name']] = array();
+    $groupToReturn = $toReturn['custom_group'] ? $toReturn['custom_group'] : array_keys($group);
+    foreach ($groupToReturn as $item) {
+      $result[$group['name']][$item] = CRM_Utils_Array::value($item, $group);
+    }
+    $result[$group['name']]['fields'] = array();
+    foreach ($group['fields'] as $fieldInfo) {
+      $field = array('value' => NULL);
+      $fieldToReturn = $toReturn['custom_field'] ? $toReturn['custom_field'] : array_keys($fieldInfo);
+      foreach ($fieldToReturn as $item) {
+        $field[$item] = CRM_Utils_Array::value($item, $fieldInfo);
+      }
+      unset($field['customValue']);
+      if (!empty($fieldInfo['customValue'])) {
+        $field['value'] = CRM_Utils_Array::first($fieldInfo['customValue']);
+        if (!$toReturn['custom_value'] || in_array('display', $toReturn['custom_value'])) {
+          $field['value']['display'] = CRM_Core_BAO_CustomField::displayValue($field['value']['data'], $fieldInfo);
+        }
+        foreach (array_keys($field['value']) as $key) {
+          if ($toReturn['custom_value'] && !in_array($key, $toReturn['custom_value'])) {
+            unset($field['value'][$key]);
+          }
+        }
+      }
+      if (empty($params['sequential'])) {
+        $result[$group['name']]['fields'][$fieldInfo['name']] = $field;
+      }
+      else {
+        $result[$group['name']]['fields'][] = $field;
+      }
+    }
+  }
+  return civicrm_api3_create_success($result, $params, 'CustomValue', 'gettree');
+}