CRM-16148 - Show option names instead of ids in api explorer
authorColeman Watts <coleman@civicrm.org>
Fri, 20 Mar 2015 19:49:24 +0000 (15:49 -0400)
committerColeman Watts <coleman@civicrm.org>
Wed, 25 Mar 2015 15:44:50 +0000 (11:44 -0400)
This adds a new context option to getoptions - "match"

CRM/Core/DAO.php
CRM/Core/PseudoConstant.php
api/v3/Generic.php
templates/CRM/Admin/Page/APIExplorer.js

index f551fb448c926205269ee427e5308ece3c125323..721acc77ff840dc98d2252db9847b9b045baaa23 100644 (file)
@@ -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])) {
index 9d9b4802532488d2ceb1f8d540adbc3ee50f953b..3a932e15d3cdb0c4dbfd7701bcccfa7eed44504b 100644 (file)
@@ -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
index 400c4d7ea3b3a4f48f206192faa5ed6ad7ccaac9..6bc8fb3ff94b99d7c9fdcd937e6dbfe301b341c9 100644 (file)
@@ -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'];
   }
index e5d1970e58a42c9e71f943a5e633e5e7567a9659..693c65c5deb04e3bb771093e5078d38b9e5c0e71 100644 (file)
       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;