本文整理汇总了PHP中CRM_Utils_Hook::tokenValues方法的典型用法代码示例。如果您正苦于以下问题:PHP CRM_Utils_Hook::tokenValues方法的具体用法?PHP CRM_Utils_Hook::tokenValues怎么用?PHP CRM_Utils_Hook::tokenValues使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CRM_Utils_Hook
的用法示例。
在下文中一共展示了CRM_Utils_Hook::tokenValues方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。
示例1: onEvaluate
/**
* Load token data.
*
* @param TokenValueEvent $e
* @throws TokenException
*/
public function onEvaluate(TokenValueEvent $e)
{
// For reasons unknown, replaceHookTokens requires a pre-computed list of
// hook *categories* (aka entities aka namespaces). We'll cache
// this in the TokenProcessor's context.
$hookTokens = array();
\CRM_Utils_Hook::tokens($hookTokens);
$categories = array_keys($hookTokens);
$e->getTokenProcessor()->context['hookTokenCategories'] = $categories;
$messageTokens = $e->getTokenProcessor()->getMessageTokens();
foreach ($e->getRows() as $row) {
if (empty($row->context['contact'])) {
$params = array(array('contact_id', '=', $row->context['contactId'], 0, 0));
list($contact, $_) = \CRM_Contact_BAO_Query::apiQuery($params);
$contact = reset($contact);
//CRM-4524
if (!$contact || is_a($contact, 'CRM_Core_Error')) {
// FIXME: Need to differentiate errors which kill the batch vs the individual row.
throw new TokenException("Failed to generate token data. Invalid contact ID: " . $row->context['contactId']);
}
} else {
$contact = $row->context['contact'];
}
if (!empty($row->context['tmpTokenParams'])) {
// merge activity tokens with contact array
// this is pretty weird.
$contact = array_merge($contact, $row->context['tmpTokenParams']);
}
// Note: This is a small contract change from the past; data should be missing
// less randomly.
//\CRM_Utils_Hook::tokenValues($contact, $row->context['contactId']);
\CRM_Utils_Hook::tokenValues($contact, $row->context['contactId'], empty($row->context['mailingJob']) ? NULL : $row->context['mailingJob']->id, $messageTokens, $row->context['controller']);
$row->context('contact', $contact);
}
}
示例2: getAnonymousTokenDetails
/**
* Call hooks on tokens for anonymous users - contact id is set to 0 - this allows non-contact
* specific tokens to be rendered
*
* @param array $contactIDs
* This should always be array(0) or its not anonymous - left to keep signature same.
* as main fn
* @param string $returnProperties
* @param bool $skipOnHold
* @param bool $skipDeceased
* @param string $extraParams
* @param array $tokens
* @param string $className
* Sent as context to the hook.
* @param string $jobID
* @return array
* contactDetails with hooks swapped out
*/
public function getAnonymousTokenDetails($contactIDs = array(0), $returnProperties = NULL, $skipOnHold = TRUE, $skipDeceased = TRUE, $extraParams = NULL, $tokens = array(), $className = NULL, $jobID = NULL)
{
$details = array(0 => array());
// also call a hook and get token details
CRM_Utils_Hook::tokenValues($details[0], $contactIDs, $jobID, $tokens, $className);
return $details;
}
示例3: postProcess
/**
* process the form after the input has been submitted and validated
*
* @access public
*
* @return void
*/
public function postProcess()
{
$fv = $this->controller->exportValues($this->_name);
$config = CRM_Core_Config::singleton();
$locName = NULL;
//get the address format sequence from the config file
$mailingFormat = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'mailing_format');
$sequence = CRM_Utils_Address::sequence($mailingFormat);
foreach ($sequence as $v) {
$address[$v] = 1;
}
if (array_key_exists('postal_code', $address)) {
$address['postal_code_suffix'] = 1;
}
//build the returnproperties
$returnProperties = array('display_name' => 1, 'contact_type' => 1);
$mailingFormat = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'mailing_format');
$mailingFormatProperties = array();
if ($mailingFormat) {
$mailingFormatProperties = self::getReturnProperties($mailingFormat);
$returnProperties = array_merge($returnProperties, $mailingFormatProperties);
}
//we should not consider addressee for data exists, CRM-6025
if (array_key_exists('addressee', $mailingFormatProperties)) {
unset($mailingFormatProperties['addressee']);
}
$customFormatProperties = array();
if (stristr($mailingFormat, 'custom_')) {
foreach ($mailingFormatProperties as $token => $true) {
if (substr($token, 0, 7) == 'custom_') {
if (empty($customFormatProperties[$token])) {
$customFormatProperties[$token] = $mailingFormatProperties[$token];
}
}
}
}
if (!empty($customFormatProperties)) {
$returnProperties = array_merge($returnProperties, $customFormatProperties);
}
if (isset($fv['merge_same_address'])) {
// we need first name/last name for summarising to avoid spillage
$returnProperties['first_name'] = 1;
$returnProperties['last_name'] = 1;
}
$individualFormat = FALSE;
/*
* CRM-8338: replace ids of household members with the id of their household
* so we can merge labels by household.
*/
if (isset($fv['merge_same_household'])) {
$this->mergeContactIdsByHousehold();
$individualFormat = TRUE;
}
//get the contacts information
$params = array();
if (!empty($fv['location_type_id'])) {
$locType = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Address', 'location_type_id');
$locName = $locType[$fv['location_type_id']];
$location = array('location' => array("{$locName}" => $address));
$returnProperties = array_merge($returnProperties, $location);
$params[] = array('location_type', '=', array($fv['location_type_id'] => 1), 0, 0);
} else {
$returnProperties = array_merge($returnProperties, $address);
}
$rows = array();
foreach ($this->_contactIds as $key => $contactID) {
$params[] = array(CRM_Core_Form::CB_PREFIX . $contactID, '=', 1, 0, 0);
}
// fix for CRM-2651
if (!empty($fv['do_not_mail'])) {
$params[] = array('do_not_mail', '=', 0, 0, 0);
}
// fix for CRM-2613
$params[] = array('is_deceased', '=', 0, 0, 0);
$custom = array();
foreach ($returnProperties as $name => $dontCare) {
$cfID = CRM_Core_BAO_CustomField::getKeyID($name);
if ($cfID) {
$custom[] = $cfID;
}
}
//get the total number of contacts to fetch from database.
$numberofContacts = count($this->_contactIds);
$query = new CRM_Contact_BAO_Query($params, $returnProperties);
$details = $query->apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts);
$messageToken = CRM_Utils_Token::getTokens($mailingFormat);
// also get all token values
CRM_Utils_Hook::tokenValues($details[0], $this->_contactIds, NULL, $messageToken, 'CRM_Contact_Form_Task_Label');
$tokens = array();
CRM_Utils_Hook::tokens($tokens);
$tokenFields = array();
foreach ($tokens as $category => $catTokens) {
foreach ($catTokens as $token => $tokenName) {
//.........这里部分代码省略.........
示例4: sendReminder
/**
* @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 & entities in text mode, so that the links work
$mailParams['text'] = str_replace('&', '&', $text);
}
if ($html && ($contact['preferred_mail_format'] == 'HTML' || $contact['preferred_mail_format'] == 'Both')) {
//.........这里部分代码省略.........
示例5: compose
/**
* 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 bool $test
* Is this mailing a test?.
* @param $contactDetails
* @param $attachments
* @param bool $isForward
* Is this mailing compose for forward?.
* @param string $fromEmail
* Email address of who is forwardinf it.
*
* @param null $replyToEmail
*
* @return Mail_mime The mail object
*/
public function compose($job_id, $event_queue_id, $hash, $contactId, $email, &$recipient, $test, $contactDetails, &$attachments, $isForward = FALSE, $fromEmail = NULL, $replyToEmail = NULL)
{
$config = CRM_Core_Config::singleton();
$this->getTokens();
if ($this->_domain == NULL) {
$this->_domain = CRM_Core_BAO_Domain::getDomain();
}
list($verp, $urls, $headers) = $this->getVerpAndUrlsAndHeaders($job_id, $event_queue_id, $hash, $email, $isForward);
//set from email who is forwarding it and not original one.
if ($fromEmail) {
unset($headers['From']);
$headers['From'] = "<{$fromEmail}>";
}
if ($replyToEmail && $fromEmail != $replyToEmail) {
$headers['Reply-To'] = "{$replyToEmail}";
}
if ($contactDetails) {
$contact = $contactDetails;
} elseif ($contactId === 0) {
//anonymous user
$contact = array();
CRM_Utils_Hook::tokenValues($contact, $contactId, $job_id);
} else {
$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')) {
CRM_Core_Error::debug_log_message(ts('CiviMail will not send email to a non-existent contact: %1', array(1 => $contactId)));
// setting this because function is called by reference
//@todo test not calling function by reference
$res = NULL;
return $res;
}
// also call the hook to get contact details
CRM_Utils_Hook::tokenValues($contact, $contactId, $job_id);
}
$pTemplates = $this->getPreparedTemplates();
$pEmails = array();
foreach ($pTemplates as $type => $pTemplate) {
$html = $type == 'html' ? TRUE : FALSE;
$pEmails[$type] = array();
$pEmail =& $pEmails[$type];
$template =& $pTemplates[$type]['template'];
$tokens =& $pTemplates[$type]['tokens'];
$idx = 0;
if (!empty($tokens)) {
foreach ($tokens as $idx => $token) {
$token_data = $this->getTokenData($token, $html, $contact, $verp, $urls, $event_queue_id);
array_push($pEmail, $template[$idx]);
array_push($pEmail, $token_data);
}
} else {
array_push($pEmail, $template[$idx]);
}
if (isset($template[$idx + 1])) {
array_push($pEmail, $template[$idx + 1]);
}
}
$html = NULL;
if (isset($pEmails['html']) && is_array($pEmails['html']) && count($pEmails['html'])) {
$html =& $pEmails['html'];
}
$text = NULL;
if (isset($pEmails['text']) && is_array($pEmails['text']) && count($pEmails['text'])) {
$text =& $pEmails['text'];
}
// push the tracking url on to the html email if necessary
if ($this->open_tracking && $html) {
array_push($html, "\n" . '<img src="' . $config->userFrameworkResourceURL . "extern/open.php?q={$event_queue_id}\" width='1' height='1' alt='' border='0'>");
}
$message = new Mail_mime("\n");
//.........这里部分代码省略.........
示例6: sendTemplate
/**
* 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];
//.........这里部分代码省略.........
示例7: getTokenData
/**
* Get token list from mailing format & contacts
* @param unknown_type $contacts
* @return unknown
*/
function getTokenData(&$contacts)
{
$mailingFormat = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'mailing_format');
$tokens = $tokenFields = array();
$messageToken = CRM_Utils_Token::getTokens($mailingFormat);
// also get all token values
CRM_Utils_Hook::tokenValues($contacts, array_keys($contacts), NULL, $messageToken, 'CRM_Contact_Form_Task_LabelCommon');
CRM_Utils_Hook::tokens($tokens);
foreach ($tokens as $category => $catTokens) {
foreach ($catTokens as $token => $tokenName) {
$tokenFields[] = $token;
}
}
return $tokenFields;
}
示例8: postProcess
/**
* process the form after the input has been submitted and validated
*
* @access public
* @return void
*/
public function postProcess()
{
$fv = $this->controller->exportValues($this->_name);
$config =& CRM_Core_Config::singleton();
$locName = null;
//get the address format sequence from the config file
require_once 'CRM/Core/BAO/Preferences.php';
$sequence = CRM_Core_BAO_Preferences::value('mailing_sequence');
foreach ($sequence as $v) {
$address[$v] = 1;
}
if (array_key_exists('postal_code', $address)) {
$address['postal_code_suffix'] = 1;
}
//build the returnproperties
$returnProperties = array('display_name' => 1);
$mailingFormat = CRM_Core_BAO_Preferences::value('mailing_format');
$mailingFormatProperties = array();
if ($mailingFormat) {
$mailingFormatProperties = self::getReturnProperties($mailingFormat);
$returnProperties = array_merge($returnProperties, $mailingFormatProperties);
}
$customFormatProperties = array();
if (stristr($mailingFormat, 'custom_')) {
foreach ($mailingFormatProperties as $token => $true) {
if (substr($token, 0, 7) == 'custom_') {
if (!CRM_Utils_Array::value($token, $customFormatProperties)) {
$customFormatProperties[$token] = $mailingFormatProperties[$token];
}
}
}
}
if (!empty($customFormatProperties)) {
$returnProperties = array_merge($returnProperties, $customFormatProperties);
}
//get the contacts information
$params = array();
if (CRM_Utils_Array::value('location_type_id', $fv)) {
$locType = CRM_Core_PseudoConstant::locationType();
$locName = $locType[$fv['location_type_id']];
$location = array('location' => array("{$locName}" => $address));
$returnProperties = array_merge($returnProperties, $location);
$params[] = array('location_type', '=', array($fv['location_type_id'] => 1), 0, 0);
} else {
$returnProperties = array_merge($returnProperties, $address);
}
$rows = array();
foreach ($this->_contactIds as $key => $contactID) {
$params[] = array(CRM_Core_Form::CB_PREFIX . $contactID, '=', 1, 0, 0);
}
// fix for CRM-2651
if (CRM_Utils_Array::value('do_not_mail', $fv)) {
$params[] = array('do_not_mail', '=', 0, 0, 0);
}
// fix for CRM-2613
$params[] = array('is_deceased', '=', 0, 0, 0);
$custom = array();
foreach ($returnProperties as $name => $dontCare) {
$cfID = CRM_Core_BAO_CustomField::getKeyID($name);
if ($cfID) {
$custom[] = $cfID;
}
}
//get the total number of contacts to fetch from database.
$numberofContacts = count($this->_contactIds);
require_once 'CRM/Contact/BAO/Query.php';
$query =& new CRM_Contact_BAO_Query($params, $returnProperties);
$details = $query->apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts);
// also get all token values
require_once 'CRM/Utils/Hook.php';
CRM_Utils_Hook::tokenValues($details[0], $this->_contactIds);
$tokens = array();
CRM_Utils_Hook::tokens($tokens);
$tokenFields = array();
foreach ($tokens as $category => $catTokens) {
foreach ($catTokens as $token) {
$tokenFields[] = $token;
}
}
foreach ($this->_contactIds as $value) {
foreach ($custom as $cfID) {
if (isset($details[0][$value]["custom_{$cfID}"])) {
$details[0][$value]["custom_{$cfID}"] = CRM_Core_BAO_CustomField::getDisplayValue($details[0][$value]["custom_{$cfID}"], $cfID, $details[1]);
}
}
$contact = CRM_Utils_Array::value($value, $details['0']);
if (is_a($contact, 'CRM_Core_Error')) {
return null;
}
// we need to remove all the "_id"
unset($contact['contact_id']);
if ($locName && CRM_Utils_Array::value($locName, $contact)) {
// If location type is not primary, $contact contains
// one more array as "$contact[$locName] = array( values... )"
//.........这里部分代码省略.........
示例9: getTokenData
/**
* Get token list from mailing format & contacts
* @param array $contacts
* @return array
*/
public static function getTokenData(&$contacts)
{
$mailingFormat = Civi::settings()->get('mailing_format');
$tokens = $tokenFields = array();
$messageToken = CRM_Utils_Token::getTokens($mailingFormat);
// also get all token values
CRM_Utils_Hook::tokenValues($contacts, array_keys($contacts), NULL, $messageToken, 'CRM_Contact_Form_Task_LabelCommon');
CRM_Utils_Hook::tokens($tokens);
foreach ($tokens as $category => $catTokens) {
foreach ($catTokens as $token => $tokenName) {
$tokenFields[] = $token;
}
}
return $tokenFields;
}
示例10: getDetails
/**
* gives required details of contacts
*
* @param array $contactIds of conatcts
* @param array $returnProperties of required properties
* @param boolean $skipOnHold don't return on_hold contact info also.
* @param boolean $skipDeceased don't return deceased contact info.
* @param array $extraParams extra params
*
* @return array
* @access public
*/
function getDetails($contactIDs, $returnProperties = null, $skipOnHold = true, $skipDeceased = true, $extraParams = null)
{
$params = array();
foreach ($contactIDs as $key => $contactID) {
$params[] = array(CRM_Core_Form::CB_PREFIX . $contactID, '=', 1, 0, 0);
}
// fix for CRM-2613
if ($skipDeceased) {
$params[] = array('is_deceased', '=', 0, 0, 0);
}
//fix for CRM-3798
if ($skipOnHold) {
$params[] = array('on_hold', '=', 0, 0, 0);
}
if ($extraParams) {
$params = array_merge($params, $extraParams);
}
// if return properties are not passed then get all return properties
if (empty($returnProperties)) {
require_once 'CRM/Contact/BAO/Contact.php';
$fields = array_merge(array_keys(CRM_Contact_BAO_Contact::exportableFields()), array('display_name', 'checksum', 'contact_id'));
foreach ($fields as $key => $val) {
$returnProperties[$val] = 1;
}
}
$custom = array();
foreach ($returnProperties as $name => $dontCare) {
$cfID = CRM_Core_BAO_CustomField::getKeyID($name);
if ($cfID) {
$custom[] = $cfID;
}
}
//get the total number of contacts to fetch from database.
$numberofContacts = count($contactIDs);
require_once 'CRM/Contact/BAO/Query.php';
$query = new CRM_Contact_BAO_Query($params, $returnProperties);
$details = $query->apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts);
$contactDetails =& $details[0];
foreach ($contactIDs as $key => $contactID) {
if (array_key_exists($contactID, $contactDetails)) {
if (CRM_Utils_Array::value('preferred_communication_method', $returnProperties) == 1 && array_key_exists('preferred_communication_method', $contactDetails[$contactID])) {
require_once 'CRM/Core/PseudoConstant.php';
$pcm = CRM_Core_PseudoConstant::pcm();
// communication Prefferance
require_once 'CRM/Core/BAO/CustomOption.php';
$contactPcm = explode(CRM_Core_BAO_CustomOption::VALUE_SEPERATOR, $contactDetails[$contactID]['preferred_communication_method']);
$result = array();
foreach ($contactPcm as $key => $val) {
if ($val) {
$result[$val] = $pcm[$val];
}
}
$contactDetails[$contactID]['preferred_communication_method'] = implode(', ', $result);
}
foreach ($custom as $cfID) {
if (isset($contactDetails[$contactID]["custom_{$cfID}"])) {
$contactDetails[$contactID]["custom_{$cfID}"] = CRM_Core_BAO_CustomField::getDisplayValue($contactDetails[$contactID]["custom_{$cfID}"], $cfID, $details[1]);
}
}
//special case for greeting replacement
foreach (array('email_greeting', 'postal_greeting', 'addressee') as $val) {
if (CRM_Utils_Array::value($val, $contactDetails[$contactID])) {
$contactDetails[$contactID][$val] = $contactDetails[$contactID]["{$val}_display"];
}
}
}
}
// also call a hook and get token details
require_once 'CRM/Utils/Hook.php';
CRM_Utils_Hook::tokenValues($details[0], $contactIDs);
return $details;
}
示例11: sendReminder
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 & entities in text mode, so that the links work
$mailParams['text'] = str_replace('&', '&', $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;
}
示例12: sendTemplate
/**
* 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);
}
//.........这里部分代码省略.........