alternative way to handle custom field token
authordeb.monish <monish.deb@webaccessglobal.com>
Thu, 12 Jan 2017 14:29:17 +0000 (19:59 +0530)
committerdeb.monish <monish.deb@webaccessglobal.com>
Thu, 12 Jan 2017 15:50:49 +0000 (21:20 +0530)
CRM/Activity/Tokens.php
CRM/Contribute/Tokens.php
CRM/Event/Tokens.php
CRM/Member/Tokens.php
Civi/Token/AbstractTokenSubscriber.php
Civi/Token/TokenCompatSubscriber.php
Civi/Token/TokenRow.php

index ed487e2f114e9c1b90dabfce3ee899f94eea3024..94cbd4807c2d58660969e627717133c3052255f4 100644 (file)
@@ -49,12 +49,15 @@ class CRM_Activity_Tokens extends \Civi\Token\AbstractTokenSubscriber {
    * CRM_Activity_Tokens constructor.
    */
   public function __construct() {
-    parent::__construct('activity', array(
-      'activity_id' => ts('Activity ID'),
-      'activity_type' => ts('Activity Type'),
-      'subject' => ts('Activity Subject'),
-      'details' => ts('Activity Details'),
-      'activity_date_time' => ts('Activity Date-Time'),
+    parent::__construct('activity', array_merge(
+      array(
+        'activity_id' => ts('Activity ID'),
+        'activity_type' => ts('Activity Type'),
+        'subject' => ts('Activity Subject'),
+        'details' => ts('Activity Details'),
+        'activity_date_time' => ts('Activity Date-Time'),
+      ),
+      $this->getCustomTokens('Activity')
     ));
   }
 
@@ -107,6 +110,9 @@ class CRM_Activity_Tokens extends \Civi\Token\AbstractTokenSubscriber {
     elseif (isset($actionSearchResult->$field)) {
       $row->tokens($entity, $field, $actionSearchResult->$field);
     }
+    elseif (\CRM_Core_BAO_CustomField::getKeyID($field)) {
+      $row->customToken($entity, $field, $actionSearchResult->entity_id);
+    }
     else {
       $row->tokens($entity, $field, '');
     }
index c7fe1fdbda9a5aaf92677774a6359ad661398318..62dcbe5e516e3d14232c2b937f416b559f1128db 100644 (file)
@@ -85,6 +85,7 @@ class CRM_Contribute_Tokens extends \Civi\Token\AbstractTokenSubscriber {
     $tokens['source'] = ts('Contribution Source');
     $tokens['status'] = ts('Contribution Status');
     $tokens['type'] = ts('Financial Type');
+    $tokens = array_merge($tokens, $this->getCustomTokens('Contribution'));
     parent::__construct('contribution', $tokens);
   }
 
@@ -135,6 +136,9 @@ class CRM_Contribute_Tokens extends \Civi\Token\AbstractTokenSubscriber {
     elseif (isset($aliasTokens[$field])) {
       $row->dbToken($entity, $field, 'CRM_Contribute_BAO_Contribution', $aliasTokens[$field], $fieldValue);
     }
+    elseif (\CRM_Core_BAO_CustomField::getKeyID($field)) {
+      $row->customToken($entity, $field, $actionSearchResult->entity_id);
+    }
     else {
       $row->dbToken($entity, $field, 'CRM_Contribute_BAO_Contribution', $field, $fieldValue);
     }
index 2a502554405813ced5cf36641c7bf85184760b48..923a5414d5efa6ebd6abdce36b9d6319431f5529 100644 (file)
@@ -44,21 +44,24 @@ class CRM_Event_Tokens extends \Civi\Token\AbstractTokenSubscriber {
    * Class constructor.
    */
   public function __construct() {
-    parent::__construct('event', array(
-      'event_type' => ts('Event Type'),
-      'title' => ts('Event Title'),
-      'event_id' => ts('Event ID'),
-      'start_date' => ts('Event Start Date'),
-      'end_date' => ts('Event End Date'),
-      'summary' => ts('Event Summary'),
-      'description' => ts('Event Description'),
-      'location' => ts('Event Location'),
-      'info_url' => ts('Event Info URL'),
-      'registration_url' => ts('Event Registration URL'),
-      'fee_amount' => ts('Event Fee'),
-      'contact_email' => ts('Event Contact (Email)'),
-      'contact_phone' => ts('Event Contact (Phone)'),
-      'balance' => ts('Event Balance'),
+    parent::__construct('event', array_merge(
+      array(
+        'event_type' => ts('Event Type'),
+        'title' => ts('Event Title'),
+        'event_id' => ts('Event ID'),
+        'start_date' => ts('Event Start Date'),
+        'end_date' => ts('Event End Date'),
+        'summary' => ts('Event Summary'),
+        'description' => ts('Event Description'),
+        'location' => ts('Event Location'),
+        'info_url' => ts('Event Info URL'),
+        'registration_url' => ts('Event Registration URL'),
+        'fee_amount' => ts('Event Fee'),
+        'contact_email' => ts('Event Contact (Email)'),
+        'contact_phone' => ts('Event Contact (Phone)'),
+        'balance' => ts('Event Balance'),
+      ),
+      $this->getCustomTokens('Event')
     ));
   }
 
@@ -139,6 +142,9 @@ LEFT JOIN civicrm_phone phone ON phone.id = lb.phone_id
     elseif (isset($actionSearchResult->$field)) {
       $row->tokens($entity, $field, $actionSearchResult->$field);
     }
+    elseif (\CRM_Core_BAO_CustomField::getKeyID($field)) {
+      $row->customToken($entity, $field, $actionSearchResult->entity_id);
+    }
     else {
       $row->tokens($entity, $field, '');
     }
index 983ae100357f12f328247c37a8bf0a903cb6c17d..26adb29f485b4d0076ecda791b7a2800bfccad5a 100644 (file)
@@ -44,14 +44,17 @@ class CRM_Member_Tokens extends \Civi\Token\AbstractTokenSubscriber {
    * Class constructor.
    */
   public function __construct() {
-    parent::__construct('membership', array(
-      'fee' => ts('Membership Fee'),
-      'id' => ts('Membership ID'),
-      'join_date' => ts('Membership Join Date'),
-      'start_date' => ts('Membership Start Date'),
-      'end_date' => ts('Membership End Date'),
-      'status' => ts('Membership Status'),
-      'type' => ts('Membership Type'),
+    parent::__construct('membership', array_merge(
+      array(
+        'fee' => ts('Membership Fee'),
+        'id' => ts('Membership ID'),
+        'join_date' => ts('Membership Join Date'),
+        'start_date' => ts('Membership Start Date'),
+        'end_date' => ts('Membership End Date'),
+        'status' => ts('Membership Status'),
+        'type' => ts('Membership Type'),
+      ),
+      $this->getCustomTokens('Membership')
     ));
   }
 
@@ -95,6 +98,9 @@ class CRM_Member_Tokens extends \Civi\Token\AbstractTokenSubscriber {
     elseif (isset($actionSearchResult->$field)) {
       $row->tokens($entity, $field, $actionSearchResult->$field);
     }
+    elseif (\CRM_Core_BAO_CustomField::getKeyID($field)) {
+      $row->customToken($entity, $field, $actionSearchResult->entity_id);
+    }
     else {
       $row->tokens($entity, $field, '');
     }
index e0f712f4277b10baca56d9e3ce58c2a0ab6cbae5..1164032de84c384de0cb3d938fef5fd2c50829f5 100644 (file)
@@ -117,6 +117,22 @@ abstract class AbstractTokenSubscriber implements EventSubscriberInterface {
     }
   }
 
+  /**
+   * Get all custom field tokens of $entity
+   *
+   * @param string $entity
+   * @return array $customTokens
+   *   return custom field tokens in array('custom_N' => 'label') format
+   */
+  public function getCustomTokens($entity) {
+    $customTokens = array();
+    foreach (\CRM_Core_BAO_CustomField::getFields($entity) as $id => $info) {
+      $customTokens["custom_$id"] = $info['label'];
+    }
+
+    return $customTokens;
+  }
+
   /**
    * Alter the query which prepopulates mailing data
    * for scheduled reminders.
@@ -148,50 +164,16 @@ abstract class AbstractTokenSubscriber implements EventSubscriberInterface {
     }
 
     $activeTokens = array_intersect($messageTokens[$this->entity], array_keys($this->tokenNames));
-    $extraTokens = array_diff($messageTokens[$this->entity], array_keys($this->tokenNames));
 
     $prefetch = $this->prefetch($e);
 
     foreach ($e->getRows() as $row) {
-      $this->evaluateExtraToken($row, $this->entity, $extraTokens);
       foreach ((array) $activeTokens as $field) {
         $this->evaluateToken($row, $this->entity, $field, $prefetch);
       }
     }
   }
 
-  /**
-   * Populate the custom field and other remaining entity token data.
-   *
-   * @param TokenRow $row
-   *   The record for which we want token values.
-   * @param string $entity
-   *   The entity for which we want the token values
-   * @param array $tokens
-   *   The array of tokens whose data need to be fetched
-   */
-  public function evaluateExtraToken(TokenRow $row, $entity, $tokens) {
-    if (empty($tokens)) {
-      return;
-    }
-
-    $actionSearchResult = $row->context['actionSearchResult'];
-
-    try {
-      $result = civicrm_api3($entity, 'getsingle', array(
-        'id' => $actionSearchResult->entity_id,
-        'return' => $tokens,
-      ));
-    }
-    catch (CiviCRM_API3_Exception $e) {
-      return;
-    }
-
-    foreach ($tokens as $token) {
-      $row->tokens($entity, $token, \CRM_Utils_Array::value($token, $result, ''));
-    }
-  }
-
   /**
    * To perform a bulk lookup before rendering tokens, override this
    * function and return the prefetched data.
index 48d798491131c2090c532eca3fe00666b86a8cc7..7a2ce239a7c360c5ef68c3c221b91710fdf797be 100644 (file)
@@ -62,17 +62,12 @@ class TokenCompatSubscriber implements EventSubscriberInterface {
           throw new TokenException("Failed to generate token data. Invalid contact ID: " . $row->context['contactId']);
         }
 
-        $contactTokens = \CRM_Utils_Array::value('contact', $messageTokens);
-        if (!empty($contactTokens)) {
-          try {
-            $result = civicrm_api3('Contact', 'getsingle', array(
-              'id' => $contactId,
-              'return' => $contactTokens,
-            ));
-            $contact = array_merge($contact, $result);
-          }
-          catch (CiviCRM_API3_Exception $e) {
-            //do nothing
+        //update value of custom field token
+        if (!empty($messageTokens['contact'])) {
+          foreach ($messageTokens['contact'] as $token) {
+            if (\CRM_Core_BAO_CustomField::getKeyID($token)) {
+              $row->customToken('Contact', $token, $contactId);
+            }
           }
         }
       }
index 3c77f31d129afaa5b518ed671aa141de07195c28..1a3033a9aca1fba7524f8e4e0d93ba560a5d4754 100644 (file)
@@ -126,6 +126,22 @@ class TokenRow {
     return $this;
   }
 
+  /**
+   * Update the value of a custom field token.
+   *
+   * @param string $entity
+   * @param string $fieldName
+   * @param string $entityID
+   * @return TokenRow
+   */
+  public function customToken($entity, $fieldName, $entityID) {
+    $fieldValue = civicrm_api3($entity, 'getvalue', array(
+      'return' => $fieldName,
+      'id' => $entityID,
+    ));
+    return $this->tokens($entity, $fieldName, $fieldValue);
+  }
+
   /**
    * Update the value of a token. Apply formatting based on DB schema.
    *