From 32b856d78250af55f510029dcfe6cf7c01f8ce63 Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Fri, 15 Oct 2021 09:10:25 +1300 Subject: [PATCH] Fix token metadata to be clearable outside tests --- CRM/Contact/Tokens.php | 23 +++++++++----------- CRM/Core/EntityTokens.php | 46 ++++++++++++++++++--------------------- 2 files changed, 31 insertions(+), 38 deletions(-) diff --git a/CRM/Contact/Tokens.php b/CRM/Contact/Tokens.php index 6fa88a0759..a713d8cc25 100644 --- a/CRM/Contact/Tokens.php +++ b/CRM/Contact/Tokens.php @@ -369,37 +369,34 @@ class CRM_Contact_Tokens extends CRM_Core_EntityTokens { * @noinspection PhpUnhandledExceptionInspection */ protected function getTokenMetadata(): array { - if ($this->tokensMetadata) { - return $this->tokensMetadata; - } if (Civi::cache('metadata')->has($this->getCacheKey())) { return Civi::cache('metadata')->get($this->getCacheKey()); } $this->fieldMetadata = (array) civicrm_api4('Contact', 'getfields', ['checkPermissions' => FALSE], 'name'); - $this->tokensMetadata = $this->getBespokeTokens(); + $tokensMetadata = $this->getBespokeTokens(); foreach ($this->fieldMetadata as $field) { - $this->addFieldToTokenMetadata($field, $this->getExposedFields()); + $this->addFieldToTokenMetadata($tokensMetadata, $field, $this->getExposedFields()); } foreach ($this->getRelatedEntityTokenMetadata() as $entity => $exposedFields) { $apiEntity = ($entity === 'openid') ? 'OpenID' : ucfirst($entity); $metadata = (array) civicrm_api4($apiEntity, 'getfields', ['checkPermissions' => FALSE], 'name'); foreach ($metadata as $field) { - $this->addFieldToTokenMetadata($field, $exposedFields, 'primary_' . $entity); + $this->addFieldToTokenMetadata($tokensMetadata, $field, $exposedFields, 'primary_' . $entity); } } // Manually add in the abbreviated state province as that maps to // what has traditionally been delivered. - $this->tokensMetadata['primary_address.state_province_id:abbr'] = $this->tokensMetadata['primary_address.state_province_id:label']; - $this->tokensMetadata['primary_address.state_province_id:abbr']['name'] = 'state_province_id:abbr'; - $this->tokensMetadata['primary_address.state_province_id:abbr']['audience'] = 'user'; + $tokensMetadata['primary_address.state_province_id:abbr'] = $tokensMetadata['primary_address.state_province_id:label']; + $tokensMetadata['primary_address.state_province_id:abbr']['name'] = 'state_province_id:abbr'; + $tokensMetadata['primary_address.state_province_id:abbr']['audience'] = 'user'; // Hide the label for now because we are not sure if there are paths // where legacy token resolution is in play where this could not be resolved. - $this->tokensMetadata['primary_address.state_province_id:label']['audience'] = 'sysadmin'; + $tokensMetadata['primary_address.state_province_id:label']['audience'] = 'sysadmin'; // Hide this really obscure one. Just cos it annoys me. - $this->tokensMetadata['primary_address.manual_geo_code:label']['audience'] = 'sysadmin'; - Civi::cache('metadata')->set($this->getCacheKey(), $this->tokensMetadata); - return $this->tokensMetadata; + $tokensMetadata['primary_address.manual_geo_code:label']['audience'] = 'sysadmin'; + Civi::cache('metadata')->set($this->getCacheKey(), $tokensMetadata); + return $tokensMetadata; } /** diff --git a/CRM/Core/EntityTokens.php b/CRM/Core/EntityTokens.php index 7f7b669959..563cc10a49 100644 --- a/CRM/Core/EntityTokens.php +++ b/CRM/Core/EntityTokens.php @@ -75,23 +75,18 @@ class CRM_Core_EntityTokens extends AbstractTokenSubscriber { * @return array */ protected function getTokenMetadata(): array { - if (empty($this->tokensMetadata)) { - $cacheKey = $this->getCacheKey(); - if (Civi::cache('metadata')->has($cacheKey)) { - $this->tokensMetadata = Civi::cache('metadata')->get($cacheKey); + $cacheKey = $this->getCacheKey(); + if (!Civi::cache('metadata')->has($cacheKey)) { + $tokensMetadata = $this->getBespokeTokens(); + foreach ($this->getFieldMetadata() as $field) { + $this->addFieldToTokenMetadata($tokensMetadata, $field, $this->getExposedFields()); } - else { - $this->tokensMetadata = $this->getBespokeTokens(); - foreach ($this->getFieldMetadata() as $field) { - $this->addFieldToTokenMetadata($field, $this->getExposedFields()); - } - foreach ($this->getHiddenTokens() as $name) { - $this->tokensMetadata[$name]['audience'] = 'hidden'; - } - Civi::cache('metadata')->set($cacheKey, $this->tokensMetadata); + foreach ($this->getHiddenTokens() as $name) { + $tokensMetadata[$name]['audience'] = 'hidden'; } + Civi::cache('metadata')->set($cacheKey, $tokensMetadata); } - return $this->tokensMetadata; + return Civi::cache('metadata')->get($cacheKey); } /** @@ -597,11 +592,12 @@ class CRM_Core_EntityTokens extends AbstractTokenSubscriber { /** * Add the token to the metadata based on the field spec. * + * @param array $tokensMetadata * @param array $field * @param array $exposedFields * @param string $prefix */ - protected function addFieldToTokenMetadata(array $field, array $exposedFields, string $prefix = ''): void { + protected function addFieldToTokenMetadata(array &$tokensMetadata, array $field, array $exposedFields, string $prefix = ''): void { if ($field['type'] !== 'Custom' && !in_array($field['name'], $exposedFields, TRUE)) { return; } @@ -623,7 +619,7 @@ class CRM_Core_EntityTokens extends AbstractTokenSubscriber { $parts = explode(': ', $field['label']); $field['title'] = "{$parts[1]} :: {$parts[0]}"; $tokenName = 'custom_' . $field['custom_field_id']; - $this->tokensMetadata[$tokenName] = $field; + $tokensMetadata[$tokenName] = $field; return; } $tokenName = $prefix ? ($prefix . '.' . $field['name']) : $field['name']; @@ -633,21 +629,21 @@ class CRM_Core_EntityTokens extends AbstractTokenSubscriber { // At the time of writing currency didn't have a label option - this may have changed. && !in_array($field['name'], $this->getCurrencyFieldName(), TRUE) ) { - $this->tokensMetadata[$tokenName . ':label'] = $this->tokensMetadata[$tokenName . ':name'] = $field; + $tokensMetadata[$tokenName . ':label'] = $tokensMetadata[$tokenName . ':name'] = $field; $fieldLabel = $field['input_attrs']['label'] ?? $field['label']; - $this->tokensMetadata[$tokenName . ':label']['name'] = $field['name'] . ':label'; - $this->tokensMetadata[$tokenName . ':name']['name'] = $field['name'] . ':name'; - $this->tokensMetadata[$tokenName . ':name']['audience'] = 'sysadmin'; - $this->tokensMetadata[$tokenName . ':label']['title'] = $fieldLabel; - $this->tokensMetadata[$tokenName . ':name']['title'] = ts('Machine name') . ': ' . $fieldLabel; + $tokensMetadata[$tokenName . ':label']['name'] = $field['name'] . ':label'; + $tokensMetadata[$tokenName . ':name']['name'] = $field['name'] . ':name'; + $tokensMetadata[$tokenName . ':name']['audience'] = 'sysadmin'; + $tokensMetadata[$tokenName . ':label']['title'] = $fieldLabel; + $tokensMetadata[$tokenName . ':name']['title'] = ts('Machine name') . ': ' . $fieldLabel; $field['audience'] = 'sysadmin'; } if ($field['data_type'] === 'Boolean') { - $this->tokensMetadata[$tokenName . ':label'] = $field; - $this->tokensMetadata[$tokenName . ':label']['name'] = $field['name'] . ':label'; + $tokensMetadata[$tokenName . ':label'] = $field; + $tokensMetadata[$tokenName . ':label']['name'] = $field['name'] . ':label'; $field['audience'] = 'sysadmin'; } - $this->tokensMetadata[$tokenName] = $field; + $tokensMetadata[$tokenName] = $field; } } -- 2.25.1