*/
use Civi\Api4\ActivityContact;
+use Civi\Api4\Contribution;
/**
*
* @param $html
* @param string $emailAddress
* Use this 'to' email address instead of the default Primary address.
- * @param int $userID
+ * @param int|null $userID
* Use this userID if set.
- * @param string $from
- * @param array $attachments
+ * @param string|null $from
+ * @param array|null $attachments
* The array of attachments if any.
- * @param string $cc
+ * @param string|null $cc
* Cc recipient.
- * @param string $bcc
+ * @param string|null $bcc
* Bcc recipient.
- * @param array $contactIds
- * Contact ids.
- * @param string $additionalDetails
+ * @param array|null $contactIds
+ * unused.
+ * @param string|null $additionalDetails
* The additional information of CC and BCC appended to the activity Details.
- * @param array $contributionIds
- * @param int $campaignId
- * @param int $caseId
+ * @param array|null $contributionIds
+ * @param int|null $campaignId
+ * @param int|null $caseId
*
* @return array
* bool $sent FIXME: this only indicates the status of the last email sent.
* array $activityIds The activity ids created, one per "To" recipient.
*
+ * @throws \API_Exception
* @throws \CRM_Core_Exception
- * @throws \CiviCRM_API3_Exception
*/
public static function sendEmail(
$contactDetails,
$userID = CRM_Core_Session::getLoggedInContactID();
}
- list($fromDisplayName, $fromEmail, $fromDoNotEmail) = CRM_Contact_BAO_Contact::getContactDetails($userID);
+ [$fromDisplayName, $fromEmail, $fromDoNotEmail] = CRM_Contact_BAO_Contact::getContactDetails($userID);
if (!$fromEmail) {
return [count($contactDetails), 0, count($contactDetails)];
}
$fromDisplayName = $fromEmail;
}
- // CRM-4575
- // token replacement of addressee/email/postal greetings
- // get the tokens added in subject and message
- $subjectToken = CRM_Utils_Token::getTokens($subject);
- $messageToken = CRM_Utils_Token::getTokens($text);
- $messageToken = array_merge($messageToken, CRM_Utils_Token::getTokens($html));
- $allTokens = CRM_Utils_Array::crmArrayMerge($messageToken, $subjectToken);
-
if (!$from) {
$from = "$fromDisplayName <$fromEmail>";
}
- $escapeSmarty = FALSE;
- if (defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY) {
- $smarty = CRM_Core_Smarty::singleton();
- $escapeSmarty = TRUE;
- }
-
$contributionDetails = [];
if (!empty($contributionIds)) {
- $contributionDetails = CRM_Contribute_BAO_Contribution::replaceContributionTokens(
- $contributionIds,
- $subject,
- $subjectToken,
- $text,
- $html,
- $messageToken,
- $escapeSmarty
- );
+ $contributionDetails = Contribution::get(FALSE)
+ ->setSelect(['contact_id'])
+ ->addWhere('id', 'IN', $contributionIds)
+ ->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');
}
$sent = $notSent = [];
$activityIds = [];
$firstActivityCreated = FALSE;
foreach ($contactDetails as $values) {
+ $tokenContext = $caseId ? ['caseId' => $caseId] : [];
$contactId = $values['contact_id'];
$emailAddress = $values['email'];
if (!empty($contributionDetails)) {
- $subject = $contributionDetails[$contactId]['subject'];
- $text = $contributionDetails[$contactId]['text'];
- $html = $contributionDetails[$contactId]['html'];
+ $tokenContext['contributionId'] = $contributionDetails[$contactId]['id'];
}
$tokenSubject = $subject;
'msg_html' => $tokenHtml,
'msg_subject' => $tokenSubject,
],
- 'tokenContext' => $caseId ? ['caseId' => $caseId] : [],
+ 'tokenContext' => $tokenContext,
'contactId' => $contactId,
'disableSmarty' => !CRM_Utils_Constant::value('CIVICRM_MAIL_SMARTY'),
]);
// get token details for contacts, call only if tokens are used
$tokenDetails = [];
if (!empty($returnProperties) || !empty($tokens)) {
- list($tokenDetails) = CRM_Utils_Token::getTokenDetails($contactIds,
+ [$tokenDetails] = CRM_Utils_Token::getTokenDetails($contactIds,
$returnProperties,
NULL, NULL, FALSE,
$messageToken,
$cc = NULL,
$bcc = NULL
) {
- list($toDisplayName, $toEmail, $toDoNotEmail) = CRM_Contact_BAO_Contact::getContactDetails($toID);
+ [$toDisplayName, $toEmail, $toDoNotEmail] = CRM_Contact_BAO_Contact::getContactDetails($toID);
if ($emailAddress) {
$toEmail = trim($emailAddress);
}
}
if ($entityObj->owner_membership_id) {
- list($displayName) = CRM_Contact_BAO_Contact::getDisplayAndImage(CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $entityObj->owner_membership_id, 'contact_id'));
+ [$displayName] = CRM_Contact_BAO_Contact::getDisplayAndImage(CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $entityObj->owner_membership_id, 'contact_id'));
$subject .= sprintf(' (by %s)', $displayName);
}
public function testEmailTokens(): void {
Civi::settings()->set('max_attachments', 0);
$contact1 = $this->individualCreate();
- $contact2 = $this->individualCreate();
+ $contact2 = $this->individualCreate(['first_name' => 'Elton']);
$userID = $this->createLoggedInUser();
+ $mut = new CiviMailUtils($this);
Civi::settings()->set('allow_mail_from_logged_in_contact', TRUE);
$this->callAPISuccess('Email', 'create', [
'contact_id' => $userID,
'signature_html' => 'Benny, Benny',
'is_primary' => 1,
]);
- $contribution1 = $this->contributionCreate(['contact_id' => $contact2]);
- $contribution2 = $this->contributionCreate(['total_amount' => 999, 'contact_id' => $contact1]);
+ $contribution1 = $this->contributionCreate(['contact_id' => $contact2, 'invoice_number' => 'soy']);
+ $contribution2 = $this->contributionCreate(['total_amount' => 999, 'contact_id' => $contact1, 'invoice_number' => 'saucy']);
+ $contribution3 = $this->contributionCreate(['total_amount' => 999, 'contact_id' => $contact1, 'invoice_number' => 'ranch']);
$form = $this->getFormObject('CRM_Contribute_Form_Task_Email', [
'cc_id' => '',
'bcc_id' => '',
$contact1 . '::teresajensen-nielsen65@spamalot.co.in',
$contact2 . '::bob@example.com',
]),
- 'subject' => '{contact.display_name}',
- 'text_message' => '{contribution.total_amount}',
+ 'subject' => '{contact.display_name} {contribution.total_amount}',
+ 'text_message' => '{contribution.financial_type_id:label} {contribution.invoice_number}',
'html_message' => '{domain.name}',
], [], [
'radio_ts' => 'ts_sel',
'task' => CRM_Core_Task::TASK_EMAIL,
'mark_x_' . $contribution1 => 1,
'mark_x_' . $contribution2 => 1,
+ 'mark_x_' . $contribution3 => 1,
]);
$form->set('cid', $contact1 . ',' . $contact2);
$form->buildForm();
$this->assertEquals('<br/><br/>--Benny, Benny', $form->_defaultValues['html_message']);
$form->postProcess();
+ $mut->assertSubjects(['Mr. Anthony Anderson II $ 999.00', 'Mr. Elton Anderson II $ 100.00']);
+ $mut->checkAllMailLog([
+ 'Subject: Mr. Anthony Anderson II',
+ '$ 999.0',
+ 'Default Domain Name',
+ 'Donation soy',
+ 'Donation ranch',
+ ]);
}
}