3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
9 +--------------------------------------------------------------------+
11 namespace Civi\FlexMailer
;
13 use Symfony\Component\DependencyInjection\ContainerBuilder
;
14 use Symfony\Component\DependencyInjection\Definition
;
15 use Symfony\Component\DependencyInjection\Reference
;
16 use Civi\FlexMailer\FlexMailer
as FM
;
20 * @package Civi\FlexMailer
22 * Manage the setup of any services used by FlexMailer.
26 public static function registerServices(ContainerBuilder
$container) {
27 $container->addResource(new \Symfony\Component\Config\
Resource\
FileResource(__FILE__
));
29 $apiOverrides = $container->setDefinition('civi_flexmailer_api_overrides', new Definition('Civi\API\Provider\ProviderInterface'))->setPublic(TRUE);
30 self
::applyStaticFactory($apiOverrides, __CLASS__
, 'createApiOverrides');
32 $container->setDefinition('civi_flexmailer_required_fields', new Definition('Civi\FlexMailer\Listener\RequiredFields', array(
38 '(body_html|body_text)',
41 $container->setDefinition('civi_flexmailer_required_tokens', new Definition('Civi\FlexMailer\Listener\RequiredTokens', array(
44 'domain.address' => ts("Domain address - displays your organization's postal address."),
45 'action.optOutUrl or action.unsubscribeUrl' => array(
46 'action.optOut' => ts("'Opt out via email' - displays an email address for recipients to opt out of receiving emails from your organization."),
47 'action.optOutUrl' => ts("'Opt out via web page' - creates a link for recipients to click if they want to opt out of receiving emails from your organization. Alternatively, you can include the 'Opt out via email' token."),
48 'action.unsubscribe' => ts("'Unsubscribe via email' - displays an email address for recipients to unsubscribe from the specific mailing list used to send this message."),
49 'action.unsubscribeUrl' => ts("'Unsubscribe via web page' - creates a link for recipients to unsubscribe from the specific mailing list used to send this message. Alternatively, you can include the 'Unsubscribe via email' token or one of the Opt-out tokens."),
54 $container->setDefinition('civi_flexmailer_abdicator', new Definition('Civi\FlexMailer\Listener\Abdicator'))->setPublic(TRUE);
55 $container->setDefinition('civi_flexmailer_default_batcher', new Definition('Civi\FlexMailer\Listener\DefaultBatcher'))->setPublic(TRUE);
56 $container->setDefinition('civi_flexmailer_default_composer', new Definition('Civi\FlexMailer\Listener\DefaultComposer'))->setPublic(TRUE);
57 $container->setDefinition('civi_flexmailer_open_tracker', new Definition('Civi\FlexMailer\Listener\OpenTracker'))->setPublic(TRUE);
58 $container->setDefinition('civi_flexmailer_basic_headers', new Definition('Civi\FlexMailer\Listener\BasicHeaders'))->setPublic(TRUE);
59 $container->setDefinition('civi_flexmailer_to_header', new Definition('Civi\FlexMailer\Listener\ToHeader'))->setPublic(TRUE);
60 $container->setDefinition('civi_flexmailer_attachments', new Definition('Civi\FlexMailer\Listener\Attachments'))->setPublic(TRUE);
61 $container->setDefinition('civi_flexmailer_bounce_tracker', new Definition('Civi\FlexMailer\Listener\BounceTracker'))->setPublic(TRUE);
62 $container->setDefinition('civi_flexmailer_default_sender', new Definition('Civi\FlexMailer\Listener\DefaultSender'))->setPublic(TRUE);
63 $container->setDefinition('civi_flexmailer_hooks', new Definition('Civi\FlexMailer\Listener\HookAdapter'))->setPublic(TRUE);
64 $container->setDefinition('civi_flexmailer_test_prefix', new Definition('Civi\FlexMailer\Listener\TestPrefix'))->setPublic(TRUE);
66 $container->setDefinition('civi_flexmailer_html_click_tracker', new Definition('Civi\FlexMailer\ClickTracker\HtmlClickTracker'))->setPublic(TRUE);
67 $container->setDefinition('civi_flexmailer_text_click_tracker', new Definition('Civi\FlexMailer\ClickTracker\TextClickTracker'))->setPublic(TRUE);
69 foreach (self
::getListenerSpecs() as $listenerSpec) {
70 $container->findDefinition('dispatcher')->addMethodCall('addListenerService', $listenerSpec);
73 $container->findDefinition('civi_api_kernel')->addMethodCall('registerApiProvider', array(new Reference('civi_flexmailer_api_overrides')));
77 * Get a list of listeners required for FlexMailer.
79 * This is a standalone, private function because we're experimenting
80 * with how exactly to handle the registration -- e.g. via
81 * `registerServices()` or via `registerListeners()`.
84 * Arguments to pass to addListenerService($eventName, $callbackSvc, $priority).
86 protected static function getListenerSpecs() {
87 $listenerSpecs = array();
89 $listenerSpecs[] = array(Validator
::EVENT_CHECK_SENDABLE
, array('civi_flexmailer_abdicator', 'onCheckSendable'), FM
::WEIGHT_START
);
90 $listenerSpecs[] = array(Validator
::EVENT_CHECK_SENDABLE
, array('civi_flexmailer_required_fields', 'onCheckSendable'), FM
::WEIGHT_MAIN
);
91 $listenerSpecs[] = array(Validator
::EVENT_CHECK_SENDABLE
, array('civi_flexmailer_required_tokens', 'onCheckSendable'), FM
::WEIGHT_MAIN
);
93 $listenerSpecs[] = array(FM
::EVENT_RUN
, array('civi_flexmailer_default_composer', 'onRun'), FM
::WEIGHT_MAIN
);
94 $listenerSpecs[] = array(FM
::EVENT_RUN
, array('civi_flexmailer_abdicator', 'onRun'), FM
::WEIGHT_END
);
96 $listenerSpecs[] = array(FM
::EVENT_WALK
, array('civi_flexmailer_default_batcher', 'onWalk'), FM
::WEIGHT_END
);
98 $listenerSpecs[] = array(FM
::EVENT_COMPOSE
, array('civi_flexmailer_basic_headers', 'onCompose'), FM
::WEIGHT_PREPARE
);
99 $listenerSpecs[] = array(FM
::EVENT_COMPOSE
, array('civi_flexmailer_to_header', 'onCompose'), FM
::WEIGHT_PREPARE
);
100 $listenerSpecs[] = array(FM
::EVENT_COMPOSE
, array('civi_flexmailer_bounce_tracker', 'onCompose'), FM
::WEIGHT_PREPARE
);
101 $listenerSpecs[] = array(FM
::EVENT_COMPOSE
, array('civi_flexmailer_default_composer', 'onCompose'), FM
::WEIGHT_MAIN
- 100);
102 $listenerSpecs[] = array(FM
::EVENT_COMPOSE
, array('civi_flexmailer_attachments', 'onCompose'), FM
::WEIGHT_ALTER
);
103 $listenerSpecs[] = array(FM
::EVENT_COMPOSE
, array('civi_flexmailer_open_tracker', 'onCompose'), FM
::WEIGHT_ALTER
);
104 $listenerSpecs[] = array(FM
::EVENT_COMPOSE
, array('civi_flexmailer_test_prefix', 'onCompose'), FM
::WEIGHT_ALTER
);
105 $listenerSpecs[] = array(FM
::EVENT_COMPOSE
, array('civi_flexmailer_hooks', 'onCompose'), FM
::WEIGHT_ALTER
- 100);
107 $listenerSpecs[] = array(FM
::EVENT_SEND
, array('civi_flexmailer_default_sender', 'onSend'), FM
::WEIGHT_END
);
109 return $listenerSpecs;
113 * Tap into the API kernel and override some of the core APIs.
115 * @return \Civi\API\Provider\AdhocProvider
117 public static function createApiOverrides() {
118 $provider = new \Civi\API\Provider\
AdhocProvider(3, 'Mailing');
119 // FIXME: stay in sync with upstream perms
120 $provider->addAction('preview', 'access CiviMail', '\Civi\FlexMailer\API\MailingPreview::preview');
125 * Adapter for using factory methods in old+new versions of Symfony.
127 * @param \Symfony\Component\DependencyInjection\Definition $def
128 * @param string $factoryClass
129 * @param string $factoryMethod
130 * @return \Symfony\Component\DependencyInjection\Definition
133 protected static function applyStaticFactory($def, $factoryClass, $factoryMethod) {
134 if (method_exists($def, 'setFactory')) {
135 $def->setFactory(array($factoryClass, $factoryMethod));
138 $def->setFactoryClass($factoryClass)->setFactoryMethod($factoryMethod);