dev/core#2344 fix regression affecting sending thank you letters when grouped
authoreileen <emcnaughton@wikimedia.org>
Mon, 1 Feb 2021 04:49:46 +0000 (17:49 +1300)
committereileen <emcnaughton@wikimedia.org>
Mon, 1 Feb 2021 04:49:46 +0000 (17:49 +1300)
CRM/Contribute/Form/Task/PDFLetterCommon.php
CRM/Utils/Token.php

index ae64f85c56b4dda76e2fb3eba0d68115dffee70f..eefb0cb7333a115fc3bba82f5c703d80c77c99db 100644 (file)
@@ -216,15 +216,18 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
    *   Does this letter represent more than one contribution.
    * @param string $separator
    *   What is the preferred letter separator.
+   * @param array $contributions
+   *
    * @return string
+   * @throws \CRM_Core_Exception
    */
-  private static function resolveTokens($html_message, $contact, $contribution, $messageToken, $grouped, $separator) {
+  private static function resolveTokens(string $html_message, $contact, $contribution, $messageToken, $grouped, $separator, $contributions): string {
     $categories = self::getTokenCategories();
     $domain = CRM_Core_BAO_Domain::getDomain();
     $tokenHtml = CRM_Utils_Token::replaceDomainTokens($html_message, $domain, TRUE, $messageToken);
     $tokenHtml = CRM_Utils_Token::replaceContactTokens($tokenHtml, $contact, TRUE, $messageToken);
     if ($grouped) {
-      $tokenHtml = CRM_Utils_Token::replaceMultipleContributionTokens($separator, $tokenHtml, $contribution, TRUE, $messageToken);
+      $tokenHtml = CRM_Utils_Token::replaceMultipleContributionTokens($separator, $tokenHtml, $contributions, $messageToken);
     }
     else {
       // no change to normal behaviour to avoid risk of breakage
@@ -340,7 +343,7 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
   public static function assignCombinedContributionValues($contact, $contributions, $groupBy, $groupByID) {
     CRM_Core_Smarty::singleton()->assign('contact_aggregate', $contact['contact_aggregate']);
     CRM_Core_Smarty::singleton()
-      ->assign('contributions', array_intersect_key($contributions, $contact['contribution_ids'][$groupBy][$groupByID]));
+      ->assign('contributions', $contributions);
     CRM_Core_Smarty::singleton()->assign('contribution_aggregate', $contact['aggregates'][$groupBy][$groupByID]);
 
   }
@@ -417,12 +420,14 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
    * @param int $groupByID
    *
    * @return string
+   * @throws \CRM_Core_Exception
    */
   protected static function generateHtml(&$contact, $contribution, $groupBy, $contributions, $realSeparator, $tableSeparators, $messageToken, $html_message, $separator, $grouped, $groupByID) {
     static $validated = FALSE;
     $html = NULL;
 
-    self::assignCombinedContributionValues($contact, $contributions, $groupBy, $groupByID);
+    $groupedContributions = array_intersect_key($contributions, $contact['contribution_ids'][$groupBy][$groupByID]);
+    self::assignCombinedContributionValues($contact, $groupedContributions, $groupBy, $groupByID);
 
     if (empty($groupBy) || empty($contact['is_sent'][$groupBy][$groupByID])) {
       if (!$validated && in_array($realSeparator, $tableSeparators) && !self::isValidHTMLWithTableSeparator($messageToken, $html_message)) {
@@ -430,7 +435,7 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
         CRM_Core_Session::setStatus(ts('You have selected the table cell separator, but one or more token fields are not placed inside a table cell. This would result in invalid HTML, so comma separators have been used instead.'));
       }
       $validated = TRUE;
-      $html = str_replace($separator, $realSeparator, self::resolveTokens($html_message, $contact, $contribution, $messageToken, $grouped, $separator));
+      $html = str_replace($separator, $realSeparator, self::resolveTokens($html_message, $contact, $contribution, $messageToken, $grouped, $separator, $groupedContributions));
     }
 
     return $html;
index 4e7633cb32d43cefb7ee7e1696d16df4868707a4..a836ab52110d790ed0eb9340461b37d33d9a5b41 100644 (file)
@@ -1706,28 +1706,20 @@ class CRM_Utils_Token {
    *
    * @param string $separator
    * @param string $str
-   * @param array $contribution
-   * @param bool|string $html
-   * @param string $knownTokens
-   * @param bool|string $escapeSmarty
+   * @param array $contributions
+   * @param array $knownTokens
    *
    * @return string
    */
-  public static function replaceMultipleContributionTokens($separator, $str, &$contribution, $html = FALSE, $knownTokens = NULL, $escapeSmarty = FALSE) {
-    if (empty($knownTokens['contribution'])) {
-      return $str;
-    }
-
-    if (in_array('receive_date', $knownTokens['contribution'])) {
-      $formattedDates = [];
-      $dates = explode($separator, $contribution['receive_date']);
-      foreach ($dates as $date) {
-        $formattedDates[] = CRM_Utils_Date::customFormat($date, NULL, ['j', 'm', 'Y']);
+  public static function replaceMultipleContributionTokens(string $separator, string $str, array $contributions, array $knownTokens): string {
+    foreach ($knownTokens['contribution'] ?? [] as $token) {
+      $resolvedTokens = [];
+      foreach ($contributions as $contribution) {
+        $resolvedTokens[] = self::replaceContributionTokens('{contribution.' . $token . '}', $contribution, FALSE, $knownTokens);
       }
-      $str = str_replace("{contribution.receive_date}", implode($separator, $formattedDates), $str);
-      unset($knownTokens['contribution']['receive_date']);
+      $str = self::token_replace('contribution', $token, implode($separator, $resolvedTokens), $str);
     }
-    return self::replaceContributionTokens($str, $contribution, $html, $knownTokens, $escapeSmarty);
+    return $str;
   }
 
   /**