/**
  * Apply the various CRM_Utils_Token helpers.
  *
  * @param TokenRenderEvent $e
  */
 public function onRender(TokenRenderEvent $e)
 {
     $isHtml = $e->message['format'] == 'text/html';
     $useSmarty = !empty($e->context['smarty']);
     $e->string = \CRM_Utils_Token::replaceDomainTokens($e->string, \CRM_Core_BAO_Domain::getDomain(), $isHtml, $e->message['tokens'], $useSmarty);
     if (!empty($e->context['contact'])) {
         $e->string = \CRM_Utils_Token::replaceContactTokens($e->string, $e->context['contact'], $isHtml, $e->message['tokens'], FALSE, $useSmarty);
         // FIXME: This may depend on $contact being merged with hook values.
         $e->string = \CRM_Utils_Token::replaceHookTokens($e->string, $e->context['contact'], $e->context['hookTokenCategories'], $isHtml, $useSmarty);
         \CRM_Utils_Token::replaceGreetingTokens($e->string, NULL, $e->context['contact']['contact_id'], NULL, $useSmarty);
     }
     if ($useSmarty) {
         $smarty = \CRM_Core_Smarty::singleton();
         $e->string = $smarty->fetch("string:" . $e->string);
     }
 }
Ejemplo n.º 2
0
 /**
  *  Assert the content of document
  *
  * @param array $formValues
  * @param array $type
  */
 public function _testDocumentContent($formValues, $type)
 {
     $html = array();
     $form = new CRM_Contact_Form_Task_PDFLetterCommon();
     list($formValues, $categories, $html_message, $messageToken, $returnProperties) = $form->processMessageTemplate($formValues);
     list($html_message, $zip) = CRM_Utils_PDF_Document::unzipDoc($formValues['document_file_path'], $formValues['document_type']);
     foreach ($this->_contactIds as $item => $contactId) {
         $params = array('contact_id' => $contactId);
         list($contact) = CRM_Utils_Token::getTokenDetails($params, $returnProperties, FALSE, FALSE, NULL, $messageToken, 'CRM_Contact_Form_Task_PDFLetterCommon');
         $html[] = CRM_Utils_Token::replaceContactTokens($html_message, $contact[$contactId], TRUE, $messageToken);
     }
     $returnContent = CRM_Utils_PDF_Document::printDocuments($formValues['document_file_path'], $html, $type, $zip, TRUE);
     $returnContent = strip_tags($returnContent);
     $this->assertTrue(strpos($returnContent, 'Hello Antonia D`souza') !== 0);
     $this->assertTrue(strpos($returnContent, 'Hello Anthony Collins') !== 0);
 }
 /**
  * generate htmlfor pdf letters
  *
  * @param array $membershipIDs
  * @param array $returnProperties
  * @param bool $skipOnHold
  * @param bool $skipDeceased
  * @param unknown_type $messageToken
  * @param $html_message
  * @param $categories
  *
  * @return unknown
  */
 static function generateHTML($membershipIDs, $returnProperties, $skipOnHold, $skipDeceased, $messageToken, $html_message, $categories)
 {
     $memberships = CRM_Utils_Token::getMembershipTokenDetails($membershipIDs);
     foreach ($membershipIDs as $membershipID) {
         $membership = $memberships[$membershipID];
         // get contact information
         $contactId = $membership['contact_id'];
         $params = array('contact_id' => $contactId);
         //getTokenDetails is much like calling the api contact.get function - but - with some minor
         // special handlings. It preceeds the existence of the api
         list($contacts) = CRM_Utils_Token::getTokenDetails($params, $returnProperties, $skipOnHold, $skipDeceased, NULL, $messageToken, 'CRM_Contribution_Form_Task_PDFLetterCommon');
         $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contacts[$contactId], TRUE, $messageToken);
         $tokenHtml = CRM_Utils_Token::replaceEntityTokens('membership', $membership, $tokenHtml, $messageToken);
         $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contacts[$contactId], $categories, TRUE);
         $tokenHtml = CRM_Utils_Token::parseThroughSmarty($tokenHtml, $contacts[$contactId]);
         $html[] = $tokenHtml;
     }
     return $html;
 }
 /**
  * global validation rules for the form
  *
  * @param array $fields posted values of the form
  *
  * @return array list of errors to be posted back to the form
  * @static
  * @access public
  */
 static function formRule($fields)
 {
     $errors = array();
     // Validate include/exclude groups, mailings
     // Start
     if (isset($fields['includeGroups']) && isset($fields['excludeGroups']) && is_array($fields['excludeGroups'])) {
         $checkGroups = array();
         $checkGroups = in_array($fields['includeGroups'], $fields['excludeGroups']);
         if (!empty($checkGroups)) {
             $errors['excludeGroups'] = ts('Cannot have same groups in Include Group(s) and Exclude Group(s).');
         }
     }
     if (isset($fields['includeMailings']) && is_array($fields['includeMailings']) && isset($fields['excludeMailings']) && is_array($fields['excludeMailings'])) {
         $checkMailings = array();
         $checkMailings = array_intersect($fields['includeMailings'], $fields['excludeMailings']);
         if (!empty($checkMailings)) {
             $errors['excludeMailings'] = ts('Cannot have same mail in Include mailing(s) and Exclude mailing(s).');
         }
     }
     if (!empty($fields['search_id']) && empty($fields['group_id'])) {
         $errors['group_id'] = ts('You must select a group to filter on');
     }
     if (empty($fields['search_id']) && !empty($fields['group_id'])) {
         $errors['search_id'] = ts('You must select a search to filter');
     }
     // End
     // Validate message template html/text
     // Start
     $errors = array();
     $template = CRM_Core_Smarty::singleton();
     if (isset($fields['html_message'])) {
         $htmlMessage = str_replace(array("\n", "\r"), ' ', $fields['html_message']);
         $htmlMessage = str_replace("'", "\\'", $htmlMessage);
         $template->assign('htmlContent', $htmlMessage);
     }
     $domain = CRM_Core_BAO_Domain::getDomain();
     $session = CRM_Core_Session::singleton();
     $values = array('contact_id' => $session->get('userID'), 'version' => 3);
     require_once 'api/api.php';
     $contact = civicrm_api('contact', 'get', $values);
     //CRM-4524
     $contact = reset($contact['values']);
     $verp = array_flip(array('optOut', 'reply', 'unsubscribe', 'resubscribe', 'owner'));
     foreach ($verp as $key => $value) {
         $verp[$key]++;
     }
     $urls = array_flip(array('forward', 'optOutUrl', 'unsubscribeUrl', 'resubscribeUrl'));
     foreach ($urls as $key => $value) {
         $urls[$key]++;
     }
     // set $header and $footer
     foreach (array('header', 'footer') as $part) {
         ${$part} = array();
         if ($fields["{$part}_id"]) {
             //echo "found<p>";
             $component = new CRM_Mailing_BAO_Component();
             $component->id = $fields["{$part}_id"];
             $component->find(TRUE);
             ${$part}['textFile'] = $component->body_text;
             ${$part}['htmlFile'] = $component->body_html;
             $component->free();
         } else {
             ${$part}['htmlFile'] = ${$part}['textFile'] = '';
         }
     }
     if (!CRM_Utils_Array::value('text_message', $fields) && !CRM_Utils_Array::value('html_message', $fields)) {
         $errors['html_message'] = ts('Please provide either a Text or HTML formatted message - or both.');
     }
     foreach (array('text', 'html') as $file) {
         $str = $fields[$file . '_message'];
         $str = $file == 'html' ? str_replace('%7B', '{', str_replace('%7D', '}', $str)) : $str;
         $name = $file . ' message';
         /* append header/footer */
         $str = $header[$file . 'File'] . $str . $footer[$file . 'File'];
         $dataErrors = array();
         /* First look for missing tokens */
         $err = CRM_Utils_Token::requiredTokens($str);
         if ($err !== TRUE) {
             foreach ($err as $token => $desc) {
                 $dataErrors[] = '<li>' . ts('This message is missing a required token - {%1}: %2', array(1 => $token, 2 => $desc)) . '</li>';
             }
         }
         /* Do a full token replacement on a dummy verp, the current
          * contact and domain, and the first organization. */
         // here we make a dummy mailing object so that we
         // can retrieve the tokens that we need to replace
         // so that we do get an invalid token error
         // this is qute hacky and I hope that there might
         // be a suggestion from someone on how to
         // make it a bit more elegant
         $dummy_mail = new CRM_Mailing_BAO_Mailing();
         $mess = "body_{$file}";
         $dummy_mail->{$mess} = $str;
         $tokens = $dummy_mail->getTokens();
         $str = CRM_Utils_Token::replaceSubscribeInviteTokens($str);
         $str = CRM_Utils_Token::replaceDomainTokens($str, $domain, NULL, $tokens[$file]);
         $str = CRM_Utils_Token::replaceMailingTokens($str, $mailing, NULL, $tokens[$file]);
         $str = CRM_Utils_Token::replaceOrgTokens($str, $org);
         $str = CRM_Utils_Token::replaceActionTokens($str, $verp, $urls, NULL, $tokens[$file]);
         $str = CRM_Utils_Token::replaceContactTokens($str, $contact, NULL, $tokens[$file]);
         $unmatched = CRM_Utils_Token::unmatchedTokens($str);
         if (!empty($unmatched) && 0) {
             foreach ($unmatched as $token) {
                 $dataErrors[] = '<li>' . ts('Invalid token code') . ' {' . $token . '}</li>';
             }
         }
         if (!empty($dataErrors)) {
             $errors[$file . '_message'] = ts('The following errors were detected in %1:', array(1 => $name)) . ' <ul>' . implode('', $dataErrors) . '</ul><br /><a href="' . CRM_Utils_System::docURL2('Sample CiviMail Messages', TRUE, NULL, NULL, NULL, "wiki") . '" target="_blank">' . ts('More information on required tokens...') . '</a>';
         }
     }
     // End
     return empty($errors) ? TRUE : $errors;
 }
Ejemplo n.º 5
0
 /**
  * Send an email from the specified template based on an array of params.
  *
  * @param array $params
  *   A string-keyed array of function params, see function body for details.
  *
  * @return array
  *   Array of four parameters: a boolean whether the email was sent, and the subject, text and HTML templates
  */
 public static function sendTemplate($params)
 {
     $defaults = array('groupName' => NULL, 'valueName' => NULL, 'messageTemplateID' => NULL, 'contactId' => NULL, 'tplParams' => array(), 'from' => NULL, 'toName' => NULL, 'toEmail' => NULL, 'cc' => NULL, 'bcc' => NULL, 'replyTo' => NULL, 'attachments' => NULL, 'isTest' => FALSE, 'PDFFilename' => NULL);
     $params = array_merge($defaults, $params);
     CRM_Utils_Hook::alterMailParams($params, 'messageTemplate');
     if ((!$params['groupName'] || !$params['valueName']) && !$params['messageTemplateID']) {
         CRM_Core_Error::fatal(ts("Message template's option group and/or option value or ID missing."));
     }
     if ($params['messageTemplateID']) {
         // fetch the three elements from the db based on id
         $query = 'SELECT msg_subject subject, msg_text text, msg_html html, pdf_format_id format
                   FROM civicrm_msg_template mt
                   WHERE mt.id = %1 AND mt.is_default = 1';
         $sqlParams = array(1 => array($params['messageTemplateID'], 'String'));
     } else {
         // fetch the three elements from the db based on option_group and option_value names
         $query = 'SELECT msg_subject subject, msg_text text, msg_html html, pdf_format_id format
                   FROM civicrm_msg_template mt
                   JOIN civicrm_option_value ov ON workflow_id = ov.id
                   JOIN civicrm_option_group og ON ov.option_group_id = og.id
                   WHERE og.name = %1 AND ov.name = %2 AND mt.is_default = 1';
         $sqlParams = array(1 => array($params['groupName'], 'String'), 2 => array($params['valueName'], 'String'));
     }
     $dao = CRM_Core_DAO::executeQuery($query, $sqlParams);
     $dao->fetch();
     if (!$dao->N) {
         if ($params['messageTemplateID']) {
             CRM_Core_Error::fatal(ts('No such message template: id=%1.', array(1 => $params['messageTemplateID'])));
         } else {
             CRM_Core_Error::fatal(ts('No such message template: option group %1, option value %2.', array(1 => $params['groupName'], 2 => $params['valueName'])));
         }
     }
     $mailContent = array('subject' => $dao->subject, 'text' => $dao->text, 'html' => $dao->html, 'format' => $dao->format);
     $dao->free();
     CRM_Utils_Hook::alterMailContent($mailContent);
     // add the test banner (if requested)
     if ($params['isTest']) {
         $query = "SELECT msg_subject subject, msg_text text, msg_html html\n                      FROM civicrm_msg_template mt\n                      JOIN civicrm_option_value ov ON workflow_id = ov.id\n                      JOIN civicrm_option_group og ON ov.option_group_id = og.id\n                      WHERE og.name = 'msg_tpl_workflow_meta' AND ov.name = 'test_preview' AND mt.is_default = 1";
         $testDao = CRM_Core_DAO::executeQuery($query);
         $testDao->fetch();
         $mailContent['subject'] = $testDao->subject . $mailContent['subject'];
         $mailContent['text'] = $testDao->text . $mailContent['text'];
         $mailContent['html'] = preg_replace('/<body(.*)$/im', "<body\\1\n{$testDao->html}", $mailContent['html']);
         $testDao->free();
     }
     // replace tokens in the three elements (in subject as if it was the text body)
     $domain = CRM_Core_BAO_Domain::getDomain();
     $hookTokens = array();
     $mailing = new CRM_Mailing_BAO_Mailing();
     $mailing->subject = $mailContent['subject'];
     $mailing->body_text = $mailContent['text'];
     $mailing->body_html = $mailContent['html'];
     $tokens = $mailing->getTokens();
     CRM_Utils_Hook::tokens($hookTokens);
     $categories = array_keys($hookTokens);
     $contactID = CRM_Utils_Array::value('contactId', $params);
     if ($contactID) {
         $contactParams = array('contact_id' => $contactID);
         $returnProperties = array();
         if (isset($tokens['subject']['contact'])) {
             foreach ($tokens['subject']['contact'] as $name) {
                 $returnProperties[$name] = 1;
             }
         }
         if (isset($tokens['text']['contact'])) {
             foreach ($tokens['text']['contact'] as $name) {
                 $returnProperties[$name] = 1;
             }
         }
         if (isset($tokens['html']['contact'])) {
             foreach ($tokens['html']['contact'] as $name) {
                 $returnProperties[$name] = 1;
             }
         }
         // @todo CRM-17253 don't resolve contact details if there are no tokens
         // effectively comment out this next (performance-expensive) line
         // but unfortunately testing is a bit think on the ground to that needs to
         // be added.
         list($contact) = CRM_Utils_Token::getTokenDetails($contactParams, $returnProperties, FALSE, FALSE, NULL, CRM_Utils_Token::flattenTokens($tokens), 'CRM_Core_BAO_MessageTemplate');
         $contact = $contact[$contactID];
     }
     $mailContent['subject'] = CRM_Utils_Token::replaceDomainTokens($mailContent['subject'], $domain, FALSE, $tokens['text'], TRUE);
     $mailContent['text'] = CRM_Utils_Token::replaceDomainTokens($mailContent['text'], $domain, FALSE, $tokens['text'], TRUE);
     $mailContent['html'] = CRM_Utils_Token::replaceDomainTokens($mailContent['html'], $domain, TRUE, $tokens['html'], TRUE);
     if ($contactID) {
         $mailContent['subject'] = CRM_Utils_Token::replaceContactTokens($mailContent['subject'], $contact, FALSE, $tokens['text'], FALSE, TRUE);
         $mailContent['text'] = CRM_Utils_Token::replaceContactTokens($mailContent['text'], $contact, FALSE, $tokens['text'], FALSE, TRUE);
         $mailContent['html'] = CRM_Utils_Token::replaceContactTokens($mailContent['html'], $contact, FALSE, $tokens['html'], FALSE, TRUE);
         $contactArray = array($contactID => $contact);
         CRM_Utils_Hook::tokenValues($contactArray, array($contactID), NULL, CRM_Utils_Token::flattenTokens($tokens), 'CRM_Core_BAO_MessageTemplate');
         $contact = $contactArray[$contactID];
         $mailContent['subject'] = CRM_Utils_Token::replaceHookTokens($mailContent['subject'], $contact, $categories, TRUE);
         $mailContent['text'] = CRM_Utils_Token::replaceHookTokens($mailContent['text'], $contact, $categories, TRUE);
         $mailContent['html'] = CRM_Utils_Token::replaceHookTokens($mailContent['html'], $contact, $categories, TRUE);
     }
     // strip whitespace from ends and turn into a single line
     $mailContent['subject'] = "{strip}{$mailContent['subject']}{/strip}";
     // parse the three elements with Smarty
     $smarty = CRM_Core_Smarty::singleton();
     foreach ($params['tplParams'] as $name => $value) {
         $smarty->assign($name, $value);
     }
     foreach (array('subject', 'text', 'html') as $elem) {
         $mailContent[$elem] = $smarty->fetch("string:{$mailContent[$elem]}");
     }
     // send the template, honouring the target user’s preferences (if any)
     $sent = FALSE;
     // create the params array
     $params['subject'] = $mailContent['subject'];
     $params['text'] = $mailContent['text'];
     $params['html'] = $mailContent['html'];
     if ($params['toEmail']) {
         $contactParams = array(array('email', 'LIKE', $params['toEmail'], 0, 1));
         list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($contactParams);
         $prefs = array_pop($contact);
         if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] == 'HTML') {
             $params['text'] = NULL;
         }
         if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] == 'Text') {
             $params['html'] = NULL;
         }
         $config = CRM_Core_Config::singleton();
         if (isset($params['isEmailPdf']) && $params['isEmailPdf'] == 1) {
             $pdfHtml = CRM_Contribute_BAO_ContributionPage::addInvoicePdfToEmail($params['contributionId'], $params['contactId']);
             if (empty($params['attachments'])) {
                 $params['attachments'] = array();
             }
             $params['attachments'][] = CRM_Utils_Mail::appendPDF('Invoice.pdf', $pdfHtml, $mailContent['format']);
         }
         $pdf_filename = '';
         if ($config->doNotAttachPDFReceipt && $params['PDFFilename'] && $params['html']) {
             if (empty($params['attachments'])) {
                 $params['attachments'] = array();
             }
             $params['attachments'][] = CRM_Utils_Mail::appendPDF($params['PDFFilename'], $params['html'], $mailContent['format']);
             if (isset($params['tplParams']['email_comment'])) {
                 $params['html'] = $params['tplParams']['email_comment'];
                 $params['text'] = strip_tags($params['tplParams']['email_comment']);
             }
         }
         $sent = CRM_Utils_Mail::send($params);
         if ($pdf_filename) {
             unlink($pdf_filename);
         }
     }
     return array($sent, $mailContent['subject'], $mailContent['text'], $mailContent['html']);
 }
Ejemplo n.º 6
0
 /**
  * Replace existing greeting tokens in message/subject.
  */
 public static function replaceGreetingTokens(&$tokenString, $contactDetails = NULL, $contactId = NULL, $className = NULL, $escapeSmarty = FALSE)
 {
     if (!$contactDetails && !$contactId) {
         return;
     }
     // check if there are any tokens
     $greetingTokens = self::getTokens($tokenString);
     if (!empty($greetingTokens)) {
         // first use the existing contact object for token replacement
         if (!empty($contactDetails)) {
             $tokenString = CRM_Utils_Token::replaceContactTokens($tokenString, $contactDetails, TRUE, $greetingTokens, TRUE, $escapeSmarty);
         }
         // check if there are any unevaluated tokens
         $greetingTokens = self::getTokens($tokenString);
         // $greetingTokens not empty, means there are few tokens which are not
         // evaluated, like custom data etc
         // so retrieve it from database
         if (!empty($greetingTokens) && array_key_exists('contact', $greetingTokens)) {
             $greetingsReturnProperties = array_flip(CRM_Utils_Array::value('contact', $greetingTokens));
             $greetingsReturnProperties = array_fill_keys(array_keys($greetingsReturnProperties), 1);
             $contactParams = array('contact_id' => $contactId);
             $greetingDetails = self::getTokenDetails($contactParams, $greetingsReturnProperties, FALSE, FALSE, NULL, $greetingTokens, $className);
             // again replace tokens
             $tokenString = CRM_Utils_Token::replaceContactTokens($tokenString, $greetingDetails, TRUE, $greetingTokens, TRUE, $escapeSmarty);
         }
         // check if there are still any unevaluated tokens
         $remainingTokens = self::getTokens($tokenString);
         // $greetingTokens not empty, there are customized or hook tokens to replace
         if (!empty($remainingTokens)) {
             // Fill the return properties array
             $greetingTokens = $remainingTokens;
             reset($greetingTokens);
             $greetingsReturnProperties = array();
             while (list($key) = each($greetingTokens)) {
                 $props = array_flip(CRM_Utils_Array::value($key, $greetingTokens));
                 $props = array_fill_keys(array_keys($props), 1);
                 $greetingsReturnProperties = $greetingsReturnProperties + $props;
             }
             $contactParams = array('contact_id' => $contactId);
             $greetingDetails = self::getTokenDetails($contactParams, $greetingsReturnProperties, FALSE, FALSE, NULL, $greetingTokens, $className);
             // Prepare variables for calling replaceHookTokens
             $categories = array_keys($greetingTokens);
             list($contact) = $greetingDetails;
             // Replace tokens defined in Hooks.
             $tokenString = CRM_Utils_Token::replaceHookTokens($tokenString, $contact[$contactId], $categories);
         }
     }
 }
 static function sendSMS(&$contactDetails, &$activityParams, &$smsParams = array(), &$contactIds, $userID = NULL)
 {
     if ($userID == NULL) {
         $session = CRM_Core_Session::singleton();
         $userID = $session->get('userID');
     }
     $text =& $activityParams['text_message'];
     $html =& $activityParams['html_message'];
     // CRM-4575
     // token replacement of addressee/email/postal greetings
     // get the tokens added in subject and message
     $messageToken = CRM_Utils_Token::getTokens($text);
     $messageToken = array_merge($messageToken, CRM_Utils_Token::getTokens($html));
     //create the meta level record first ( sms activity )
     $activityTypeID = CRM_Core_OptionGroup::getValue('activity_type', 'SMS', 'name');
     // CRM-6265: save both text and HTML parts in details (if present)
     if ($html and $text) {
         $details = "-ALTERNATIVE ITEM 0-\n{$html}\n-ALTERNATIVE ITEM 1-\n{$text}\n-ALTERNATIVE END-\n";
     } else {
         $details = $html ? $html : $text;
     }
     $activitySubject = $activityParams['activity_subject'];
     $activityParams = array('source_contact_id' => $userID, 'activity_type_id' => $activityTypeID, 'activity_date_time' => date('YmdHis'), 'subject' => $activitySubject, 'details' => $details, 'status_id' => 2);
     $activity = self::create($activityParams);
     $activityID = $activity->id;
     $returnProperties = array();
     if (isset($messageToken['contact'])) {
         foreach ($messageToken['contact'] as $key => $value) {
             $returnProperties[$value] = 1;
         }
     }
     // get token details for contacts, call only if tokens are used
     $details = array();
     if (!empty($returnProperties)) {
         list($details) = CRM_Utils_Token::getTokenDetails($contactIds, $returnProperties, NULL, NULL, FALSE, $messageToken, 'CRM_Activity_BAO_Activity');
     }
     // call token hook
     $tokens = array();
     CRM_Utils_Hook::tokens($tokens);
     $categories = array_keys($tokens);
     $escapeSmarty = $sent = FALSE;
     foreach ($contactDetails as $values) {
         $contactId = $values['contact_id'];
         if (!empty($details) && is_array($details["{$contactId}"])) {
             // unset email from details since it always returns primary email address
             unset($details["{$contactId}"]['email']);
             unset($details["{$contactId}"]['email_id']);
             $values = array_merge($values, $details["{$contactId}"]);
         }
         $tokenText = CRM_Utils_Token::replaceContactTokens($text, $values, FALSE, $messageToken, FALSE, $escapeSmarty);
         $tokenText = CRM_Utils_Token::replaceHookTokens($tokenText, $values, $categories, FALSE, $escapeSmarty);
         $tokenHtml = CRM_Utils_Token::replaceContactTokens($html, $values, TRUE, $messageToken, FALSE, $escapeSmarty);
         $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $values, $categories, TRUE, $escapeSmarty);
         $smsParams['To'] = $values['phone'];
         if (self::sendSMSMessage($contactId, $tokenText, $tokenHtml, $smsParams, $activityID)) {
             // even a single successful delivery should set this falg to true
             $sent = TRUE;
         }
     }
     return array($sent, $activity->id);
 }
Ejemplo n.º 8
0
 /**
  * Function for validation
  *
  * @param array $params (ref.) an assoc array of name/value pairs
  *
  * @param $files
  * @param $self
  *
  * @return mixed true or array of errors
  * @access public
  * @static
  */
 static function formRule($params, $files, $self)
 {
     if (!empty($_POST['_qf_Import_refresh'])) {
         return TRUE;
     }
     $errors = array();
     $template = CRM_Core_Smarty::singleton();
     $domain = CRM_Core_BAO_Domain::getDomain();
     $mailing = new CRM_Mailing_BAO_Mailing();
     $mailing->id = $self->_mailingID;
     $mailing->find(TRUE);
     $session = CRM_Core_Session::singleton();
     $values = array('contact_id' => $session->get('userID'), 'version' => 3);
     require_once 'api/api.php';
     $contact = civicrm_api('contact', 'get', $values);
     //CRM-4524
     $contact = reset($contact['values']);
     $verp = array_flip(array('optOut', 'reply', 'unsubscribe', 'resubscribe', 'owner'));
     foreach ($verp as $key => $value) {
         $verp[$key]++;
     }
     $urls = array_flip(array('forward', 'optOutUrl', 'unsubscribeUrl', 'resubscribeUrl'));
     foreach ($urls as $key => $value) {
         $urls[$key]++;
     }
     $skipTextFile = $self->get('skipTextFile');
     if (!$params['upload_type']) {
         if (!isset($files['textFile']) || !file_exists($files['textFile']['tmp_name'])) {
             if (!$skipTextFile) {
                 $errors['textFile'] = ts('Please provide a Text');
             }
         }
     } else {
         if (empty($params['text_message'])) {
             $errors['text_message'] = ts('Please provide a Text');
         } else {
             if (!empty($params['text_message'])) {
                 $messageCheck = CRM_Utils_Array::value('text_message', $params);
                 if ($messageCheck && strlen($messageCheck) > CRM_SMS_Provider::MAX_SMS_CHAR) {
                     $errors['text_message'] = ts("You can configure the SMS message body up to %1 characters", array(1 => CRM_SMS_Provider::MAX_SMS_CHAR));
                 }
             }
         }
         if (!empty($params['saveTemplate']) && empty($params['saveTemplateName'])) {
             $errors['saveTemplateName'] = ts('Please provide a Template Name.');
         }
     }
     if ($params['upload_type'] || file_exists(CRM_Utils_Array::value('tmp_name', $files['textFile'])) || !$params['upload_type'] && $params['text_message']) {
         if (!$params['upload_type']) {
             $str = file_get_contents($files['textFile']['tmp_name']);
             $name = $files['textFile']['name'];
         } else {
             $str = $params['text_message'];
             $name = 'text message';
         }
         $dataErrors = array();
         /* Do a full token replacement on a dummy verp, the current
          * contact and domain, and the first organization. */
         // here we make a dummy mailing object so that we
         // can retrieve the tokens that we need to replace
         // so that we do get an invalid token error
         // this is qute hacky and I hope that there might
         // be a suggestion from someone on how to
         // make it a bit more elegant
         $dummy_mail = new CRM_Mailing_BAO_Mailing();
         $mess = "body_text";
         $dummy_mail->{$mess} = $str;
         $tokens = $dummy_mail->getTokens();
         $str = CRM_Utils_Token::replaceSubscribeInviteTokens($str);
         $str = CRM_Utils_Token::replaceDomainTokens($str, $domain, NULL, $tokens['text']);
         $str = CRM_Utils_Token::replaceMailingTokens($str, $mailing, NULL, $tokens['text']);
         $str = CRM_Utils_Token::replaceOrgTokens($str, $org);
         $str = CRM_Utils_Token::replaceActionTokens($str, $verp, $urls, NULL, $tokens['text']);
         $str = CRM_Utils_Token::replaceContactTokens($str, $contact, NULL, $tokens['text']);
         $unmatched = CRM_Utils_Token::unmatchedTokens($str);
         $contentCheck = CRM_Utils_String::htmlToText($str);
         if (!empty($unmatched) && 0) {
             foreach ($unmatched as $token) {
                 $dataErrors[] = '<li>' . ts('Invalid token code') . ' {' . $token . '}</li>';
             }
         }
         if (strlen($contentCheck) > CRM_SMS_Provider::MAX_SMS_CHAR) {
             $dataErrors[] = '<li>' . ts('The body of the SMS cannot exceed %1 characters.', array(1 => CRM_SMS_Provider::MAX_SMS_CHAR)) . '</li>';
         }
         if (!empty($dataErrors)) {
             $errors['textFile'] = ts('The following errors were detected in %1:', array(1 => $name)) . ' <ul>' . implode('', $dataErrors) . '</ul>';
         }
     }
     $templateName = CRM_Core_BAO_MessageTemplate::getMessageTemplates();
     if (!empty($params['saveTemplate']) && in_array(CRM_Utils_Array::value('saveTemplateName', $params), $templateName)) {
         $errors['saveTemplate'] = ts('Duplicate Template Name.');
     }
     return empty($errors) ? TRUE : $errors;
 }
Ejemplo n.º 9
0
 /**
  * @param $contactId
  * @param $to
  * @param $scheduleID
  * @param $from
  * @param $tokenParams
  *
  * @return bool|null
  * @throws CRM_Core_Exception
  */
 static function sendReminder($contactId, $to, $scheduleID, $from, $tokenParams)
 {
     $email = $to['email'];
     $phoneNumber = $to['phone'];
     $schedule = new CRM_Core_DAO_ActionSchedule();
     $schedule->id = $scheduleID;
     $domain = CRM_Core_BAO_Domain::getDomain();
     $result = NULL;
     $hookTokens = array();
     if ($schedule->find(TRUE)) {
         $body_text = $schedule->body_text;
         $body_html = $schedule->body_html;
         $sms_body_text = $schedule->sms_body_text;
         $body_subject = $schedule->subject;
         if (!$body_text) {
             $body_text = CRM_Utils_String::htmlToText($body_html);
         }
         $params = array(array('contact_id', '=', $contactId, 0, 0));
         list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($params);
         //CRM-4524
         $contact = reset($contact);
         if (!$contact || is_a($contact, 'CRM_Core_Error')) {
             return NULL;
         }
         // merge activity tokens with contact array
         $contact = array_merge($contact, $tokenParams);
         //CRM-5734
         CRM_Utils_Hook::tokenValues($contact, $contactId);
         CRM_Utils_Hook::tokens($hookTokens);
         $categories = array_keys($hookTokens);
         $type = array('body_html' => 'html', 'body_text' => 'text', 'sms_body_text' => 'text');
         foreach ($type as $bodyType => $value) {
             $dummy_mail = new CRM_Mailing_BAO_Mailing();
             if ($bodyType == 'sms_body_text') {
                 $dummy_mail->body_text = ${$bodyType};
             } else {
                 $dummy_mail->{${$bodyType}} = ${$bodyType};
             }
             $tokens = $dummy_mail->getTokens();
             if (${$bodyType}) {
                 CRM_Utils_Token::replaceGreetingTokens(${$bodyType}, NULL, $contact['contact_id']);
                 ${$bodyType} = CRM_Utils_Token::replaceDomainTokens(${$bodyType}, $domain, TRUE, $tokens[$value], TRUE);
                 ${$bodyType} = CRM_Utils_Token::replaceContactTokens(${$bodyType}, $contact, FALSE, $tokens[$value], FALSE, TRUE);
                 ${$bodyType} = CRM_Utils_Token::replaceComponentTokens(${$bodyType}, $contact, $tokens[$value], TRUE, FALSE);
                 ${$bodyType} = CRM_Utils_Token::replaceHookTokens(${$bodyType}, $contact, $categories, TRUE);
             }
         }
         $html = $body_html;
         $text = $body_text;
         $sms_text = $sms_body_text;
         $smarty = CRM_Core_Smarty::singleton();
         foreach (array('text', 'html', 'sms_text') as $elem) {
             ${$elem} = $smarty->fetch("string:{${$elem}}");
         }
         $matches = array();
         preg_match_all('/(?<!\\{|\\\\)\\{(\\w+\\.\\w+)\\}(?!\\})/', $body_subject, $matches, PREG_PATTERN_ORDER);
         $subjectToken = NULL;
         if ($matches[1]) {
             foreach ($matches[1] as $token) {
                 list($type, $name) = preg_split('/\\./', $token, 2);
                 if ($name) {
                     if (!isset($subjectToken[$type])) {
                         $subjectToken[$type] = array();
                     }
                     $subjectToken[$type][] = $name;
                 }
             }
         }
         $messageSubject = CRM_Utils_Token::replaceContactTokens($body_subject, $contact, FALSE, $subjectToken);
         $messageSubject = CRM_Utils_Token::replaceDomainTokens($messageSubject, $domain, TRUE, $subjectToken);
         $messageSubject = CRM_Utils_Token::replaceComponentTokens($messageSubject, $contact, $subjectToken, TRUE);
         $messageSubject = CRM_Utils_Token::replaceHookTokens($messageSubject, $contact, $categories, TRUE);
         $messageSubject = $smarty->fetch("string:{$messageSubject}");
         if ($schedule->mode == 'SMS' or $schedule->mode == 'User_Preference') {
             $session = CRM_Core_Session::singleton();
             $userID = $session->get('userID') ? $session->get('userID') : $contactId;
             $smsParams = array('To' => $phoneNumber, 'provider_id' => $schedule->sms_provider_id, 'activity_subject' => $messageSubject);
             $activityTypeID = CRM_Core_OptionGroup::getValue('activity_type', 'SMS', 'name');
             $activityParams = array('source_contact_id' => $userID, 'activity_type_id' => $activityTypeID, 'activity_date_time' => date('YmdHis'), 'subject' => $messageSubject, 'details' => $sms_text, 'status_id' => CRM_Core_OptionGroup::getValue('activity_status', 'Completed', 'name'));
             $activity = CRM_Activity_BAO_Activity::create($activityParams);
             CRM_Activity_BAO_Activity::sendSMSMessage($contactId, $sms_text, $html, $smsParams, $activity->id, $userID);
         }
         if ($schedule->mode == 'Email' or $schedule->mode == 'User_Preference') {
             // set up the parameters for CRM_Utils_Mail::send
             $mailParams = array('groupName' => 'Scheduled Reminder Sender', 'from' => $from, 'toName' => $contact['display_name'], 'toEmail' => $email, 'subject' => $messageSubject, 'entity' => 'action_schedule', 'entity_id' => $scheduleID);
             if (!$html || $contact['preferred_mail_format'] == 'Text' || $contact['preferred_mail_format'] == 'Both') {
                 // render the &amp; entities in text mode, so that the links work
                 $mailParams['text'] = str_replace('&amp;', '&', $text);
             }
             if ($html && ($contact['preferred_mail_format'] == 'HTML' || $contact['preferred_mail_format'] == 'Both')) {
                 $mailParams['html'] = $html;
             }
             $result = CRM_Utils_Mail::send($mailParams);
         }
     }
     $schedule->free();
     return $result;
 }
 protected function replaceTokens($input, $contact_id)
 {
     //get contact
     $params = array(array('contact_id', '=', $contact_id, 0, 0));
     list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($params);
     $contact = reset($contact);
     if (!$contact || is_a($contact, 'CRM_Core_Error')) {
         throw new API_Exception('Could not find contact with ID: ' . $params['contact_id']);
     }
     $tokens = CRM_Utils_Token::getTokens($input);
     // get replacement text for these tokens
     $returnProperties = array('sort_name' => 1, 'email' => 1, 'do_not_email' => 1, 'is_deceased' => 1, 'on_hold' => 1, 'display_name' => 1, 'preferred_mail_format' => 1);
     if (isset($tokens['contact'])) {
         foreach ($tokens['contact'] as $key => $value) {
             $returnProperties[$value] = 1;
         }
     }
     list($details) = CRM_Utils_Token::getTokenDetails(array($contact_id), $returnProperties, false, false, null, $tokens);
     $contact = reset($details);
     // call token hook
     $hookTokens = array();
     CRM_Utils_Hook::tokens($hookTokens);
     $categories = array_keys($hookTokens);
     CRM_Utils_Token::replaceGreetingTokens($input, NULL, $contact['contact_id']);
     $input = CRM_Utils_Token::replaceDomainTokens($input, $domain, true, $tokens, true);
     $input = CRM_Utils_Token::replaceContactTokens($input, $contact, false, $tokens, false, true);
     $input = CRM_Utils_Token::replaceComponentTokens($input, $contact, $tokens, true);
     $input = CRM_Utils_Token::replaceHookTokens($input, $contact, $categories, true);
     return $input;
 }
Ejemplo n.º 11
0
 /**
  * Function for validation
  *
  * @param array $params (ref.) an assoc array of name/value pairs
  *
  * @return mixed true or array of errors
  * @access public
  * @static
  */
 function dataRule(&$params, &$files, &$options)
 {
     if (CRM_Utils_Array::value('_qf_Import_refresh', $_POST)) {
         return true;
     }
     $errors = array();
     require_once 'CRM/Core/BAO/Domain.php';
     $domain =& CRM_Core_BAO_Domain::getCurrentDomain();
     $mailing = null;
     $session =& CRM_Core_Session::singleton();
     $values = array('contact_id' => $session->get('userID'));
     $contact = array();
     $ids = array();
     CRM_Contact_BAO_Contact::retrieve($values, $contact, $id);
     $verp = array_flip(array('optOut', 'reply', 'unsubscribe', 'owner'));
     foreach ($verp as $key => $value) {
         $verp[$key]++;
     }
     $urls = array_flip(array('forward'));
     foreach ($urls as $key => $value) {
         $urls[$key]++;
     }
     require_once 'CRM/Mailing/BAO/Component.php';
     $header =& new CRM_Mailing_BAO_Component();
     $header->id = $params['header_id'];
     $header->find(true);
     $footer =& new CRM_Mailing_BAO_Component();
     $footer->id = $params['footer_id'];
     $footer->find(true);
     list($headerBody['htmlFile'], $headerBody['textFile']) = array($header->body_html, $header->body_text);
     list($footerBody['htmlFile'], $footerBody['textFile']) = array($footer->body_html, $footer->body_text);
     require_once 'CRM/Utils/Token.php';
     if (!file_exists($files['textFile']['tmp_name'])) {
         $errors['textFile'] = ts('Please provide at least the text message.');
     }
     foreach (array('textFile', 'htmlFile') as $file) {
         if (!file_exists($files[$file]['tmp_name'])) {
             continue;
         }
         $str = file_get_contents($files[$file]['tmp_name']);
         $name = $files[$file]['name'];
         /* append header/footer */
         $str = $headerBody[$file] . $str . $footerBody[$file];
         $dataErrors = array();
         /* First look for missing tokens */
         $err = CRM_Utils_Token::requiredTokens($str);
         if ($err !== true) {
             foreach ($err as $token => $desc) {
                 $dataErrors[] = '<li>' . ts('Missing required token') . ' {' . $token . "}: {$desc}</li>";
             }
         }
         /* Do a full token replacement on a dummy verp, the current contact
          * and domain. */
         $str = CRM_Utils_Token::replaceDomainTokens($str, $domain);
         $str = CRM_Utils_Token::replaceMailingTokens($str, $mailing);
         $str = CRM_Utils_Token::replaceActionTokens($str, $verp, $urls);
         $str = CRM_Utils_Token::replaceContactTokens($str, $contact);
         $unmatched = CRM_Utils_Token::unmatchedTokens($str);
         if (!empty($unmatched)) {
             foreach ($unmatched as $token) {
                 $dataErrors[] = '<li>' . ts('Invalid token code') . ' {' . $token . '}</li>';
             }
         }
         if (!empty($dataErrors)) {
             $errors[$file] = ts('The following errors were detected in %1:', array(1 => $name)) . ': <ul>' . implode('', $dataErrors) . '</ul>';
         }
     }
     return empty($errors) ? true : $errors;
 }
 /**
  * process the form after the input has been submitted and validated
  *
  * @access public
  *
  * @return void
  */
 static function postProcess(&$form)
 {
     list($formValues, $categories, $html_message, $messageToken, $returnProperties) = self::processMessageTemplate($form);
     // update dates ?
     $receipt_update = isset($formValues['receipt_update']) ? $formValues['receipt_update'] : FALSE;
     $thankyou_update = isset($formValues['thankyou_update']) ? $formValues['thankyou_update'] : FALSE;
     $nowDate = date('YmdHis');
     $receipts = 0;
     $thanks = 0;
     $updateStatus = '';
     // skip some contacts ?
     $skipOnHold = isset($form->skipOnHold) ? $form->skipOnHold : FALSE;
     $skipDeceased = isset($form->skipDeceased) ? $form->skipDeceased : TRUE;
     foreach ($form->getVar('_contributionIds') as $item => $contributionId) {
         // get contact information
         $contactId = civicrm_api("Contribution", "getvalue", array('version' => '3', 'id' => $contributionId, 'return' => 'contact_id'));
         $params = array('contact_id' => $contactId);
         list($contact) = CRM_Utils_Token::getTokenDetails($params, $returnProperties, $skipOnHold, $skipDeceased, NULL, $messageToken, 'CRM_Contribution_Form_Task_PDFLetterCommon');
         if (civicrm_error($contact)) {
             $notSent[] = $contributionId;
             continue;
         }
         // get contribution information
         $params = array('contribution_id' => $contributionId);
         $contribution = CRM_Utils_Token::getContributionTokenDetails($params, $returnProperties, NULL, $messageToken, 'CRM_Contribution_Form_Task_PDFLetterCommon');
         if (civicrm_error($contribution)) {
             $notSent[] = $contributionId;
             continue;
         }
         $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contact[$contactId], TRUE, $messageToken);
         $tokenHtml = CRM_Utils_Token::replaceContributionTokens($tokenHtml, $contribution[$contributionId], TRUE, $messageToken);
         $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contact[$contactId], $categories, TRUE);
         if (defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY) {
             $smarty = CRM_Core_Smarty::singleton();
             // also add the tokens to the template
             $smarty->assign_by_ref('contact', $contact);
             $tokenHtml = $smarty->fetch("string:{$tokenHtml}");
         }
         $html[] = $tokenHtml;
         // update dates (do it for each contribution including grouped recurring contribution)
         if ($receipt_update) {
             $result = CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Contribution', $contributionId, 'receipt_date', $nowDate);
             // We can't use CRM_Core_Error::fatal here because the api error elevates the exception level. FIXME. dgg
             if ($result) {
                 $receipts++;
             }
         }
         if ($thankyou_update) {
             $result = CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Contribution', $contributionId, 'thankyou_date', $nowDate);
             // We can't use CRM_Core_Error::fatal here because the api error elevates the exception level. FIXME. dgg
             if ($result) {
                 $thanks++;
             }
         }
     }
     self::createActivities($form, $html_message, $form->_contactIds);
     CRM_Utils_PDF_Utils::html2pdf($html, "CiviLetter.pdf", FALSE, $formValues);
     $form->postProcessHook();
     if ($receipts) {
         $updateStatus = ts('Receipt date has been updated for %1 contributions.', array(1 => $receipts));
     }
     if ($thanks) {
         $updateStatus .= ' ' . ts('Thank-you date has been updated for %1 contributions.', array(1 => $thanks));
     }
     if ($updateStatus) {
         CRM_Core_Session::setStatus($updateStatus);
     }
     CRM_Utils_System::civiExit(1);
 }
Ejemplo n.º 13
0
 /**
  * process the form after the input has been submitted and validated
  *
  * @access public
  * @return None
  */
 static function postProcess(&$form)
 {
     $formValues = $form->controller->exportValues($form->getName());
     // process message template
     require_once 'CRM/Core/BAO/MessageTemplates.php';
     if (CRM_Utils_Array::value('saveTemplate', $formValues) || CRM_Utils_Array::value('updateTemplate', $formValues)) {
         $messageTemplate = array('msg_text' => NULL, 'msg_html' => $formValues['html_message'], 'msg_subject' => NULL, 'is_active' => true);
         if ($formValues['saveTemplate']) {
             $messageTemplate['msg_title'] = $formValues['saveTemplateName'];
             CRM_Core_BAO_MessageTemplates::add($messageTemplate);
         }
         if ($formValues['template'] && $formValues['updateTemplate']) {
             $messageTemplate['id'] = $formValues['template'];
             unset($messageTemplate['msg_title']);
             CRM_Core_BAO_MessageTemplates::add($messageTemplate);
         }
     }
     require_once 'dompdf/dompdf_config.inc.php';
     $html = '<html><head><style>body { margin: 56px; }</style></head><body>';
     require_once 'api/v2/Contact.php';
     require_once 'CRM/Utils/Token.php';
     $tokens = array();
     CRM_Utils_Hook::tokens($tokens);
     $categories = array_keys($tokens);
     $html_message = $formValues['html_message'];
     //time being hack to strip '&nbsp;'
     //from particular letter line, CRM-6798
     self::formatMessage($html_message);
     require_once 'CRM/Activity/BAO/Activity.php';
     $messageToken = CRM_Activity_BAO_Activity::getTokens($html_message);
     $returnProperties = array();
     if (isset($messageToken['contact'])) {
         foreach ($messageToken['contact'] as $key => $value) {
             $returnProperties[$value] = 1;
         }
     }
     require_once 'CRM/Mailing/BAO/Mailing.php';
     $mailing = new CRM_Mailing_BAO_Mailing();
     if (defined('CIVICRM_MAIL_SMARTY')) {
         require_once 'CRM/Core/Smarty/resources/String.php';
         civicrm_smarty_register_string_resource();
     }
     $first = TRUE;
     foreach ($form->_contactIds as $item => $contactId) {
         $params = array('contact_id' => $contactId);
         list($contact) = $mailing->getDetails($params, $returnProperties, false);
         if (civicrm_error($contact)) {
             $notSent[] = $contactId;
             continue;
         }
         $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contact[$contactId], true, $messageToken);
         $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contact[$contactId], $categories, true);
         if (defined('CIVICRM_MAIL_SMARTY')) {
             $smarty = CRM_Core_Smarty::singleton();
             // also add the contact tokens to the template
             $smarty->assign_by_ref('contact', $contact);
             $tokenHtml = $smarty->fetch("string:{$tokenHtml}");
         }
         if ($first == TRUE) {
             $first = FALSE;
             $html .= $tokenHtml;
         } else {
             $html .= "<div STYLE='page-break-after: always'></div>{$tokenHtml}";
         }
     }
     $html .= '</body></html>';
     require_once 'CRM/Activity/BAO/Activity.php';
     $session = CRM_Core_Session::singleton();
     $userID = $session->get('userID');
     $activityTypeID = CRM_Core_OptionGroup::getValue('activity_type', 'Print PDF Letter', 'name');
     $activityParams = array('source_contact_id' => $userID, 'activity_type_id' => $activityTypeID, 'activity_date_time' => date('YmdHis'), 'details' => $html_message);
     if ($form->_activityId) {
         $activityParams += array('id' => $form->_activityId);
     }
     if ($form->_cid) {
         $activity = CRM_Activity_BAO_Activity::create($activityParams);
     } else {
         // create  Print PDF activity for each selected contact. CRM-6886
         $activityIds = array();
         foreach ($form->_contactIds as $contactId) {
             $activityID = CRM_Activity_BAO_Activity::create($activityParams);
             $activityIds[$contactId] = $activityID->id;
         }
     }
     foreach ($form->_contactIds as $contactId) {
         $activityTargetParams = array('activity_id' => empty($activity->id) ? $activityIds[$contactId] : $activity->id, 'target_contact_id' => $contactId);
         CRM_Activity_BAO_Activity::createActivityTarget($activityTargetParams);
     }
     require_once 'CRM/Utils/PDF/Utils.php';
     CRM_Utils_PDF_Utils::html2pdf($html, "CiviLetter.pdf", 'portrait', 'letter');
     // we need to call the hook manually here since we redirect and never
     // go back to CRM/Core/Form.php
     CRM_Utils_Hook::postProcess(get_class($form), $form);
     CRM_Utils_System::civiExit(1);
 }
Ejemplo n.º 14
0
 /**
  * process the form after the input has been submitted and validated
  *
  * @access public
  * @return None
  */
 static function postProcess(&$form)
 {
     $formValues = $form->controller->exportValues($form->getName());
     // process message template
     require_once 'CRM/Core/BAO/MessageTemplates.php';
     if (CRM_Utils_Array::value('saveTemplate', $formValues) || CRM_Utils_Array::value('updateTemplate', $formValues)) {
         $messageTemplate = array('msg_text' => NULL, 'msg_html' => $formValues['html_message'], 'msg_subject' => NULL, 'is_active' => true);
         if ($formValues['saveTemplate']) {
             $messageTemplate['msg_title'] = $formValues['saveTemplateName'];
             CRM_Core_BAO_MessageTemplates::add($messageTemplate);
         }
         if ($formValues['template'] && $formValues['updateTemplate']) {
             $messageTemplate['id'] = $formValues['template'];
             unset($messageTemplate['msg_title']);
             CRM_Core_BAO_MessageTemplates::add($messageTemplate);
         }
     }
     require_once 'dompdf/dompdf_config.inc.php';
     $html = '<html><head><style>body { margin: 56px; }</style></head><body>';
     require_once 'api/v2/Contact.php';
     require_once 'CRM/Utils/Token.php';
     $tokens = array();
     CRM_Utils_Hook::tokens($tokens);
     $categories = array_keys($tokens);
     $html_message = $formValues['html_message'];
     require_once 'CRM/Activity/BAO/Activity.php';
     $messageToken = CRM_Activity_BAO_Activity::getTokens($html_message);
     $returnProperties = array();
     if (isset($messageToken['contact'])) {
         foreach ($messageToken['contact'] as $key => $value) {
             $returnProperties[$value] = 1;
         }
     }
     require_once 'CRM/Mailing/BAO/Mailing.php';
     $mailing =& new CRM_Mailing_BAO_Mailing();
     $first = TRUE;
     foreach ($form->_contactIds as $item => $contactId) {
         $params = array('contact_id' => $contactId);
         list($contact) = $mailing->getDetails($params, $returnProperties, false);
         if (civicrm_error($contact)) {
             $notSent[] = $contactId;
             continue;
         }
         $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contact[$contactId], true, $messageToken);
         $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contact[$contactId], $categories, true);
         if ($first == TRUE) {
             $first = FALSE;
             $html .= $tokenHtml;
         } else {
             $html .= "<div STYLE='page-break-after: always'></div>{$tokenHtml}";
         }
     }
     $html .= '</body></html>';
     require_once 'CRM/Utils/PDF/Utils.php';
     CRM_Utils_PDF_Utils::html2pdf($html, "CiviLetter.pdf", 'portrait');
     exit(1);
 }
 static function sendReminder($contactId, $email, $scheduleID, $from, $tokenParams)
 {
     $schedule = new CRM_Core_DAO_ActionSchedule();
     $schedule->id = $scheduleID;
     $domain = CRM_Core_BAO_Domain::getDomain();
     $result = NULL;
     $hookTokens = array();
     if ($schedule->find(TRUE)) {
         $body_text = $schedule->body_text;
         $body_html = $schedule->body_html;
         $body_subject = $schedule->subject;
         if (!$body_text) {
             $body_text = CRM_Utils_String::htmlToText($body_html);
         }
         $params = array(array('contact_id', '=', $contactId, 0, 0));
         list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($params);
         //CRM-4524
         $contact = reset($contact);
         if (!$contact || is_a($contact, 'CRM_Core_Error')) {
             return NULL;
         }
         // merge activity tokens with contact array
         $contact = array_merge($contact, $tokenParams);
         //CRM-5734
         CRM_Utils_Hook::tokenValues($contact, $contactId);
         CRM_Utils_Hook::tokens($hookTokens);
         $categories = array_keys($hookTokens);
         $type = array('html', 'text');
         foreach ($type as $key => $value) {
             $dummy_mail = new CRM_Mailing_BAO_Mailing();
             $bodyType = "body_{$value}";
             $dummy_mail->{$bodyType} = ${$bodyType};
             $tokens = $dummy_mail->getTokens();
             if (${$bodyType}) {
                 CRM_Utils_Token::replaceGreetingTokens(${$bodyType}, NULL, $contact['contact_id']);
                 ${$bodyType} = CRM_Utils_Token::replaceDomainTokens(${$bodyType}, $domain, TRUE, $tokens[$value], TRUE);
                 ${$bodyType} = CRM_Utils_Token::replaceContactTokens(${$bodyType}, $contact, FALSE, $tokens[$value], FALSE, TRUE);
                 ${$bodyType} = CRM_Utils_Token::replaceComponentTokens(${$bodyType}, $contact, $tokens[$value], TRUE, FALSE);
                 ${$bodyType} = CRM_Utils_Token::replaceHookTokens(${$bodyType}, $contact, $categories, TRUE);
             }
         }
         $html = $body_html;
         $text = $body_text;
         $smarty = CRM_Core_Smarty::singleton();
         foreach (array('text', 'html') as $elem) {
             ${$elem} = $smarty->fetch("string:{${$elem}}");
         }
         $matches = array();
         preg_match_all('/(?<!\\{|\\\\)\\{(\\w+\\.\\w+)\\}(?!\\})/', $body_subject, $matches, PREG_PATTERN_ORDER);
         $subjectToken = NULL;
         if ($matches[1]) {
             foreach ($matches[1] as $token) {
                 list($type, $name) = preg_split('/\\./', $token, 2);
                 if ($name) {
                     if (!isset($subjectToken['contact'])) {
                         $subjectToken['contact'] = array();
                     }
                     $subjectToken['contact'][] = $name;
                 }
             }
         }
         $messageSubject = CRM_Utils_Token::replaceContactTokens($body_subject, $contact, FALSE, $subjectToken);
         $messageSubject = CRM_Utils_Token::replaceDomainTokens($messageSubject, $domain, TRUE, $tokens[$value]);
         $messageSubject = CRM_Utils_Token::replaceComponentTokens($messageSubject, $contact, $tokens[$value], TRUE);
         $messageSubject = CRM_Utils_Token::replaceHookTokens($messageSubject, $contact, $categories, TRUE);
         $messageSubject = $smarty->fetch("string:{$messageSubject}");
         // set up the parameters for CRM_Utils_Mail::send
         $mailParams = array('groupName' => 'Scheduled Reminder Sender', 'from' => $from, 'toName' => $contact['display_name'], 'toEmail' => $email, 'subject' => $messageSubject);
         if (!$html || $contact['preferred_mail_format'] == 'Text' || $contact['preferred_mail_format'] == 'Both') {
             // render the &amp; entities in text mode, so that the links work
             $mailParams['text'] = str_replace('&amp;', '&', $text);
         }
         if ($html && ($contact['preferred_mail_format'] == 'HTML' || $contact['preferred_mail_format'] == 'Both')) {
             $mailParams['html'] = $html;
         }
         $result = CRM_Utils_Mail::send($mailParams);
     }
     $schedule->free();
     return $result;
 }
Ejemplo n.º 16
0
 /**
  * Send an email from the specified template based on an array of params
  *
  * @param array $params  a string-keyed array of function params, see function body for details
  *
  * @return array  of four parameters: a boolean whether the email was sent, and the subject, text and HTML templates
  */
 static function sendTemplate($params)
 {
     $defaults = array('groupName' => NULL, 'valueName' => NULL, 'messageTemplateID' => NULL, 'contactId' => NULL, 'tplParams' => array(), 'from' => NULL, 'toName' => NULL, 'toEmail' => NULL, 'cc' => NULL, 'bcc' => NULL, 'replyTo' => NULL, 'attachments' => NULL, 'isTest' => FALSE, 'PDFFilename' => NULL);
     $params = array_merge($defaults, $params);
     if ((!$params['groupName'] || !$params['valueName']) && !$params['messageTemplateID']) {
         CRM_Core_Error::fatal(ts("Message template's option group and/or option value or ID missing."));
     }
     if ($params['messageTemplateID']) {
         // fetch the three elements from the db based on id
         $query = 'SELECT msg_subject subject, msg_text text, msg_html html, pdf_format_id format
                   FROM civicrm_msg_template mt
                   WHERE mt.id = %1 AND mt.is_default = 1';
         $sqlParams = array(1 => array($params['messageTemplateID'], 'String'));
     } else {
         // fetch the three elements from the db based on option_group and option_value names
         $query = 'SELECT msg_subject subject, msg_text text, msg_html html, pdf_format_id format
                   FROM civicrm_msg_template mt
                   JOIN civicrm_option_value ov ON workflow_id = ov.id
                   JOIN civicrm_option_group og ON ov.option_group_id = og.id
                   WHERE og.name = %1 AND ov.name = %2 AND mt.is_default = 1';
         $sqlParams = array(1 => array($params['groupName'], 'String'), 2 => array($params['valueName'], 'String'));
     }
     $dao = CRM_Core_DAO::executeQuery($query, $sqlParams);
     $dao->fetch();
     if (!$dao->N) {
         if ($params['messageTemplateID']) {
             CRM_Core_Error::fatal(ts('No such message template: id=%1.', array(1 => $params['messageTemplateID'])));
         } else {
             CRM_Core_Error::fatal(ts('No such message template: option group %1, option value %2.', array(1 => $params['groupName'], 2 => $params['valueName'])));
         }
     }
     $subject = $dao->subject;
     $text = $dao->text;
     $html = $dao->html;
     $format = $dao->format;
     $dao->free();
     // add the test banner (if requested)
     if ($params['isTest']) {
         $query = "SELECT msg_subject subject, msg_text text, msg_html html\n                      FROM civicrm_msg_template mt\n                      JOIN civicrm_option_value ov ON workflow_id = ov.id\n                      JOIN civicrm_option_group og ON ov.option_group_id = og.id\n                      WHERE og.name = 'msg_tpl_workflow_meta' AND ov.name = 'test_preview' AND mt.is_default = 1";
         $testDao = CRM_Core_DAO::executeQuery($query);
         $testDao->fetch();
         $subject = $testDao->subject . $subject;
         $text = $testDao->text . $text;
         $html = preg_replace('/<body(.*)$/im', "<body\\1\n{$testDao->html}", $html);
         $testDao->free();
     }
     // replace tokens in the three elements (in subject as if it was the text body)
     $domain = CRM_Core_BAO_Domain::getDomain();
     $hookTokens = array();
     $mailing = new CRM_Mailing_BAO_Mailing();
     $mailing->body_text = $text;
     $mailing->body_html = $html;
     $tokens = $mailing->getTokens();
     CRM_Utils_Hook::tokens($hookTokens);
     $categories = array_keys($hookTokens);
     $contactID = CRM_Utils_Array::value('contactId', $params);
     if ($contactID) {
         $contactParams = array('contact_id' => $contactID);
         $returnProperties = array();
         if (isset($tokens['text']['contact'])) {
             foreach ($tokens['text']['contact'] as $name) {
                 $returnProperties[$name] = 1;
             }
         }
         if (isset($tokens['html']['contact'])) {
             foreach ($tokens['html']['contact'] as $name) {
                 $returnProperties[$name] = 1;
             }
         }
         list($contact) = CRM_Utils_Token::getTokenDetails($contactParams, $returnProperties, FALSE, FALSE, NULL, CRM_Utils_Token::flattenTokens($tokens), 'CRM_Core_BAO_MessageTemplate');
         $contact = $contact[$contactID];
     }
     $subject = CRM_Utils_Token::replaceDomainTokens($subject, $domain, TRUE, $tokens['text'], TRUE);
     $text = CRM_Utils_Token::replaceDomainTokens($text, $domain, TRUE, $tokens['text'], TRUE);
     $html = CRM_Utils_Token::replaceDomainTokens($html, $domain, TRUE, $tokens['html'], TRUE);
     if ($contactID) {
         $subject = CRM_Utils_Token::replaceContactTokens($subject, $contact, FALSE, $tokens['text'], FALSE, TRUE);
         $text = CRM_Utils_Token::replaceContactTokens($text, $contact, FALSE, $tokens['text'], FALSE, TRUE);
         $html = CRM_Utils_Token::replaceContactTokens($html, $contact, FALSE, $tokens['html'], FALSE, TRUE);
         $contactArray = array($contactID => $contact);
         CRM_Utils_Hook::tokenValues($contactArray, array($contactID), NULL, CRM_Utils_Token::flattenTokens($tokens), 'CRM_Core_BAO_MessageTemplate');
         $contact = $contactArray[$contactID];
         $subject = CRM_Utils_Token::replaceHookTokens($subject, $contact, $categories, TRUE);
         $text = CRM_Utils_Token::replaceHookTokens($text, $contact, $categories, TRUE);
         $html = CRM_Utils_Token::replaceHookTokens($html, $contact, $categories, TRUE);
     }
     // strip whitespace from ends and turn into a single line
     $subject = "{strip}{$subject}{/strip}";
     // parse the three elements with Smarty
     $smarty = CRM_Core_Smarty::singleton();
     foreach ($params['tplParams'] as $name => $value) {
         $smarty->assign($name, $value);
     }
     foreach (array('subject', 'text', 'html') as $elem) {
         ${$elem} = $smarty->fetch("string:{${$elem}}");
     }
     // send the template, honouring the target user’s preferences (if any)
     $sent = FALSE;
     // create the params array
     $params['subject'] = $subject;
     $params['text'] = $text;
     $params['html'] = $html;
     if ($params['toEmail']) {
         $contactParams = array(array('email', 'LIKE', $params['toEmail'], 0, 1));
         list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($contactParams);
         $prefs = array_pop($contact);
         if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] == 'HTML') {
             $params['text'] = NULL;
         }
         if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] == 'Text') {
             $params['html'] = NULL;
         }
         $config = CRM_Core_Config::singleton();
         $pdf_filename = '';
         if ($config->doNotAttachPDFReceipt && $params['PDFFilename'] && $params['html']) {
             $pdf_filename = $config->templateCompileDir . CRM_Utils_File::makeFileName($params['PDFFilename']);
             //FIXME : CRM-7894
             //xmlns attribute is required in XHTML but it is invalid in HTML,
             //Also the namespace "xmlns=http://www.w3.org/1999/xhtml" is default,
             //and will be added to the <html> tag even if you do not include it.
             $html = preg_replace('/(<html)(.+?xmlns=["\'].[^\\s]+["\'])(.+)?(>)/', '\\1\\3\\4', $params['html']);
             file_put_contents($pdf_filename, CRM_Utils_PDF_Utils::html2pdf($html, $params['PDFFilename'], TRUE, $format));
             if (empty($params['attachments'])) {
                 $params['attachments'] = array();
             }
             $params['attachments'][] = array('fullPath' => $pdf_filename, 'mime_type' => 'application/pdf', 'cleanName' => $params['PDFFilename']);
         }
         $sent = CRM_Utils_Mail::send($params);
         if ($pdf_filename) {
             unlink($pdf_filename);
         }
     }
     return array($sent, $subject, $text, $html);
 }
 static function civicrm_direct_debit_civicrm_pageRun_produceSetUpLetter($mandate_id, $contact_id, $default_template, $return_content = false, $contribution_id, $first_collectionDate)
 {
     //$sql = "SELECT * FROM civicrm_value_bank_details WHERE id = %1";
     //$params  = array( 1 => array( $entity_id , 'Integer' ));
     //$dao = CRM_Core_DAO::executeQuery( $sql, $params );
     //$dao->fetch( )
     //$contribution_id = $dao->entity_id;
     ## Get the contribution details
     //require_once 'CRM/Contribute/DAO/Contribution.php';
     //$contribution_dao =& new CRM_Contribute_DAO_Contribution( );
     //$contribution_dao->get($contribution_id);
     //$contribution_date = $contribution_dao->receive_date;
     //$contribution_date = strtotime(date("d/m/Y", strtotime($contribution_date)));
     //$contribution_date = date('mdY', $contribution_date);
     //require_once 'CRM/Core/DAO';
     $fiscal_template = $default_template;
     $date = date('d/m/y');
     //$amount = $dao->amount;
     require_once 'CRM/Contribute/DAO/Contribution.php';
     $contrib_dao = new CRM_Contribute_DAO_Contribution();
     $contrib_dao->id = $contribution_id;
     $contrib_dao->find(true);
     require_once "api/v2/Contact.php";
     $contactParams = array('id' => $contact_id);
     $contact =& civicrm_contact_get($contactParams);
     require_once "CRM/Mailing/BAO/Mailing.php";
     $mailing = new CRM_Mailing_BAO_Mailing();
     $mailing->body_text = $fiscal_template;
     $mailing->body_html = $fiscal_template;
     $tokens = $mailing->getTokens();
     //print_r ($tokens);exit;
     require_once "CRM/Utils/Token.php";
     if ($contact_id) {
         $fiscal_template = CRM_Utils_Token::replaceContactTokens($fiscal_template, $contact, false, $tokens['html']);
     }
     //$address = preg_replace("/\n/","<br>",$dao->address);
     $mandate_sql = "SELECT * FROM civicrm_value_bank_details bd WHERE bd.id = %1";
     $mandate_params = array(1 => array($mandate_id, 'Integer'));
     $mandate_dao = CRM_Core_DAO::executeQuery($mandate_sql, $mandate_params);
     $mandate_dao->fetch();
     $day_of_collection = $_ENV['collectionDayArray'][$mandate_dao->collection_day] . " of every month";
     $fiscal_template = str_replace('{invoice_number}', $receipt_number, $fiscal_template);
     $fiscal_template = str_replace('{invoice_date}', $date, $fiscal_template);
     $fiscal_template = str_replace('{amount}', $contrib_dao->total_amount, $fiscal_template);
     $fiscal_template = str_replace('{first_collection_date}', $first_collectionDate, $fiscal_template);
     $fiscal_template = str_replace('{day_of_collection}', $day_of_collection, $fiscal_template);
     $fiscal_template = str_replace('{account_name}', $mandate_dao->account_name, $fiscal_template);
     $fiscal_template = str_replace('{account_number}', $mandate_dao->account_number, $fiscal_template);
     $fiscal_template = str_replace('{sort_code}', $mandate_dao->sort_code, $fiscal_template);
     $final_template = $fiscal_template;
     //$final_template .= "<div STYLE='page-break-after: always'></div>";
     //echo $final_template;exit;
     $file_name = "SetUp_Letter_" . $contact_id . ".pdf";
     $fileContent = self::civicrm_direct_debit_civicrm_pageRun_html2pdf($final_template, $file_name, "external");
     require_once "CRM/Core/Config.php";
     $config =& CRM_Core_Config::singleton();
     $csv_path = $config->customFileUploadDir;
     //$csv_path = "sites/default/files/civicrm/custom";
     $filePathName = "{$csv_path}/{$file_name}";
     $handle = fopen($filePathName, 'w');
     file_put_contents($filePathName, $fileContent);
     fclose($handle);
     return array('content' => $final_template, 'file_name' => $file_name);
     /*if ($return_content)
           return $final_template;  
       else
           return $file_name;*/
 }
Ejemplo n.º 18
0
 /**
  * Process the user submitted custom data values.
  *
  *
  * @return void
  */
 public function postProcess()
 {
     parent::postProcess();
     $displayName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_id, 'display_name');
     $sortName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_id, 'sort_name');
     $this->ajaxResponse['label'] = $sortName;
     // When saving (not deleting) and not in an ajax popup
     if (empty($_POST[$this->_deleteButtonName]) && $this->_context != 'dialog') {
         CRM_Core_Session::setStatus(ts('Your information has been saved.'), ts('Thank you.'), 'success');
     }
     $session = CRM_Core_Session::singleton();
     // only replace user context if we do not have a postURL
     if (!$this->_postURL) {
         $gidString = $this->_gid;
         if (!empty($this->_profileIds)) {
             $gidString = implode(',', $this->_profileIds);
         }
         $urlParams = "reset=1&id={$this->_id}&gid={$gidString}";
         if ($this->_isContactActivityProfile && $this->_activityId) {
             $urlParams .= "&aid={$this->_activityId}";
         }
         // Get checksum if present
         if ($this->get('cs')) {
             $urlParams .= "&cs=" . $this->get('cs');
         } elseif (!CRM_Contact_BAO_Contact_Permission::allow($this->_id)) {
             $urlParams .= "&cs=" . CRM_Contact_BAO_Contact_Utils::generateChecksum($this->_id);
         }
         $url = CRM_Utils_System::url('civicrm/profile/view', $urlParams);
     } else {
         // Replace tokens from post URL
         $contactParams = array('contact_id' => $this->_id, 'version' => 3);
         $contact = civicrm_api('contact', 'get', $contactParams);
         $contact = reset($contact['values']);
         $dummyMail = new CRM_Mailing_BAO_Mailing();
         $dummyMail->body_text = $this->_postURL;
         $tokens = $dummyMail->getTokens();
         $url = CRM_Utils_Token::replaceContactTokens($this->_postURL, $contact, FALSE, CRM_Utils_Array::value('text', $tokens));
     }
     $session->replaceUserContext($url);
 }
Ejemplo n.º 19
0
 /**
  * replace greeting tokens exists in message/subject
  *     
  * @access public
  */
 function replaceGreetingTokens(&$tokenString, $contactDetails = null, $contactId = null)
 {
     if (!$contactDetails && !$contactId) {
         return;
     }
     // check if there are any tokens
     $greetingTokens = self::getTokens($tokenString);
     if (!empty($greetingTokens)) {
         // first use the existing contact object for token replacement
         if (!empty($contactDetails)) {
             require_once 'CRM/Utils/Token.php';
             $tokenString = CRM_Utils_Token::replaceContactTokens($tokenString, $contactDetails, true, $greetingTokens, true);
         }
         // check if there are any unevaluated tokens
         $greetingTokens = self::getTokens($tokenString);
         // $greetingTokens not empty, means there are few tokens which are not evaluated, like custom data etc
         // so retrieve it from database
         if (!empty($greetingTokens)) {
             $greetingsReturnProperties = array_flip(CRM_Utils_Array::value('contact', $greetingTokens));
             $greetingsReturnProperties = array_fill_keys(array_keys($greetingsReturnProperties), 1);
             $contactParams = array('contact_id' => $contactId);
             require_once 'CRM/Mailing/BAO/Mailing.php';
             $greetingDetails = CRM_Mailing_BAO_Mailing::getDetails($contactParams, $greetingsReturnProperties, false, false);
             // again replace tokens
             $tokenString = CRM_Utils_Token::replaceContactTokens($tokenString, $greetingDetails, true, $greetingTokens);
         }
     }
 }
Ejemplo n.º 20
0
 /**
  * Compose a message
  *
  * @param int $job_id           ID of the Job associated with this message
  * @param int $event_queue_id   ID of the EventQueue
  * @param string $hash          Hash of the EventQueue
  * @param string $contactId     ID of the Contact
  * @param string $email         Destination address
  * @param string $recipient     To: of the recipient
  * @param boolean $test         Is this mailing a test?
  * @return object               The mail object
  * @access public
  */
 function &compose($job_id, $event_queue_id, $hash, $contactId, $email, &$recipient, $test = false)
 {
     if ($test) {
         $job_id = 'JOB';
         $event_queue_id = 'QUEUE';
         $hash = 'HASH';
     }
     if ($this->_domain == null) {
         require_once 'CRM/Core/BAO/Domain.php';
         $this->_domain =& CRM_Core_BAO_Domain::getDomainByID($this->domain_id);
     }
     /**
      * Inbound VERP keys:
      *  reply:          user replied to mailing
      *  bounce:         email address bounced
      *  unsubscribe:    contact opts out of all target lists for the mailing
      *  optOut:         contact unsubscribes from the domain
      */
     $config =& CRM_Core_Config::singleton();
     foreach (array('reply', 'bounce', 'unsubscribe', 'optOut') as $key) {
         $verp[$key] = implode($config->verpSeparator, array($key, $job_id, $event_queue_id, $hash)) . '@' . $this->_domain->email_domain;
     }
     $urls = array('forward' => CRM_Utils_System::url('civicrm/mailing/forward', "reset=1&jid={$job_id}&qid={$event_queue_id}&h={$hash}", true));
     $headers = array('Reply-To' => CRM_Utils_Verp::encode($verp['reply'], $email), 'Return-Path' => CRM_Utils_Verp::encode($verp['bounce'], $email), 'From' => "\"{$this->from_name}\" <{$this->from_email}>", 'Subject' => $this->subject);
     require_once 'CRM/Utils/Token.php';
     if ($this->html == null || $this->text == null) {
         $this->getHeaderFooter();
         if ($this->body_html) {
             $this->html = $this->header->body_html . '<br />' . $this->body_html . '<br />' . $this->footer->body_html;
             $this->html = CRM_Utils_Token::replaceDomainTokens($this->html, $this->_domain, true);
             $this->html = CRM_Utils_Token::replaceMailingTokens($this->html, $this, true);
         }
         $this->text = $this->header->body_text . "\n" . $this->body_text . "\n" . $this->footer->body_text;
         $this->text = CRM_Utils_Token::replaceDomainTokens($this->text, $this->_domain, false);
         $this->text = CRM_Utils_Token::replaceMailingTokens($this->text, $this, true);
     }
     $html = $this->html;
     $text = $this->text;
     if ($html && !$test && $this->url_tracking) {
         CRM_Mailing_BAO_TrackableURL::scan_and_replace($html, $this->id, $event_queue_id);
         CRM_Mailing_BAO_TrackableURL::scan_and_replace($text, $this->id, $event_queue_id);
     }
     $params = array('contact_id' => $contactId, 'id' => $contactId);
     $contact = array();
     $ids = array();
     CRM_Contact_BAO_Contact::retrieve($params, $contact, $ids);
     $message =& new Mail_Mime("\n");
     /* Do contact-specific token replacement in text mode, and add to the
      * message if necessary */
     if ($test || !$html || $contact['preferred_mail_format'] == 'Text' || $contact['preferred_mail_format'] == 'Both') {
         $text = CRM_Utils_Token::replaceContactTokens($text, $contact, false);
         $text = CRM_Utils_Token::replaceActionTokens($text, $verp, $urls, false);
         // render the &amp; entities in text mode, so that the links work
         $text = str_replace('&amp;', '&', $text);
         $message->setTxtBody($text);
     }
     /* Do contact-specific token replacement in html mode, and add to the
      * message if necessary */
     if ($html && ($test || $contact['preferred_mail_format'] == 'HTML' || $contact['preferred_mail_format'] == 'Both')) {
         $html = CRM_Utils_Token::replaceContactTokens($html, $contact, true);
         $html = CRM_Utils_Token::replaceActionTokens($html, $verp, $urls, true);
         if ($this->open_tracking) {
             $html .= '<img src="' . $config->userFrameworkResourceURL . "extern/open.php?q={$event_queue_id}\" width='1' height='1' alt='' border='0'>";
         }
         $message->setHTMLBody($html);
     }
     $recipient = "\"{$contact['display_name']}\" <{$email}>";
     $headers['To'] = $recipient;
     $mailMimeParams = array('text_encoding' => '8bit', 'html_encoding' => '8bit', 'head_charset' => 'utf-8', 'text_charset' => 'utf-8', 'html_charset' => 'utf-8');
     $message->get($mailMimeParams);
     $message->headers($headers);
     return $message;
 }
Ejemplo n.º 21
0
 /**
  *
  * @param string $html_message
  * @param array $contact
  * @param array $contribution
  * @param array $messageToken
  * @param array $categories
  * @param bool $grouped
  *   Does this letter represent more than one contribution.
  * @param string $separator
  *   What is the preferred letter separator.
  * @return string
  */
 private static function resolveTokens($html_message, $contact, $contribution, $messageToken, $categories, $grouped, $separator)
 {
     $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contact, TRUE, $messageToken);
     if ($grouped) {
         $tokenHtml = CRM_Utils_Token::replaceMultipleContributionTokens($separator, $tokenHtml, $contribution, TRUE, $messageToken);
     } else {
         // no change to normal behaviour to avoid risk of breakage
         $tokenHtml = CRM_Utils_Token::replaceContributionTokens($tokenHtml, $contribution, TRUE, $messageToken);
     }
     $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contact, $categories, TRUE);
     if (defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY) {
         $smarty = CRM_Core_Smarty::singleton();
         // also add the tokens to the template
         $smarty->assign_by_ref('contact', $contact);
         $tokenHtml = $smarty->fetch("string:{$tokenHtml}");
     }
     return $tokenHtml;
 }
Ejemplo n.º 22
0
 /**
  * Process the user submitted custom data values.
  *
  * @access public
  *
  * @return void
  */
 public function postProcess()
 {
     parent::postProcess();
     // this is special case when we create contact using Dialog box
     if ($this->_context == 'dialog') {
         $displayName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_id, 'display_name');
         $sortName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_id, 'sort_name');
         $returnArray = array('contactID' => $this->_id, 'displayName' => $displayName, 'sortName' => $sortName, 'newContactSuccess' => TRUE);
         echo json_encode($returnArray);
         CRM_Utils_System::civiExit();
     }
     //for delete record handling
     if (!CRM_Utils_Array::value($this->_deleteButtonName, $_POST)) {
         CRM_Core_Session::setStatus(ts('Your information has been saved.'), ts('Thank you.'), 'success');
     }
     $session = CRM_Core_Session::singleton();
     // only replace user context if we do not have a postURL
     if (!$this->_postURL) {
         $gidString = $this->_gid;
         if (!empty($this->_profileIds)) {
             $gidString = implode(',', $this->_profileIds);
         }
         $urlParams = "reset=1&id={$this->_id}&gid={$gidString}";
         if ($this->_isContactActivityProfile && $this->_activityId) {
             $urlParams .= "&aid={$this->_activityId}";
         }
         // Get checksum if present
         if ($this->get('cs')) {
             $urlParams .= "&cs=" . $this->get('cs');
         } elseif (!CRM_Contact_BAO_Contact_Permission::allow($this->_id)) {
             $urlParams .= "&cs=" . CRM_Contact_BAO_Contact_Utils::generateChecksum($this->_id);
         }
         $url = CRM_Utils_System::url('civicrm/profile/view', $urlParams);
     } else {
         // Replace tokens from post URL
         $contactParams = array('contact_id' => $this->_id, 'version' => 3);
         $contact = civicrm_api('contact', 'get', $contactParams);
         $contact = reset($contact['values']);
         $dummyMail = new CRM_Mailing_BAO_Mailing();
         $dummyMail->body_text = $this->_postURL;
         $tokens = $dummyMail->getTokens();
         $url = CRM_Utils_Token::replaceContactTokens($this->_postURL, $contact, FALSE, CRM_Utils_Array::value('text', $tokens));
     }
     $session->replaceUserContext($url);
 }
function sendInvoiceMail($email, $displayName, $fromEmail, $fileName, $filePathName, $obj, $contactID, $contribution)
{
    ## getting contact detail
    require_once 'api/v2/Contact.php';
    $contactParams = array('id' => $contactID);
    $contact =& civicrm_contact_get($contactParams);
    ## Check the contribution type to work out which email template we should be using
    //print_r($contribution); exit;
    $contributionTypeId = $contribution->contribution_type_id;
    if ($contributionTypeId == '2') {
        ##  Contribution Type - Membership
        $emailTemplateName = 'Membership Invoice';
        $params['bcc'] = '*****@*****.**';
    }
    if ($contributionTypeId == '4') {
        ##  Contribution Type - Events
        $emailTemplateName = 'Participant Invoice';
        $params['bcc'] = '*****@*****.**';
    }
    ## getting invoice mail template
    $query = "SELECT * FROM civicrm_msg_template WHERE msg_title = '{$emailTemplateName}' AND is_active=1";
    $dao = CRM_Core_DAO::executeQuery($query);
    if (!$dao->fetch()) {
        print "Not able to get Email Template";
        exit;
    }
    $text = $dao->msg_text;
    $html = $dao->msg_html;
    $subject = $dao->msg_subject;
    ###################################################
    require_once "CRM/Mailing/BAO/Mailing.php";
    $mailing = new CRM_Mailing_BAO_Mailing();
    $mailing->body_text = $text;
    $mailing->body_html = $html;
    $tokens = $mailing->getTokens();
    require_once "CRM/Utils/Token.php";
    $subject = CRM_Utils_Token::replaceDomainTokens($subject, $domain, true, $tokens['text']);
    $text = CRM_Utils_Token::replaceDomainTokens($text, $domain, true, $tokens['text']);
    $html = CRM_Utils_Token::replaceDomainTokens($html, $domain, true, $tokens['html']);
    if ($contactID) {
        $subject = CRM_Utils_Token::replaceContactTokens($subject, $contact, false, $tokens['text']);
        $text = CRM_Utils_Token::replaceContactTokens($text, $contact, false, $tokens['text']);
        $html = CRM_Utils_Token::replaceContactTokens($html, $contact, false, $tokens['html']);
    }
    // parse the three elements with Smarty
    require_once 'CRM/Core/Smarty/resources/String.php';
    civicrm_smarty_register_string_resource();
    $smarty =& CRM_Core_Smarty::singleton();
    foreach ($params['tplParams'] as $name => $value) {
        $smarty->assign($name, $value);
    }
    ###################################################
    $params['text'] = $text;
    $params['html'] = $html;
    $params['subject'] = $subject;
    // assigning from email
    $params['from'] = $fromEmail;
    #### live ###### uncomment it
    $params['toName'] = $displayName;
    $params['toEmail'] = $email;
    #### test ###### comment it
    #$params['toName']       = "Test";
    #$params['toEmail']      = '*****@*****.**';
    # Left this in as hard coded for now as the default from email address doesn't seem to work
    # We can probably do something with the contribution type for the from email addresses
    $params['from'] = '*****@*****.**';
    $attach = array('fullPath' => $filePathName, 'mime_type' => 'pdf', 'cleanName' => $fileName);
    ## Commented out to test if attachments are causing the problem
    $params['attachments'] = array($fileName => $attach);
    require_once 'CRM/Utils/Mail.php';
    // Comment to abort sending email
    $sent = CRM_Utils_Mail::send($params);
    if ($sent) {
        echo "<br />Invoice sent <b>successfully</b> - {$email}</b><br /><br />";
        ## Insert a record into Log table - civicrm_mtl_invoice_log
        $contribution_id = $contribution->id;
    } else {
        echo "<br />Invoice sent <b>faliure</b> - <b>{$email}</b>{$sent->message}<br /><br />";
    }
    //please comment this before setting up in LIVE
    //exit;
}
 /**
  * process the form after the input has been submitted and validated
  *
  * @access public
  *
  * @return None
  */
 static function postProcess(&$form)
 {
     list($formValues, $categories, $html_message, $messageToken, $returnProperties) = self::processMessageTemplate($form);
     $skipOnHold = isset($form->skipOnHold) ? $form->skipOnHold : FALSE;
     $skipDeceased = isset($form->skipDeceased) ? $form->skipDeceased : TRUE;
     foreach ($form->_contactIds as $item => $contactId) {
         $params = array('contact_id' => $contactId);
         list($contact) = CRM_Utils_Token::getTokenDetails($params, $returnProperties, $skipOnHold, $skipDeceased, NULL, $messageToken, 'CRM_Contact_Form_Task_PDFLetterCommon');
         if (civicrm_error($contact)) {
             $notSent[] = $contactId;
             continue;
         }
         $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contact[$contactId], TRUE, $messageToken);
         $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contact[$contactId], $categories, TRUE);
         if (defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY) {
             $smarty = CRM_Core_Smarty::singleton();
             // also add the contact tokens to the template
             $smarty->assign_by_ref('contact', $contact);
             $tokenHtml = $smarty->fetch("string:{$tokenHtml}");
         }
         $html[] = $tokenHtml;
     }
     self::createActivities($form, $html_message, $form->_contactIds);
     CRM_Utils_PDF_Utils::html2pdf($html, "CiviLetter.pdf", FALSE, $formValues);
     $form->postProcessHook();
     CRM_Utils_System::civiExit(1);
 }
Ejemplo n.º 25
0
 /**
  * Validation.
  *
  * @param array $params
  *   (ref.) an assoc array of name/value pairs.
  *
  * @param $files
  * @param $self
  *
  * @return bool|array
  *   mixed true or array of errors
  */
 public static function formRule($params, $files, $self)
 {
     if (!empty($_POST['_qf_Import_refresh'])) {
         return TRUE;
     }
     $errors = array();
     $template = CRM_Core_Smarty::singleton();
     if (isset($params['html_message'])) {
         $htmlMessage = str_replace(array("\n", "\r"), ' ', $params['html_message']);
         $htmlMessage = str_replace("'", "\\'", $htmlMessage);
         $template->assign('htmlContent', $htmlMessage);
     }
     $domain = CRM_Core_BAO_Domain::getDomain();
     $mailing = new CRM_Mailing_BAO_Mailing();
     $mailing->id = $self->_mailingID;
     $mailing->find(TRUE);
     $session = CRM_Core_Session::singleton();
     $values = array('contact_id' => $session->get('userID'), 'version' => 3);
     require_once 'api/api.php';
     $contact = civicrm_api('contact', 'get', $values);
     //CRM-4524
     $contact = reset($contact['values']);
     $verp = array_flip(array('optOut', 'reply', 'unsubscribe', 'resubscribe', 'owner'));
     foreach ($verp as $key => $value) {
         $verp[$key]++;
     }
     $urls = array_flip(array('forward', 'optOutUrl', 'unsubscribeUrl', 'resubscribeUrl'));
     foreach ($urls as $key => $value) {
         $urls[$key]++;
     }
     // set $header and $footer
     foreach (array('header', 'footer') as $part) {
         ${$part} = array();
         if ($params["{$part}_id"]) {
             //echo "found<p>";
             $component = new CRM_Mailing_BAO_Component();
             $component->id = $params["{$part}_id"];
             $component->find(TRUE);
             ${$part}['textFile'] = $component->body_text;
             ${$part}['htmlFile'] = $component->body_html;
             $component->free();
         } else {
             ${$part}['htmlFile'] = ${$part}['textFile'] = '';
         }
     }
     $skipTextFile = $self->get('skipTextFile');
     $skipHtmlFile = $self->get('skipHtmlFile');
     if (!$params['upload_type']) {
         if ((!isset($files['textFile']) || !file_exists($files['textFile']['tmp_name'])) && (!isset($files['htmlFile']) || !file_exists($files['htmlFile']['tmp_name']))) {
             if (!($skipTextFile || $skipHtmlFile)) {
                 $errors['textFile'] = ts('Please provide either a Text or HTML formatted message - or both.');
             }
         }
     } else {
         if (empty($params['text_message']) && empty($params['html_message'])) {
             $errors['html_message'] = ts('Please provide either a Text or HTML formatted message - or both.');
         }
         if (!empty($params['saveTemplate']) && empty($params['saveTemplateName'])) {
             $errors['saveTemplateName'] = ts('Please provide a Template Name.');
         }
     }
     foreach (array('text', 'html') as $file) {
         if (!$params['upload_type'] && !file_exists(CRM_Utils_Array::value('tmp_name', $files[$file . 'File']))) {
             continue;
         }
         if ($params['upload_type'] && !$params[$file . '_message']) {
             continue;
         }
         if (!$params['upload_type']) {
             $str = file_get_contents($files[$file . 'File']['tmp_name']);
             $name = $files[$file . 'File']['name'];
         } else {
             $str = $params[$file . '_message'];
             $str = $file == 'html' ? str_replace('%7B', '{', str_replace('%7D', '}', $str)) : $str;
             $name = $file . ' message';
         }
         /* append header/footer */
         $str = $header[$file . 'File'] . $str . $footer[$file . 'File'];
         $dataErrors = array();
         /* First look for missing tokens */
         if (!CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME, 'disable_mandatory_tokens_check')) {
             $err = CRM_Utils_Token::requiredTokens($str);
             if ($err !== TRUE) {
                 foreach ($err as $token => $desc) {
                     $dataErrors[] = '<li>' . ts('This message is missing a required token - {%1}: %2', array(1 => $token, 2 => $desc)) . '</li>';
                 }
             }
         }
         /* Do a full token replacement on a dummy verp, the current
          * contact and domain, and the first organization. */
         // here we make a dummy mailing object so that we
         // can retrieve the tokens that we need to replace
         // so that we do get an invalid token error
         // this is qute hacky and I hope that there might
         // be a suggestion from someone on how to
         // make it a bit more elegant
         $dummy_mail = new CRM_Mailing_BAO_Mailing();
         $mess = "body_{$file}";
         $dummy_mail->{$mess} = $str;
         $tokens = $dummy_mail->getTokens();
         $str = CRM_Utils_Token::replaceSubscribeInviteTokens($str);
         $str = CRM_Utils_Token::replaceDomainTokens($str, $domain, NULL, $tokens[$file]);
         $str = CRM_Utils_Token::replaceMailingTokens($str, $mailing, NULL, $tokens[$file]);
         $str = CRM_Utils_Token::replaceOrgTokens($str, $org);
         $str = CRM_Utils_Token::replaceActionTokens($str, $verp, $urls, NULL, $tokens[$file]);
         $str = CRM_Utils_Token::replaceContactTokens($str, $contact, NULL, $tokens[$file]);
         $unmatched = CRM_Utils_Token::unmatchedTokens($str);
         if (!empty($unmatched) && 0) {
             foreach ($unmatched as $token) {
                 $dataErrors[] = '<li>' . ts('Invalid token code') . ' {' . $token . '}</li>';
             }
         }
         if (!empty($dataErrors)) {
             $errors[$file . 'File'] = ts('The following errors were detected in %1:', array(1 => $name)) . ' <ul>' . implode('', $dataErrors) . '</ul><br /><a href="' . CRM_Utils_System::docURL2('Sample CiviMail Messages', TRUE, NULL, NULL, NULL, "wiki") . '" target="_blank">' . ts('More information on required tokens...') . '</a>';
         }
     }
     $templateName = CRM_Core_BAO_MessageTemplate::getMessageTemplates();
     if (!empty($params['saveTemplate']) && in_array(CRM_Utils_Array::value('saveTemplateName', $params), $templateName)) {
         $errors['saveTemplate'] = ts('Duplicate Template Name.');
     }
     return empty($errors) ? TRUE : $errors;
 }
Ejemplo n.º 26
0
 /**
  * replace greeting tokens exists in message/subject
  *
  * @access public
  */
 static function replaceGreetingTokens(&$tokenString, $contactDetails = NULL, $contactId = NULL, $className = NULL)
 {
     if (!$contactDetails && !$contactId) {
         return;
     }
     // check if there are any tokens
     $greetingTokens = self::getTokens($tokenString);
     if (!empty($greetingTokens)) {
         // first use the existing contact object for token replacement
         if (!empty($contactDetails)) {
             $tokenString = CRM_Utils_Token::replaceContactTokens($tokenString, $contactDetails, TRUE, $greetingTokens, TRUE);
         }
         // check if there are any unevaluated tokens
         $greetingTokens = self::getTokens($tokenString);
         // $greetingTokens not empty, means there are few tokens which are not evaluated, like custom data etc
         // so retrieve it from database
         if (!empty($greetingTokens) && array_key_exists('contact', $greetingTokens)) {
             $greetingsReturnProperties = array_flip(CRM_Utils_Array::value('contact', $greetingTokens));
             $greetingsReturnProperties = array_fill_keys(array_keys($greetingsReturnProperties), 1);
             $contactParams = array('contact_id' => $contactId);
             $greetingDetails = self::getTokenDetails($contactParams, $greetingsReturnProperties, FALSE, FALSE, NULL, $greetingTokens, $className);
             // again replace tokens
             $tokenString = CRM_Utils_Token::replaceContactTokens($tokenString, $greetingDetails, TRUE, $greetingTokens);
         }
     }
 }
Ejemplo n.º 27
0
 /**
  * Send SMS.
  *
  * @param array $contactDetails
  * @param array $activityParams
  * @param array $smsParams
  * @param $contactIds
  * @param int $userID
  *
  * @return array
  * @throws CRM_Core_Exception
  */
 public static function sendSMS(&$contactDetails, &$activityParams, &$smsParams = array(), &$contactIds, $userID = NULL)
 {
     if ($userID == NULL) {
         $session = CRM_Core_Session::singleton();
         $userID = $session->get('userID');
     }
     $text =& $activityParams['sms_text_message'];
     // CRM-4575
     // token replacement of addressee/email/postal greetings
     // get the tokens added in subject and message
     $messageToken = CRM_Utils_Token::getTokens($text);
     // Create the meta level record first ( sms activity )
     $activityTypeID = CRM_Core_OptionGroup::getValue('activity_type', 'SMS', 'name');
     $details = $text;
     $activitySubject = $activityParams['activity_subject'];
     $activityParams = array('source_contact_id' => $userID, 'activity_type_id' => $activityTypeID, 'activity_date_time' => date('YmdHis'), 'subject' => $activitySubject, 'details' => $details, 'status_id' => 2);
     $activity = self::create($activityParams);
     $activityID = $activity->id;
     $returnProperties = array();
     if (isset($messageToken['contact'])) {
         foreach ($messageToken['contact'] as $key => $value) {
             $returnProperties[$value] = 1;
         }
     }
     // call token hook
     $tokens = array();
     CRM_Utils_Hook::tokens($tokens);
     $categories = array_keys($tokens);
     // get token details for contacts, call only if tokens are used
     $details = array();
     if (!empty($returnProperties) || !empty($tokens)) {
         list($details) = CRM_Utils_Token::getTokenDetails($contactIds, $returnProperties, NULL, NULL, FALSE, $messageToken, 'CRM_Activity_BAO_Activity');
     }
     $success = 0;
     $escapeSmarty = FALSE;
     $errMsgs = array();
     foreach ($contactDetails as $values) {
         $contactId = $values['contact_id'];
         if (!empty($details) && is_array($details["{$contactId}"])) {
             // unset email from details since it always returns primary email address
             unset($details["{$contactId}"]['email']);
             unset($details["{$contactId}"]['email_id']);
             $values = array_merge($values, $details["{$contactId}"]);
         }
         $tokenText = CRM_Utils_Token::replaceContactTokens($text, $values, FALSE, $messageToken, FALSE, $escapeSmarty);
         $tokenText = CRM_Utils_Token::replaceHookTokens($tokenText, $values, $categories, FALSE, $escapeSmarty);
         // Only send if the phone is of type mobile
         $phoneTypes = CRM_Core_OptionGroup::values('phone_type', TRUE, FALSE, FALSE, NULL, 'name');
         if ($values['phone_type_id'] == CRM_Utils_Array::value('Mobile', $phoneTypes)) {
             $smsParams['To'] = $values['phone'];
         } else {
             $smsParams['To'] = '';
         }
         $sendResult = self::sendSMSMessage($contactId, $tokenText, $smsParams, $activityID, $userID);
         if (PEAR::isError($sendResult)) {
             // Collect all of the PEAR_Error objects
             $errMsgs[] = $sendResult;
         } else {
             $success++;
         }
     }
     // If at least one message was sent and no errors
     // were generated then return a boolean value of TRUE.
     // Otherwise, return FALSE (no messages sent) or
     // and array of 1 or more PEAR_Error objects.
     $sent = FALSE;
     if ($success > 0 && count($errMsgs) == 0) {
         $sent = TRUE;
     } elseif (count($errMsgs) > 0) {
         $sent = $errMsgs;
     }
     return array($sent, $activity->id, $success);
 }
Ejemplo n.º 28
0
 /**
  * Send an email from the specified template based on an array of params
  *
  * @param array $params  a string-keyed array of function params, see function body for details
  *
  * @return array  of four parameters: a boolean whether the email was sent, and the subject, text and HTML templates
  */
 static function sendTemplate($params)
 {
     $defaults = array('groupName' => null, 'valueName' => null, 'contactId' => null, 'tplParams' => array(), 'from' => null, 'toName' => null, 'toEmail' => null, 'cc' => null, 'bcc' => null, 'replyTo' => null, 'attachments' => null, 'isTest' => false);
     $params = array_merge($defaults, $params);
     if (!$params['groupName'] or !$params['valueName']) {
         CRM_Core_Error::fatal(ts("Message template's option group and/or option value missing."));
     }
     // fetch the three elements from the db based on option_group and option_value names
     $query = 'SELECT msg_subject subject, msg_text text, msg_html html
               FROM civicrm_msg_template mt
               JOIN civicrm_option_value ov ON workflow_id = ov.id
               JOIN civicrm_option_group og ON ov.option_group_id = og.id
               WHERE og.name = %1 AND ov.name = %2 AND mt.is_default = 1';
     $sqlParams = array(1 => array($params['groupName'], 'String'), 2 => array($params['valueName'], 'String'));
     $dao = CRM_Core_DAO::executeQuery($query, $sqlParams);
     $dao->fetch();
     if (!$dao->N) {
         CRM_Core_Error::fatal(ts('No such message template: option group %1, option value %2.', array(1 => $params['groupName'], 2 => $params['valueName'])));
     }
     $subject = $dao->subject;
     $text = $dao->text;
     $html = $dao->html;
     // add the test banner (if requested)
     if ($params['isTest']) {
         $query = "SELECT msg_subject subject, msg_text text, msg_html html\n                      FROM civicrm_msg_template mt\n                      JOIN civicrm_option_value ov ON workflow_id = ov.id\n                      JOIN civicrm_option_group og ON ov.option_group_id = og.id\n                      WHERE og.name = 'msg_tpl_workflow_meta' AND ov.name = 'test_preview' AND mt.is_default = 1";
         $testDao = CRM_Core_DAO::executeQuery($query);
         $testDao->fetch();
         $subject = $testDao->subject . $subject;
         $text = $testDao->text . $text;
         $html = preg_replace('/<body(.*)$/im', "<body\\1\n{$testDao->html}", $html);
     }
     // replace tokens in the three elements
     require_once 'CRM/Utils/Token.php';
     require_once 'CRM/Core/BAO/Domain.php';
     require_once 'api/v2/Contact.php';
     require_once 'CRM/Mailing/BAO/Mailing.php';
     $domain = CRM_Core_BAO_Domain::getDomain();
     if ($params['contactId']) {
         $contactParams = array('contact_id' => $params['contactId']);
         $contact =& civicrm_contact_get($contactParams);
     }
     // replace tokens in subject as if it was the text body
     foreach (array('subject' => 'text', 'text' => 'text', 'html' => 'html') as $type => $tokenType) {
         if (!${$type}) {
             continue;
         }
         // skip all of the below if the given part is missing
         $bodyType = "body_{$tokenType}";
         $mailing = new CRM_Mailing_BAO_Mailing();
         $mailing->{$bodyType} = ${$type};
         $tokens = $mailing->getTokens();
         ${$type} = CRM_Utils_Token::replaceDomainTokens(${$type}, $domain, true, $tokens[$tokenType]);
         if ($params['contactId']) {
             ${$type} = CRM_Utils_Token::replaceContactTokens(${$type}, $contact, false, $tokens[$tokenType]);
         }
     }
     // strip whitespace from ends and turn into a single line
     $subject = "{strip}{$subject}{/strip}";
     // parse the three elements with Smarty
     require_once 'CRM/Core/Smarty/resources/String.php';
     civicrm_smarty_register_string_resource();
     $smarty =& CRM_Core_Smarty::singleton();
     foreach ($params['tplParams'] as $name => $value) {
         $smarty->assign($name, $value);
     }
     foreach (array('subject', 'text', 'html') as $elem) {
         ${$elem} = $smarty->fetch("string:{${$elem}}");
     }
     // send the template, honouring the target user’s preferences (if any)
     $sent = false;
     if ($params['toEmail']) {
         $contactParams = array('email' => $params['toEmail']);
         $contact =& civicrm_contact_get($contactParams);
         $prefs = array_pop($contact);
         if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] == 'HTML') {
             $text = null;
         }
         if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] == 'Text') {
             $html = null;
         }
         require_once 'CRM/Utils/Mail.php';
         $sent = CRM_Utils_Mail::send($params['from'], $params['toName'], $params['toEmail'], $subject, $text, $params['cc'], $params['bcc'], $params['replyTo'], $html, $params['attachments']);
     }
     return array($sent, $subject, $text, $html);
 }
Ejemplo n.º 29
0
 /**
  * @param int $contactId
  * @param array $exportParams
  *
  * @return array
  */
 public static function _replaceMergeTokens($contactId, $exportParams)
 {
     $greetings = array();
     $contact = NULL;
     $greetingFields = array('postal_greeting', 'addressee');
     foreach ($greetingFields as $greeting) {
         if (!empty($exportParams[$greeting])) {
             $greetingLabel = $exportParams[$greeting];
             if (empty($contact)) {
                 $values = array('id' => $contactId, 'version' => 3);
                 $contact = civicrm_api('contact', 'get', $values);
                 if (!empty($contact['is_error'])) {
                     return $greetings;
                 }
                 $contact = $contact['values'][$contact['id']];
             }
             $tokens = array('contact' => $greetingLabel);
             $greetings[$greeting] = CRM_Utils_Token::replaceContactTokens($greetingLabel, $contact, NULL, $tokens);
         }
     }
     return $greetings;
 }
Ejemplo n.º 30
0
 /**
  * Process the form after the input has been submitted and validated.
  *
  * @param CRM_Core_Form $form
  */
 public static function postProcess(&$form)
 {
     $formValues = $form->controller->exportValues($form->getName());
     list($formValues, $categories, $html_message, $messageToken, $returnProperties) = self::processMessageTemplate($formValues);
     $buttonName = $form->controller->getButtonName();
     $skipOnHold = isset($form->skipOnHold) ? $form->skipOnHold : FALSE;
     $skipDeceased = isset($form->skipDeceased) ? $form->skipDeceased : TRUE;
     $html = $document = array();
     // CRM-16725 Skip creation of activities if user is previewing their PDF letter(s)
     if ($buttonName == '_qf_PDF_upload') {
         self::createActivities($form, $html_message, $form->_contactIds);
     }
     if (!empty($formValues['document_file_path'])) {
         list($html_message, $zip) = CRM_Utils_PDF_Document::unzipDoc($formValues['document_file_path'], $formValues['document_type']);
     }
     foreach ($form->_contactIds as $item => $contactId) {
         $caseId = NULL;
         $params = array('contact_id' => $contactId);
         list($contact) = CRM_Utils_Token::getTokenDetails($params, $returnProperties, $skipOnHold, $skipDeceased, NULL, $messageToken, 'CRM_Contact_Form_Task_PDFLetterCommon');
         if (civicrm_error($contact)) {
             $notSent[] = $contactId;
             continue;
         }
         $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contact[$contactId], TRUE, $messageToken);
         if (!empty($form->_caseId)) {
             $caseId = $form->_caseId;
         }
         if (empty($caseId) && !empty($form->_caseIds[$item])) {
             $caseId = $form->_caseIds[$item];
         }
         if ($caseId) {
             $tokenHtml = CRM_Utils_Token::replaceCaseTokens($caseId, $tokenHtml, $messageToken);
         }
         $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contact[$contactId], $categories, TRUE);
         if (defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY) {
             $smarty = CRM_Core_Smarty::singleton();
             // also add the contact tokens to the template
             $smarty->assign_by_ref('contact', $contact);
             $tokenHtml = $smarty->fetch("string:{$tokenHtml}");
         }
         $html[] = $tokenHtml;
     }
     $type = $formValues['document_type'];
     if ($type == 'pdf') {
         CRM_Utils_PDF_Utils::html2pdf($html, "CiviLetter.pdf", FALSE, $formValues);
     } elseif (!empty($formValues['document_file_path'])) {
         CRM_Utils_PDF_Document::printDocuments($formValues['document_file_path'], $html, $type, $zip);
     } else {
         CRM_Utils_PDF_Document::html2doc($html, "CiviLetter.{$type}", $formValues);
     }
     $form->postProcessHook();
     CRM_Utils_System::civiExit(1);
 }