From b432ddaaefb6bf2dc0cb473b66891f725b1a1165 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Fri, 20 Mar 2015 15:49:24 -0400 Subject: [PATCH] CRM-16148 - Show option names instead of ids in api explorer This adds a new context option to getoptions - "match" --- CRM/Core/DAO.php | 1 + CRM/Core/PseudoConstant.php | 12 ++++++++---- api/v3/Generic.php | 21 ++++++++++++++++----- templates/CRM/Admin/Page/APIExplorer.js | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/CRM/Core/DAO.php b/CRM/Core/DAO.php index f551fb448c..721acc77ff 100644 --- a/CRM/Core/DAO.php +++ b/CRM/Core/DAO.php @@ -2209,6 +2209,7 @@ SELECT contact_id 'search' => "Searchable options are returned. Labels are translated.", 'validate' => "All options are returned, even if they are disabled. Machine names are used in place of labels.", 'abbreviate' => "Active options are returned, and labels are replaced with abbreviations.", + 'match' => "Enabled options are returned using machine names as keys. Labels are translated.", ); // Validation: enforce uniformity of this param if ($context !== NULL && !isset($contexts[$context])) { diff --git a/CRM/Core/PseudoConstant.php b/CRM/Core/PseudoConstant.php index 9d9b480253..3a932e15d3 100644 --- a/CRM/Core/PseudoConstant.php +++ b/CRM/Core/PseudoConstant.php @@ -303,6 +303,9 @@ class CRM_Core_PseudoConstant { if ($context == 'validate') { $params['labelColumn'] = 'name'; } + if ($context == 'match') { + $params['keyColumn'] = 'name'; + } // Call our generic fn for retrieving from the option_value table return CRM_Core_OptionGroup::values( $pseudoconstant['optionGroupName'], @@ -343,13 +346,14 @@ class CRM_Core_PseudoConstant { $wheres = array(); $order = "ORDER BY %2"; - // Use machine name instead of label in validate context - if ($context == 'validate') { + // Use machine name in certain contexts + if ($context == 'validate' || $context == 'match') { + $nameField = $context == 'validate' ? 'labelColumn' : 'keyColumn'; if (!empty($pseudoconstant['nameColumn'])) { - $params['labelColumn'] = $pseudoconstant['nameColumn']; + $params[$nameField] = $pseudoconstant['nameColumn']; } elseif (in_array('name', $availableFields)) { - $params['labelColumn'] = 'name'; + $params[$nameField] = 'name'; } } // Condition param can be passed as an sql clause string or an array of clauses diff --git a/api/v3/Generic.php b/api/v3/Generic.php index 400c4d7ea3..6bc8fb3ff9 100644 --- a/api/v3/Generic.php +++ b/api/v3/Generic.php @@ -191,7 +191,7 @@ function civicrm_api3_generic_getfields($apiRequest) { if (!isset($fieldSpec['name'])) { $metadata[$fieldname]['name'] = $fieldname; } - _civicrm_api3_generic_get_metadata_options($metadata, $apiRequest, $fieldname, $fieldSpec, $optionsToResolve); + _civicrm_api3_generic_get_metadata_options($metadata, $apiRequest, $fieldname, $fieldSpec); // Convert options to "sequential" format if ($sequential && !empty($metadata[$fieldname]['options'])) { @@ -420,19 +420,30 @@ function _civicrm_api3_generic_getoptions_spec(&$params, $apiRequest) { * Field currently being processed. * @param array $fieldSpec * Metadata for that field. - * @param array $fieldsToResolve - * Any field resolutions specifically requested. */ -function _civicrm_api3_generic_get_metadata_options(&$metadata, $apiRequest, $fieldname, $fieldSpec, $fieldsToResolve) { +function _civicrm_api3_generic_get_metadata_options(&$metadata, $apiRequest, $fieldname, $fieldSpec) { if (empty($fieldSpec['pseudoconstant']) && empty($fieldSpec['option_group_id'])) { return; } + $fieldsToResolve = $apiRequest['params']['options']['get_options']; + if (!empty($metadata[$fieldname]['options']) || (!in_array($fieldname, $fieldsToResolve) && !in_array('all', $fieldsToResolve))) { return; } - $options = civicrm_api($apiRequest['entity'], 'getoptions', array('version' => 3, 'field' => $fieldname)); + // Allow caller to specify context + $context = CRM_Utils_Array::value('get_options_context', $apiRequest['params']['options']); + // Default to api action if it is a supported context. + if (!$context) { + $action = CRM_Utils_Array::value('action', $apiRequest['params']); + $contexts = CRM_Core_DAO::buildOptionsContext(); + if (isset($contexts[$action])) { + $context = $action; + } + } + + $options = civicrm_api($apiRequest['entity'], 'getoptions', array('version' => 3, 'field' => $fieldname, 'context' => $context)); if (is_array(CRM_Utils_Array::value('values', $options))) { $metadata[$fieldname]['options'] = $options['values']; } diff --git a/templates/CRM/Admin/Page/APIExplorer.js b/templates/CRM/Admin/Page/APIExplorer.js index e5d1970e58..693c65c5de 100644 --- a/templates/CRM/Admin/Page/APIExplorer.js +++ b/templates/CRM/Admin/Page/APIExplorer.js @@ -141,7 +141,7 @@ showFields(['api_action']); return; } - CRM.api3(entity, 'getFields', {'api_action': action, options: {get_options: 'all'}}).done(function(data) { + CRM.api3(entity, 'getfields', {'api_action': action, options: {get_options: 'all', get_options_context: 'match'}}).done(function(data) { _.each(data.values, function(field) { if (field.name) { getFieldData[field.name] = field; -- 2.25.1