Mailing.gettokens api - Additional improvements
authorColeman Watts <coleman@civicrm.org>
Tue, 24 Feb 2015 14:54:16 +0000 (09:54 -0500)
committerColeman Watts <coleman@civicrm.org>
Tue, 24 Feb 2015 14:54:16 +0000 (09:54 -0500)
CRM/Core/SelectValues.php
CRM/Utils/Token.php
api/v3/Mailing.php
api/v3/examples/Mailing/GetTokens.php
tests/phpunit/api/v3/MailingTest.php

index 2e30aafd67cbb6ad4ec3a99c3432e93a5f873ed7..b7273e435030d82b4649f2e8cfa72124451ba41a 100644 (file)
@@ -617,7 +617,7 @@ class CRM_Core_SelectValues {
         }
       }
 
-      // might as well get all the hook tokens to
+      // Get all the hook tokens too
       $hookTokens = array();
       CRM_Utils_Hook::tokens($hookTokens);
       foreach ($hookTokens as $tokenValues) {
index b3ebfd7f5360e1184220789ce2d91227d1e514b6..6d940196366ce4a4ceee12509d8318942b6d4cce 100644 (file)
@@ -1808,6 +1808,7 @@ class CRM_Utils_Token {
 
   /**
    * Formats a token list for the select2 widget
+   *
    * @param $tokens
    * @return array
    */
index 22fe9bcc52ad56105ed748fc472620a11cce121f..d97176c1e7c512a40664a69d787dba9a0ec4cfd4 100755 (executable)
@@ -63,9 +63,13 @@ function civicrm_api3_mailing_create($params) {
 }
 
 /**
- * Get mailing token.
+ * Get tokens for one or more entity type
+ *
+ * Output will be formatted either as a flat list,
+ * or pass sequential=1 to retrieve as a hierarchy formatted for select2.
  *
  * @param array $params
+ *   Should contain an array of entities to retrieve tokens for.
  *
  * @return array
  * @throws \API_Exception
@@ -73,7 +77,7 @@ function civicrm_api3_mailing_create($params) {
 function civicrm_api3_mailing_gettokens($params) {
   $tokens = array();
   foreach ((array) $params['entity'] as $ent) {
-    $func = $ent . 'Tokens';
+    $func = lcfirst($ent) . 'Tokens';
     if (!method_exists('CRM_Core_SelectValues', $func)) {
       throw new API_Exception('Unknown token entity: ' . $ent);
     }
@@ -101,9 +105,10 @@ function _civicrm_api3_mailing_gettokens_spec(&$params) {
     'title' => 'Entity',
     'options' => array(),
   );
+  // Fetch a list of token functions and format to look like entity names
   foreach (get_class_methods('CRM_Core_SelectValues') as $func) {
     if (strpos($func, 'Tokens')) {
-      $ent = str_replace('Tokens', '', $func);
+      $ent = ucfirst(str_replace('Tokens', '', $func));
       $params['entity']['options'][$ent] = $ent;
     }
   }
index 279d84f20f0b3b7b9f4a47769d775c47b9367490..8e100bedf1cc9e5e7a3926934c8a452fee599646 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Test Generated example demonstrating the Mailing.gettokens API.
  *
- * Demonstrates fetching tokens for one or more entities (in this case "contact" and "mailing").
+ * Demonstrates fetching tokens for one or more entities (in this case "Contact" and "Mailing").
  * Optionally pass sequential=1 to have output ready-formatted for the select2 widget.
  *
  * @return array
@@ -11,8 +11,8 @@
 function mailing_gettokens_example() {
   $params = array(
     'entity' => array(
-      '0' => 'contact',
-      '1' => 'mailing',
+      '0' => 'Contact',
+      '1' => 'Mailing',
     ),
   );
 
index e9405cb2e9f10a97750a72f956b7d13549fbe73b..fff3c7b597425d9e0c969066337ecc8aae63652d 100755 (executable)
@@ -500,10 +500,15 @@ SELECT event_queue_id, time_stamp FROM mail_{$type}_temp";
    * Test Mailing.gettokens.
    */
   public function testMailGetTokens() {
-    $description = "Demonstrates fetching tokens for one or more entities (in this case \"contact\" and \"mailing\").
+    $description = "Demonstrates fetching tokens for one or more entities (in this case \"Contact\" and \"Mailing\").
       Optionally pass sequential=1 to have output ready-formatted for the select2 widget.";
-    $result = $this->callAPIAndDocument($this->_entity, 'gettokens', array('entity' => array('contact', 'mailing')), __FUNCTION__, __FILE__, $description);
-    $this->assertContains('Contact Type', $result);
+    $result = $this->callAPIAndDocument($this->_entity, 'gettokens', array('entity' => array('Contact', 'Mailing')), __FUNCTION__, __FILE__, $description);
+    $this->assertContains('Contact Type', $result['values']);
+
+    // Check that passing "sequential" correctly outputs a hierarchical array
+    $result = $this->callAPISuccess($this->_entity, 'gettokens', array('entity' => 'contact', 'sequential' => 1));
+    $this->assertArrayHasKey('text', $result['values'][0]);
+    $this->assertArrayHasKey('id', $result['values'][0]['children'][0]);
   }
 
   //@ todo tests below here are all failure tests which are not hugely useful - need success tests