From c7ab366b9126babdc164e01cbc21dc840f8fe6e6 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Thu, 9 Sep 2021 15:38:35 -0700 Subject: [PATCH] (REF) TokenProcessor - Use preg_replace_callback() instead of strtr() This will allow more complicated token expressions. --- Civi/Token/TokenProcessor.php | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Civi/Token/TokenProcessor.php b/Civi/Token/TokenProcessor.php index 7a03860453..e614ba6408 100644 --- a/Civi/Token/TokenProcessor.php +++ b/Civi/Token/TokenProcessor.php @@ -360,22 +360,26 @@ class TokenProcessor { $row->fill($message['format']); $useSmarty = !empty($row->context['smarty']); - /** - *@FIXME preg_callback. - */ $tokens = $this->rowValues[$row->tokenRow][$message['format']]; - $flatTokens = []; - \CRM_Utils_Array::flatten($tokens, $flatTokens, '', '.'); - $filteredTokens = []; - foreach ($flatTokens as $k => $v) { - $filteredTokens['{' . $k . '}'] = ($useSmarty ? \CRM_Utils_Token::tokenEscapeSmarty($v) : $v); - } + $getToken = function($m) use ($tokens, $useSmarty) { + [$full, $entity, $field] = $m; + if (isset($tokens[$entity][$field])) { + $v = $tokens[$entity][$field]; + if ($useSmarty) { + $v = \CRM_Utils_Token::tokenEscapeSmarty($v); + } + return $v; + } + return $full; + }; $event = new TokenRenderEvent($this); $event->message = $message; $event->context = $row->context; $event->row = $row; - $event->string = strtr($message['string'], $filteredTokens); + // Regex examples: '{foo.bar}' + // Regex counter-examples: '{foobar}', '{foo bar}', '{$foo.bar}', '{$foo.bar|whiz}' + $event->string = preg_replace_callback(';\{(\w+)\.(\w+)\};', $getToken, $message['string']); $this->dispatcher->dispatch('civi.token.render', $event); return $event->string; } -- 2.25.1