*/
public $_templates;
+ /**
+ * Email addresses to send to.
+ *
+ * @var array
+ */
+ protected $emails = [];
+
/**
* Store "to" contact details.
* @var array
// are having to re-write contactIds afterwards due to this inappropriate variable setting
// If we don't have any contact IDs, use the logged in contact ID
$form->_contactIds = $form->_contactIds ?: [CRM_Core_Session::getLoggedInContactID()];
-
- $fromEmailValues = CRM_Core_BAO_Email::getFromEmail();
-
- if (empty($fromEmailValues)) {
- CRM_Core_Error::statusBounce(ts('Your user record does not have a valid email address and no from addresses have been configured.'));
- }
-
- $form->_emails = $fromEmailValues;
- $defaults = [];
- $form->_fromEmails = $fromEmailValues;
- if (is_numeric(key($form->_fromEmails))) {
- $emailID = (int) key($form->_fromEmails);
- $defaults = CRM_Core_BAO_Email::getEmailSignatureDefaults($emailID);
- }
- if (!Civi::settings()->get('allow_mail_from_logged_in_contact')) {
- $defaults['from_email_address'] = current(CRM_Core_BAO_Domain::getNameAndEmail(FALSE, TRUE));
- }
- $form->setDefaults($defaults);
}
/**
if ($to->getValue()) {
foreach ($this->getEmails($to) as $value) {
$contactId = $value['contact_id'];
- $email = $value['email'];
if ($contactId) {
$this->_contactIds[] = $this->_toContactIds[] = $contactId;
- $this->_toContactEmails[] = $email;
$this->_allContactIds[] = $contactId;
}
}
$this->add('text', 'subject', ts('Subject'), ['size' => 50, 'maxlength' => 254], TRUE);
- $this->add('select', 'from_email_address', ts('From'), $this->_fromEmails, TRUE);
+ $this->add('select', 'from_email_address', ts('From'), $this->getFromEmails(), TRUE);
CRM_Mailing_BAO_Mailing::commonCompose($this);
$session = CRM_Core_Session::singleton();
$session->replaceUserContext($url);
- $this->addDefaultButtons(ts('Send Email'), 'upload', 'cancel');
- }
- else {
- $this->addDefaultButtons(ts('Send Email'), 'upload');
}
+ $this->addDefaultButtons(ts('Send Email'), 'upload', 'cancel');
$fields = [
'followup_assignee_contact_id' => [
CRM_Core_Resources::singleton()->addScriptFile('civicrm', 'templates/CRM/Contact/Form/Task/EmailCommon.js', 0, 'html-header');
}
+ /**
+ * Set relevant default values.
+ *
+ * @return array
+ *
+ * @throws \API_Exception
+ * @throws \CRM_Core_Exception
+ */
+ public function setDefaultValues(): array {
+ $defaults = parent::setDefaultValues();
+ $fromEmails = $this->getFromEmails();
+ if (is_numeric(key($fromEmails))) {
+ $emailID = (int) key($fromEmails);
+ $defaults = CRM_Core_BAO_Email::getEmailSignatureDefaults($emailID);
+ }
+ if (!Civi::settings()->get('allow_mail_from_logged_in_contact')) {
+ $defaults['from_email_address'] = current(CRM_Core_BAO_Domain::getNameAndEmail(FALSE, TRUE));
+ }
+ return $defaults;
+ }
+
/**
* Process the form after the input has been submitted and validated.
*
*/
public function postProcess() {
$this->bounceIfSimpleMailLimitExceeded(count($this->_contactIds));
-
- // check and ensure that
$formValues = $this->controller->exportValues($this->getName());
$this->submit($formValues);
}
* @param int $count
* The number of emails the user is attempting to send
*/
- protected function bounceIfSimpleMailLimitExceeded($count) {
+ protected function bounceIfSimpleMailLimitExceeded($count): void {
$limit = Civi::settings()->get('simple_mail_limit');
if ($count > $limit) {
CRM_Core_Error::statusBounce(ts('Please do not use this task to send a lot of emails (greater than %1). Many countries have legal requirements when sending bulk emails and the CiviMail framework has opt out functionality and domain tokens to help meet these.',
* @throws \Civi\API\Exception\UnauthorizedException
* @throws \API_Exception
*/
- public function submit($formValues) {
+ public function submit($formValues): void {
$this->saveMessageTemplate($formValues);
$from = $formValues['from_email_address'] ?? NULL;
if (!isset($this->_contactDetails[$contactId])) {
continue;
}
- $email = $this->_toContactEmails[$key];
+ $email = $this->getEmail($key);
// prevent duplicate emails if same email address is selected CRM-4067
// we should allow same emails for different contacts
$details = $this->_contactDetails[$contactId];
return NULL;
}
+ /**
+ * @return array
+ */
+ protected function getFromEmails(): array {
+ $fromEmailValues = CRM_Core_BAO_Email::getFromEmail();
+
+ if (empty($fromEmailValues)) {
+ CRM_Core_Error::statusBounce(ts('Your user record does not have a valid email address and no from addresses have been configured.'));
+ }
+ return $fromEmailValues;
+ }
+
+ /**
+ * Get the relevant emails.
+ *
+ * @param int $index
+ *
+ * @return string
+ */
+ protected function getEmail(int $index): string {
+ if (empty($this->emails)) {
+ $toEmails = explode(',', $this->getSubmittedValue('to'));
+ foreach ($toEmails as $value) {
+ $parts = explode('::', $value);
+ $this->emails[] = $parts[1];
+ }
+ }
+ return $this->emails[$index];
+ }
+
}