CRM-19690 - Enable FlexMailer (if present)
authorTim Otten <totten@civicrm.org>
Sat, 3 Dec 2016 03:19:20 +0000 (19:19 -0800)
committerTim Otten <totten@civicrm.org>
Tue, 3 Jan 2017 10:25:32 +0000 (02:25 -0800)
FlexMailer (https://github.com/civicrm/org.civicrm.flexmailer/) is a
refactoring of the email-delivery logic from the Mailing BAOs.  The primary
goal is to make the email-delivery logic more extensible by exposing a
better set of events for extension-authors.  Sadly, the original code is a
bit toxic (originally lacking in tests; thick with many features; using some
quirky dataflows), which means:

 1. Any refactoring of it poses a high risk.
 2. The refactoring should ideally be done with iteration/validation as
    an optional extension.

This patch aims to be the bare-minimum core patch required to facilitate a
better 'leap by extension'.  The main priorities are:

 1. Minimize risk -- no impact on existing users who can continue using existing logic.
 2. Enable iteration/testing/deployment of an optional extension in real-world scenarios.
 3. Keep any core hacks clear and isolated - don't rashly commit to new, public APIs.

CRM/Mailing/BAO/MailingJob.php
Civi/Core/Container.php

index 11db3e44f5cda05afd9d6b839b5ba34634c1ce79..5a65217ce75be54ba8bbd8644b925ff48e053569 100644 (file)
@@ -189,7 +189,12 @@ class CRM_Mailing_BAO_MailingJob extends CRM_Mailing_DAO_MailingJob {
       }
 
       // Compose and deliver each child job
-      $isComplete = $job->deliver($mailer, $testParams);
+      if (\CRM_Utils_Constant::value('CIVICRM_FLEXMAILER_HACK_DELIVER')) {
+        $isComplete = Civi\Core\Resolver::singleton()->call(CIVICRM_FLEXMAILER_HACK_DELIVER, array($job, $mailer, $testParams));
+      }
+      else {
+        $isComplete = $job->deliver($mailer, $testParams);
+      }
 
       CRM_Utils_Hook::post('create', 'CRM_Mailing_DAO_Spool', $job->id, $isComplete);
 
@@ -492,6 +497,10 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
    * @param array $testParams
    */
   public function deliver(&$mailer, $testParams = NULL) {
+    if (\Civi::settings()->get('experimentalFlexMailerEngine')) {
+      throw new \RuntimeException("Cannot use legacy deliver() when experimentalFlexMailerEngine is enabled");
+    }
+
     $mailing = new CRM_Mailing_BAO_Mailing();
     $mailing->id = $this->mailing_id;
     $mailing->find(TRUE);
index 20733e29802e962af84840e8af46447dcbbdd153..0887463fcef9c8449ba1a507514d565b0f2bc712 100644 (file)
@@ -215,6 +215,10 @@ class Container {
       ))->addTag('kernel.event_subscriber');
     }
 
+    if (\CRM_Utils_Constant::value('CIVICRM_FLEXMAILER_HACK_SERVICES')) {
+      \Civi\Core\Resolver::singleton()->call(CIVICRM_FLEXMAILER_HACK_SERVICES, array($container));
+    }
+
     \CRM_Utils_Hook::container($container);
 
     return $container;
@@ -253,6 +257,10 @@ class Container {
     $dispatcher->addListener(\Civi\ActionSchedule\Events::MAPPINGS, array('CRM_Event_ActionMapping', 'onRegisterActionMappings'));
     $dispatcher->addListener(\Civi\ActionSchedule\Events::MAPPINGS, array('CRM_Member_ActionMapping', 'onRegisterActionMappings'));
 
+    if (\CRM_Utils_Constant::value('CIVICRM_FLEXMAILER_HACK_LISTENERS')) {
+      \Civi\Core\Resolver::singleton()->call(CIVICRM_FLEXMAILER_HACK_LISTENERS, array($dispatcher));
+    }
+
     return $dispatcher;
   }