From 07945b3c8a36d35dbc0e59048f507d50515c4c42 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Wed, 25 Nov 2015 15:27:07 -0500 Subject: [PATCH] CRM-17606 - Support case tokens when creating PDF --- CRM/Contact/Form/Task/PDF.php | 3 ++ CRM/Contact/Form/Task/PDFLetterCommon.php | 3 ++ CRM/Core/SelectValues.php | 18 +++++++ CRM/Member/Form/Task/PDFLetterCommon.php | 7 ++- CRM/Utils/Token.php | 65 +++++++++++++++++++---- api/v3/Case.php | 3 ++ api/v3/utils.php | 2 +- 7 files changed, 86 insertions(+), 15 deletions(-) diff --git a/CRM/Contact/Form/Task/PDF.php b/CRM/Contact/Form/Task/PDF.php index 0267aa6a50..0b9eb91afa 100644 --- a/CRM/Contact/Form/Task/PDF.php +++ b/CRM/Contact/Form/Task/PDF.php @@ -118,6 +118,9 @@ class CRM_Contact_Form_Task_PDF extends CRM_Contact_Form_Task { */ public function listTokens() { $tokens = CRM_Core_SelectValues::contactTokens(); + if (isset($this->_caseId)) { + $tokens += CRM_Core_SelectValues::caseTokens(); + } return $tokens; } diff --git a/CRM/Contact/Form/Task/PDFLetterCommon.php b/CRM/Contact/Form/Task/PDFLetterCommon.php index a10e4a31c0..60920e0ba8 100644 --- a/CRM/Contact/Form/Task/PDFLetterCommon.php +++ b/CRM/Contact/Form/Task/PDFLetterCommon.php @@ -340,6 +340,9 @@ class CRM_Contact_Form_Task_PDFLetterCommon { } $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contact[$contactId], TRUE, $messageToken); + if (!empty($form->_caseId)) { + $tokenHtml = CRM_Utils_Token::replaceCaseTokens($form->_caseId, $html_message, $messageToken); + } $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contact[$contactId], $categories, TRUE); if (defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY) { diff --git a/CRM/Core/SelectValues.php b/CRM/Core/SelectValues.php index 4138538dd4..b494d563f7 100644 --- a/CRM/Core/SelectValues.php +++ b/CRM/Core/SelectValues.php @@ -692,6 +692,24 @@ class CRM_Core_SelectValues { return $tokens; } + /** + * @return array + */ + public static function caseTokens() { + static $tokens = NULL; + if (!$tokens) { + foreach (CRM_Case_BAO_Case::fields() as $field) { + $tokens["{case.{$field['name']}}"] = $field['title']; + } + + $customFields = CRM_Core_BAO_CustomField::getFields('Case'); + foreach ($customFields as $id => $field) { + $tokens["{case.custom_$id}"] = "{$field['label']} :: {$field['groupTitle']}"; + } + } + return $tokens; + } + /** * CiviCRM supported date input formats. * diff --git a/CRM/Member/Form/Task/PDFLetterCommon.php b/CRM/Member/Form/Task/PDFLetterCommon.php index 560cfdf2f7..96d1df3e3e 100644 --- a/CRM/Member/Form/Task/PDFLetterCommon.php +++ b/CRM/Member/Form/Task/PDFLetterCommon.php @@ -16,8 +16,6 @@ class CRM_Member_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDFLett * @param $skipOnHold * @param $skipDeceased * @param $contactIDs - * - * @return void */ public static function postProcessMembers(&$form, $membershipIDs, $skipOnHold, $skipDeceased, $contactIDs) { @@ -50,14 +48,15 @@ class CRM_Member_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDFLett * @param array $returnProperties * @param bool $skipOnHold * @param bool $skipDeceased - * @param unknown_type $messageToken + * @param array $messageToken * @param $html_message * @param $categories * - * @return unknown + * @return array */ public static function generateHTML($membershipIDs, $returnProperties, $skipOnHold, $skipDeceased, $messageToken, $html_message, $categories) { $memberships = CRM_Utils_Token::getMembershipTokenDetails($membershipIDs); + $html = array(); foreach ($membershipIDs as $membershipID) { $membership = $memberships[$membershipID]; diff --git a/CRM/Utils/Token.php b/CRM/Utils/Token.php index 2b4269e205..0e58575600 100644 --- a/CRM/Utils/Token.php +++ b/CRM/Utils/Token.php @@ -1621,14 +1621,63 @@ class CRM_Utils_Token { return $str; } - $fn = 'get' . ucfirst($entity) . 'tokenReplacement'; + $fn = 'get' . ucfirst($entity) . 'TokenReplacement'; + $fn = is_callable(array('CRM_Utils_Token', $fn)) ? $fn : 'getApiTokenReplacement'; // since we already know the tokens lets just use them & do str_replace which is faster & simpler than preg_replace foreach ($knownTokens[$entity] as $token) { - $replaceMent = CRM_Utils_Token::$fn($token, $entityArray, $escapeSmarty); - $str = str_replace('{' . $entity . '.' . $token . '}', $replaceMent, $str); + $replacement = self::$fn($entity, $token, $entityArray); + if ($escapeSmarty) { + $replacement = self::tokenEscapeSmarty($replacement); + } + $str = str_replace('{' . $entity . '.' . $token . '}', $replacement, $str); } - $str = preg_replace('/\\\\|\{(\s*)?\}/', ' ', $str); - return $str; + return preg_replace('/\\\\|\{(\s*)?\}/', ' ', $str); + } + + /** + * @param int $caseId + * @param int $str + * @param array $knownTokens + * @param bool $escapeSmarty + * @return string + * @throws \CiviCRM_API3_Exception + */ + public static function replaceCaseTokens($caseId, $str, $knownTokens = array(), $escapeSmarty = FALSE) { + if (!$knownTokens || empty($knownTokens['case'])) { + return $str; + } + $case = civicrm_api3('case', 'getsingle', array('id' => $caseId)); + return self::replaceEntityTokens('case', $case, $str, $knownTokens, $escapeSmarty); + } + + /** + * Generic function for formatting token replacement for an api field + * + * @param string $entity + * @param string $token + * @param array $entityArray + * @return string + * @throws \CiviCRM_API3_Exception + */ + public static function getApiTokenReplacement($entity, $token, $entityArray) { + if (!isset($entityArray[$token])) { + return ''; + } + $field = civicrm_api3($entity, 'getfield', array('action' => 'get', 'name' => $token, 'get_options' => 'get')); + $field = $field['values']; + // Match pseudoconstants + if (!empty($field['options'])) { + $ret = array(); + foreach ((array) $entityArray[$token] as $val) { + $ret[] = $field['options'][$val]; + } + return implode(', ', $ret); + } + // Format special fields + elseif ($entityArray[$token] && CRM_Utils_Array::value('type', $field) == CRM_Utils_Type::T_DATE) { + return CRM_Utils_Date::customFormat($entityArray[$token]); + } + return $entityArray[$token]; } /** @@ -1712,8 +1761,7 @@ class CRM_Utils_Token { * @return string * token replacement */ - public static function getMembershipTokenReplacement($token, $membership, $escapeSmarty = FALSE) { - $entity = 'membership'; + public static function getMembershipTokenReplacement($entity, $token, $membership) { self::_buildMembershipTokens(); switch ($token) { case 'type': @@ -1750,9 +1798,6 @@ class CRM_Utils_Token { break; } - if ($escapeSmarty) { - $value = self::tokenEscapeSmarty($value); - } return $value; } diff --git a/api/v3/Case.php b/api/v3/Case.php index cd27ced8a5..a3267c121a 100644 --- a/api/v3/Case.php +++ b/api/v3/Case.php @@ -416,6 +416,9 @@ function _civicrm_api3_case_read($caseId, $options) { if ($dao->find(TRUE)) { $case = array(); _civicrm_api3_object_to_array($dao, $case); + + _civicrm_api3_custom_data_get($case, 'Case', $caseId); + // Legacy support for client_id - TODO: in apiv4 remove 'client_id' $case['client_id'] = $case['contact_id'] = $dao->retrieveContactIdsByCaseId($caseId); diff --git a/api/v3/utils.php b/api/v3/utils.php index d0c8ce0f19..9601e58387 100644 --- a/api/v3/utils.php +++ b/api/v3/utils.php @@ -2602,7 +2602,7 @@ function _civicrm_api3_api_resolve_alias($entity, $fieldName, $action = 'create' return $meta[$fieldName]['name']; } foreach ($meta as $info) { - if ($fieldName == CRM_Utils_Array::value('uniqueName', $info)) { + if ($fieldName == $info['name'] || $fieldName == CRM_Utils_Array::value('uniqueName', $info)) { return $info['name']; } if (array_search($fieldName, CRM_Utils_Array::value('api.aliases', $info, array())) !== FALSE) { -- 2.25.1