X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FContribute%2FForm%2FTask%2FEmail.php;h=da4b638b3620fdd5b3ab39f2cd3792618351abad;hb=6ebfc7fe1dcb98ea1b324ad6309826468d5e9923;hp=db83653ea539ae59a7434ed8ad75b5f65fe69582;hpb=d3d177bc353303ae1424d3417750fe86861132e6;p=civicrm-core.git diff --git a/CRM/Contribute/Form/Task/Email.php b/CRM/Contribute/Form/Task/Email.php index db83653ea5..da4b638b36 100644 --- a/CRM/Contribute/Form/Task/Email.php +++ b/CRM/Contribute/Form/Task/Email.php @@ -15,6 +15,8 @@ * @copyright CiviCRM LLC https://civicrm.org/licensing */ +use Civi\Api4\Contribution; + /** * This class provides the functionality to email a group of contacts. */ @@ -33,14 +35,34 @@ class CRM_Contribute_Form_Task_Email extends CRM_Contribute_Form_Task { } /** - * List available tokens for this form. + * Get the result rows to email. * * @return array + * + * @throws \API_Exception + * @throws \CRM_Core_Exception */ - public function listTokens() { - $tokens = CRM_Core_SelectValues::contactTokens(); - $tokens = array_merge(CRM_Core_SelectValues::contributionTokens(), $tokens); - return $tokens; + protected function getRows(): array { + $contributionDetails = Contribution::get(FALSE) + ->setSelect(['contact_id', 'id']) + ->addWhere('id', 'IN', $this->getContributionIDs()) + ->execute() + // Note that this indexing means that only the last + // contribution per contact is resolved to tokens. + // this is long-standing functionality, albeit possibly + // not thought through. + ->indexBy('contact_id'); + + // format contact details array to handle multiple emails from same contact + $formattedContactDetails = []; + foreach ($this->getEmails() as $details) { + $formattedContactDetails[$details['contact_id'] . '::' . $details['email']] = $details; + if (!empty($contributionDetails[$details['contact_id']])) { + $formattedContactDetails[$details['contact_id'] . '::' . $details['email']]['schema'] = ['contributionId' => $contributionDetails[$details['contact_id']]['id']]; + } + + } + return $formattedContactDetails; } }