CRM-12930 Execute Smarty templates before token replacement
authorNeil Drumm <drumm@delocalizedham.com>
Thu, 8 Aug 2013 04:08:18 +0000 (04:08 +0000)
committerNeil Drumm <drumm@delocalizedham.com>
Thu, 8 Aug 2013 04:08:18 +0000 (04:08 +0000)
CRM/Core/BAO/ActionSchedule.php
CRM/Core/BAO/MessageTemplates.php

index f1ec99fa3e6516f9840ae296310cf64bbd6c35c1..97d296a2e67291842f93251bf18d10cb9803f94f 100755 (executable)
@@ -385,6 +385,13 @@ WHERE   cas.entity_value = $id AND
         $body_text = CRM_Utils_String::htmlToText($body_html);
       }
 
+      // Execute Smarty templates before token replacement, so templates do not
+      // interfere and we hit the compiled template cache.
+      $smarty = CRM_Core_Smarty::singleton();
+      $body_text = $smarty->fetch('string:' . $body_text);
+      $body_html = $smarty->fetch('string:' . $body_html);
+      $body_subject = $smarty->fetch('string:' . $messageSubject);
+
       $params = array(array('contact_id', '=', $contactId, 0, 0));
       list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($params);
 
@@ -423,12 +430,6 @@ WHERE   cas.entity_value = $id AND
       $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,
@@ -454,8 +455,6 @@ WHERE   cas.entity_value = $id AND
       $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',
index 83af344c5160ec33dcacfd5ad3c2e18f2115c22d..0d4c1b332a9599c26e3180d86832bc85332f4eec 100644 (file)
@@ -166,6 +166,13 @@ class CRM_Core_BAO_MessageTemplates extends CRM_Core_DAO_MessageTemplates {
         $body_text = CRM_Utils_String::htmlToText($body_html);
       }
 
+      // Execute Smarty templates before token replacement, so templates do not
+      // interfere and we hit the compiled template cache.
+      $smarty = CRM_Core_Smarty::singleton();
+      $body_text = $smarty->fetch('string:' . $body_text);
+      $body_html = $smarty->fetch('string:' . $body_html);
+      $body_subject = $smarty->fetch('string:' . $body_subject);
+
       $params = array(array('contact_id', '=', $contactId, 0, 0));
       list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($params);
 
@@ -217,20 +224,12 @@ class CRM_Core_BAO_MessageTemplates extends CRM_Core_DAO_MessageTemplates {
       $html = $body_html;
       $text = $body_text;
 
-      $smarty = CRM_Core_Smarty::singleton();
-      foreach (array(
-        'text', 'html') as $elem) {
-        $$elem = $smarty->fetch("string:{$$elem}");
-      }
-
       // do replacements in message subject
       $messageSubject = CRM_Utils_Token::replaceContactTokens($body_subject, $contact, false, $tokens);
       $messageSubject = CRM_Utils_Token::replaceDomainTokens($messageSubject, $domain, true, $tokens);
       $messageSubject = CRM_Utils_Token::replaceComponentTokens($messageSubject, $contact, $tokens, 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',
@@ -389,6 +388,19 @@ class CRM_Core_BAO_MessageTemplates extends CRM_Core_DAO_MessageTemplates {
       $testDao->free();
     }
 
+    // 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}");
+    }
+
     // replace tokens in the three elements (in subject as if it was the text body)
     $domain             = CRM_Core_BAO_Domain::getDomain();
     $hookTokens         = array();
@@ -451,21 +463,6 @@ class CRM_Core_BAO_MessageTemplates extends CRM_Core_DAO_MessageTemplates {
       $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;