From f10c962ea052371f0041a99c4190f6d9c055e6c0 Mon Sep 17 00:00:00 2001 From: Matthew Wire Date: Sat, 26 Sep 2020 18:55:38 +0100 Subject: [PATCH] Simplify tokenProcessor code for activities --- CRM/Activity/Tokens.php | 27 ++++++++++++++------------- CRM/Core/TokenTrait.php | 10 ++++++---- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/CRM/Activity/Tokens.php b/CRM/Activity/Tokens.php index 250f88a38d..93dad6fc11 100644 --- a/CRM/Activity/Tokens.php +++ b/CRM/Activity/Tokens.php @@ -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]); } } diff --git a/CRM/Core/TokenTrait.php b/CRM/Core/TokenTrait.php index 26110155ef..a2940b23e6 100644 --- a/CRM/Core/TokenTrait.php +++ b/CRM/Core/TokenTrait.php @@ -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]); } -- 2.25.1