Merge pull request #18612 from mattwire/tokenprocessorsimplify
authorMatthew Wire <mjw@mjwconsult.co.uk>
Sun, 29 Nov 2020 15:30:37 +0000 (15:30 +0000)
committerGitHub <noreply@github.com>
Sun, 29 Nov 2020 15:30:37 +0000 (15:30 +0000)
REF Simplify tokenProcessor code

CRM/Activity/Tokens.php
CRM/Core/TokenTrait.php

index 250f88a38dcdaae418f169cd54d15fdabfa33742..93dad6fc11de66be784cf2bd707009b2eb66d037 100644 (file)
@@ -56,7 +56,8 @@ class CRM_Activity_Tokens extends \Civi\Token\AbstractTokenSubscriber {
 
   /**
    * Mapping from tokenName to api return field
-   * Use lists since we might need multiple fields
+   * Using arrays allows more complex tokens to be handled that require more than one API field.
+   * For example, an address token might want ['street_address', 'city', 'postal_code']
    *
    * @var array
    */
@@ -132,37 +133,37 @@ class CRM_Activity_Tokens extends \Civi\Token\AbstractTokenSubscriber {
     // Get ActivityID either from actionSearchResult (for scheduled reminders) if exists
     $activityId = $row->context['actionSearchResult']->entityID ?? $row->context[$this->getEntityContextSchema()];
 
-    $activity = (object) $prefetch['activity'][$activityId];
+    $activity = $prefetch['activity'][$activityId];
 
     if (in_array($field, ['activity_date_time', 'created_date', 'modified_date'])) {
-      $row->tokens($entity, $field, \CRM_Utils_Date::customFormat($activity->$field));
+      $row->tokens($entity, $field, \CRM_Utils_Date::customFormat($activity[$field]));
     }
-    elseif (isset($mapping[$field]) and (isset($activity->{$mapping[$field]}))) {
-      $row->tokens($entity, $field, $activity->{$mapping[$field]});
+    elseif (isset($mapping[$field]) and (isset($activity[$mapping[$field]]))) {
+      $row->tokens($entity, $field, $activity[$mapping[$field]]);
     }
     elseif (in_array($field, ['activity_type'])) {
-      $row->tokens($entity, $field, $this->activityTypes[$activity->activity_type_id]);
+      $row->tokens($entity, $field, $this->activityTypes[$activity['activity_type_id']]);
     }
     elseif (in_array($field, ['status'])) {
-      $row->tokens($entity, $field, $this->activityStatuses[$activity->status_id]);
+      $row->tokens($entity, $field, $this->activityStatuses[$activity['status_id']]);
     }
     elseif (in_array($field, ['campaign'])) {
-      $row->tokens($entity, $field, $this->campaigns[$activity->campaign_id]);
+      $row->tokens($entity, $field, $this->campaigns[$activity['campaign_id']]);
     }
     elseif (in_array($field, ['case_id'])) {
       // An activity can be linked to multiple cases so case_id is always an array.
       // We just return the first case ID for the token.
-      $row->tokens($entity, $field, is_array($activity->case_id) ? reset($activity->case_id) : $activity->case_id);
+      $row->tokens($entity, $field, is_array($activity['case_id']) ? reset($activity['case_id']) : $activity['case_id']);
     }
     elseif (array_key_exists($field, $this->customFieldTokens)) {
       $row->tokens($entity, $field,
-        isset($activity->$field)
-          ? \CRM_Core_BAO_CustomField::displayValue($activity->$field, $field)
+        isset($activity[$field])
+          ? \CRM_Core_BAO_CustomField::displayValue($activity[$field], $field)
           : ''
       );
     }
-    elseif (isset($activity->$field)) {
-      $row->tokens($entity, $field, $activity->$field);
+    elseif (isset($activity[$field])) {
+      $row->tokens($entity, $field, $activity[$field]);
     }
   }
 
index 26110155eff60f3b96140e65f0cd8087da1df0b5..a2940b23e6f5134318c72f97aea277d873e0c9ed 100644 (file)
@@ -51,16 +51,18 @@ trait CRM_Core_TokenTrait {
 
   /**
    * Find the fields that we need to get to construct the tokens requested.
-   * @param  array $tokens list of tokens
+   * @param  array $activeTokens list of active tokens
    * @return array         list of fields needed to generate those tokens
    */
-  public function getReturnFields($tokens) {
+  public function getReturnFields($activeTokens) {
     // Make sure we always return something
     $fields = ['id'];
 
-    foreach (array_intersect($tokens,
+    $tokensInUse = array_intersect(
+      $activeTokens,
       array_merge(array_keys(self::getBasicTokens()), array_keys(self::getCustomFieldTokens()))
-             ) as $token) {
+    );
+    foreach ($tokensInUse as $token) {
       if (isset(self::$fieldMapping[$token])) {
         $fields = array_merge($fields, self::$fieldMapping[$token]);
       }