Fix values passed to tokenValues hook
authorMatthew Wire <mjw@mjwconsult.co.uk>
Mon, 24 Feb 2020 15:30:16 +0000 (15:30 +0000)
committerMatthew Wire <mjw@mjwconsult.co.uk>
Sun, 5 Apr 2020 15:13:41 +0000 (16:13 +0100)
CRM/Contact/Form/Task/Label.php
CRM/Contact/Form/Task/LabelCommon.php
CRM/Mailing/BAO/Mailing.php
CRM/Mailing/Page/Preview.php
CRM/Utils/Hook.php
CRM/Utils/Token.php
Civi/Token/TokenCompatSubscriber.php

index 02e73d127dd130768820b7422d418787f54dffa1..92252cad4b5439a99dff6d7c8959767dfe876b0a 100644 (file)
@@ -204,6 +204,7 @@ class CRM_Contact_Form_Task_Label extends CRM_Contact_Form_Task {
     $details = $query->apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts, TRUE, FALSE, TRUE, CRM_Contact_BAO_Query::MODE_CONTACTS, NULL, $primaryLocationOnly);
     $messageToken = CRM_Utils_Token::getTokens($mailingFormat);
 
+    // $details[0] is an array of [ contactID => contactDetails ]
     // also get all token values
     CRM_Utils_Hook::tokenValues($details[0],
       $this->_contactIds,
index ddc289154d04f0b7e39dbb9806778ec6a04ee8de..c0c561ff26483de14980692186a73307d302bcb4 100644 (file)
@@ -140,6 +140,7 @@ class CRM_Contact_Form_Task_LabelCommon {
     $details = $query->apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts);
 
     $messageToken = CRM_Utils_Token::getTokens($mailingFormat);
+    // $details[0] is an array of [ contactID => contactDetails ]
     $details = $details[0];
     $tokenFields = CRM_Contact_Form_Task_LabelCommon::getTokenData($details);
 
index 4951fe4bea9cbdbedd6bff354a4da8627b0435b0..a2b20bcf32dd27d459df3020d808f00d6876a3e6 100644 (file)
@@ -1080,15 +1080,18 @@ ORDER BY   civicrm_email.is_bulkmail DESC
     elseif ($contactId === 0) {
       //anonymous user
       $contact = [];
-      CRM_Utils_Hook::tokenValues($contact, $contactId, $job_id);
+      CRM_Utils_Hook::tokenValues($contact, [$contactId], $job_id);
     }
     else {
       $params = [['contact_id', '=', $contactId, 0, 0]];
       list($contact) = CRM_Contact_BAO_Query::apiQuery($params);
+      // $contact is an array of [ contactID => contactDetails ]
 
-      //CRM-4524
-      $contact = reset($contact);
+      // also call the hook to get contact details
+      CRM_Utils_Hook::tokenValues($contact, [$contactId], $job_id);
 
+      // Don't send if contact doesn't exist
+      $contact = reset($contact);
       if (!$contact || is_a($contact, 'CRM_Core_Error')) {
         CRM_Core_Error::debug_log_message(ts('CiviMail will not send email to a non-existent contact: %1',
           [1 => $contactId]
@@ -1098,9 +1101,6 @@ ORDER BY   civicrm_email.is_bulkmail DESC
         $res = NULL;
         return $res;
       }
-
-      // also call the hook to get contact details
-      CRM_Utils_Hook::tokenValues($contact, $contactId, $job_id);
     }
 
     $pTemplates = $this->getPreparedTemplates();
index 97a15798c4c1b6933480b4ad31b8dc2c89b43eae..4d7981481d4032ffd36b89b1ef16fde5afd0616a 100644 (file)
@@ -66,7 +66,7 @@ class CRM_Mailing_Page_Preview extends CRM_Core_Page {
       $mailing->getFlattenedTokens(),
       get_class($this)
     );
-
+    // $details[0] is an array of [ contactID => contactDetails ]
     $mime = &$mailing->compose(NULL, NULL, NULL, $session->get('userID'), $fromEmail, $fromEmail,
       TRUE, $details[0][$session->get('userID')], $attachments
     );
index 0d09ab914bfc3b1e0304f37cfb0414eeaa7d70c7..87c4e98c7fa8dc9467085e86ccc71742ea68456e 100644 (file)
@@ -884,7 +884,7 @@ abstract class CRM_Utils_Hook {
    * tokens returned by the 'tokens' hook
    *
    * @param array $details
-   *   The array to store the token values indexed by contactIDs (unless it a single).
+   *   The array to store the token values indexed by contactIDs.
    * @param array $contactIDs
    *   An array of contactIDs.
    * @param int $jobID
index 6dd024553fa07ee8d64152ba2bffb7402b33cb8f..afb69333b6f4463c063e08b2436d697e0c8edca7 100644 (file)
@@ -1228,7 +1228,6 @@ class CRM_Utils_Token {
     }
 
     $details = CRM_Contact_BAO_Query::apiQuery($params, $returnProperties, NULL, NULL, 0, count($contactIDs), TRUE, FALSE, TRUE, CRM_Contact_BAO_Query::MODE_CONTACTS, NULL, TRUE);
-
     $contactDetails = &$details[0];
 
     foreach ($contactIDs as $contactID) {
@@ -1263,8 +1262,9 @@ class CRM_Utils_Token {
       }
     }
 
+    // $contactDetails = &$details[0] = is an array of [ contactID => contactDetails ]
     // also call a hook and get token details
-    CRM_Utils_Hook::tokenValues($details[0],
+    CRM_Utils_Hook::tokenValues($contactDetails,
       $contactIDs,
       $jobID,
       $tokens,
@@ -1291,9 +1291,7 @@ class CRM_Utils_Token {
    * @return array
    *   contactDetails with hooks swapped out
    */
-  public static function getAnonymousTokenDetails($contactIDs = [
-    0,
-  ],
+  public static function getAnonymousTokenDetails($contactIDs = [0],
                                            $returnProperties = NULL,
                                            $skipOnHold = TRUE,
                                            $skipDeceased = TRUE,
index 45a81fb174bef59b4b1e954124f773e89ba90db5..ae8a55f616652c890b199343a11f72ac64c8d5bc 100644 (file)
@@ -89,12 +89,9 @@ class TokenCompatSubscriber implements EventSubscriberInterface {
         $contact = array_merge($contact, $row->context['tmpTokenParams']);
       }
 
-      $contactArray = !is_array($contactId) ? [$contactId => $contact] : $contact;
-
-      // Note: This is a small contract change from the past; data should be missing
-      // less randomly.
+      $contactArray = [$contactId => $contact];
       \CRM_Utils_Hook::tokenValues($contactArray,
-        (array) $contactId,
+        [$contactId],
         empty($row->context['mailingJobId']) ? NULL : $row->context['mailingJobId'],
         $messageTokens,
         $row->context['controller']