+
+/**
+ * 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');
+}