AzineNotifierService::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 8
c 1
b 0
f 0
nc 1
nop 8
dl 0
loc 12
ccs 9
cts 9
cp 1
crap 1
rs 10

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace Azine\EmailBundle\Services;
4
5
use Azine\EmailBundle\DependencyInjection\AzineEmailExtension;
6
use Azine\EmailBundle\Entity\Notification;
7
use Azine\EmailBundle\Entity\RecipientInterface;
8
use Azine\EmailBundle\Entity\Repositories\NotificationRepository;
9
use Doctrine\Common\Persistence\ManagerRegistry;
10
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
11
use Symfony\Component\Translation\TranslatorInterface;
12
13
/**
14
 * This Service compiles and renders the emails to be sent.
15
 *
16
 * @author Dominik Businger
17
 */
18
class AzineNotifierService implements NotifierServiceInterface
19
{
20
    /**
21
     * Override this function to fill in any non-recipient-specific parameters that are required to
22
     * render the notifications-template or one of the  notification-item-templates that
23
     * are rendered into the notifications-template.
24
     *
25
     * @return array
26
     */
27 3
    protected function getVarsForNotificationsEmail()
28
    {
29 3
        $params = array();
30
31 3
        return $params;
32
    }
33
34
    /**
35
     * Override this function to fill in any recipient-specific parameters that are required to
36
     * render the notifications-template or one of the  notification-item-templates that
37
     * are rendered into the notifications-template.
38
     *
39
     * @param RecipientInterface $recipient
40
     *
41
     * @return array
42
     */
43 2
    protected function getRecipientVarsForNotificationsEmail(RecipientInterface $recipient)
44
    {
45 2
        $recipientParams = array();
46 2
        $recipientParams['recipient'] = $recipient;
47 2
        $recipientParams['mode'] = $recipient->getNotificationMode();
48
49 2
        return $recipientParams;
50
    }
51
52
    /**
53
     * Get the subject for the notifications-email to send. Override this function to implement your custom subject-lines.
54
     *
55
     * @param array of array     $contentItems
0 ignored issues
show
Bug introduced by
The type Azine\EmailBundle\Services\of was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
56
     * @param RecipientInterface $recipient
57
     *
58
     * @return string
59
     */
60 2
    public function getRecipientSpecificNotificationsSubject($contentItems, RecipientInterface $recipient)
61
    {
62 2
        $count = sizeof($contentItems);
63
64 2
        if (1 == $count) {
65
            // get the content-item out of the boxed associative array => array(array('templateId' => contentItem))
66 2
            $onlyItem = current(current($contentItems));
67
            // get the title out of the notification in the contentItem
68 2
            return $onlyItem['notification']->getTitle();
69
        }
70
71
        return $this->translatorService->transChoice('_az.email.notifications.subject.%count%', $count, array('%count%' => $count));
72
    }
73
74
    /**
75
     * Override this function to fill in any non-recipient-specific parameters that are required
76
     * to render the newsletter-template and are not provided by the TemplateProvider. e.g. the total number of recipients of this newsletter.
77
     *
78
     * @return array
79
     */
80 1
    protected function getGeneralVarsForNewsletter()
81
    {
82 1
        $vars = array();
83 1
        $vars['recipientCount'] = sizeof($this->recipientProvider->getNewsletterRecipientIDs());
84
85 1
        return $vars;
86
    }
87
88
    /**
89
     * Override this function to fill in any non-recipient-specific content items that are the same
90
     * for all recipients of the newsletter.
91
     *
92
     * E.g. a list of featured events or news-articles.
93
     *
94
     * @return array of templatesIds (without ending) as key and params to render the template as value. => array('AzineEmailBundle:contentItem:message' => array('notification => $someNotification, 'goToUrl' => 'http://example.com', ...));
95
     */
96
    protected function getNonRecipientSpecificNewsletterContentItems()
97
    {
98
        // @codeCoverageIgnoreStart
99
        $contentItems = array();
100
101
        //$contentItems[] = array('AcmeBundle:foo:barSameForAllRecipientsTemplate' => $templateParams);
102
        return $contentItems;
103
        // @codeCoverageIgnoreEnd
104
    }
105
106
    /**
107
     * Override this function to add more parameters that are required to render the newsletter template.
108
     *
109
     * @param RecipientInterface $recipient
110
     *
111
     * @return array
112
     */
113 2
    public function getRecipientSpecificNewsletterParams(RecipientInterface $recipient)
114
    {
115 2
        return array('recipient' => $recipient);
116
    }
117
118
    /**
119
     * Override this function to fill in any recipient-specific content items that are different
120
     * depending on the recipient of the newsletter.
121
     *
122
     * E.g. a list of the recipients latest activites.
123
     *
124
     * @param RecipientInterface $recipient
125
     *
126
     * @return array of arrays with templatesIds (without ending) as key and params to render the template as value.
127
     *               => array(
128
     *               array('AzineEmailBundle:contentItem:message' => array('notification => $someNotification1, 'goToUrl' => 'http://example.com/1', ...))
129
     *               array('AzineEmailBundle:contentItem:message' => array('notification => $someNotification2, 'goToUrl' => 'http://example.com/2', ...))
130
     *               );
131
     */
132
    protected function getRecipientSpecificNewsletterContentItems(RecipientInterface $recipient)
133
    {
134
        // @codeCoverageIgnoreStart
135
        $contentItems = array();
136
137
        //$contentItems[] = array('AcmeBundle:foo:barDifferentForEachRecipientTemplate' => $recipientSpecificTemplateParams);
138
        //$contentItems[] = array(AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TEMPLATE => array('notification' => array('title' => 'SampleMessage', 'created' => new \DateTime('1 hour ago'), 'content' => 'Sample Text. Lorem Ipsum.')));
139
        return $contentItems;
140
        // @codeCoverageIgnoreEnd
141
    }
142
143
    /**
144
     * Override this function to use a custom subject line for each newsletter-recipient.
145
     *
146
     * @param $generalContentItems array of content items. => e.g. array of array('templateID' => array('notification => $someNotification, 'goToUrl' => 'http://example.com', ...))
147
     * @param $recipientContentItems array of content items. => e.g. array of array('templateID' => array('notification => $someNotification, 'goToUrl' => 'http://example.com', ...))
148
     * @param $params array the array with all general template-params, including the item with the key 'subject' containing the default-subject
149
     * @param $recipient RecipientInterface
150
     * @param $locale string The language-code for translation of the subject
151
     *
152
     * @return the subject line
0 ignored issues
show
Bug introduced by
The type Azine\EmailBundle\Services\the was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
153
     */
154 1
    public function getRecipientSpecificNewsletterSubject(array $generalContentItems, array $recipientContentItems, array $params, RecipientInterface $recipient, $locale)
0 ignored issues
show
Unused Code introduced by
The parameter $generalContentItems is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

154
    public function getRecipientSpecificNewsletterSubject(/** @scrutinizer ignore-unused */ array $generalContentItems, array $recipientContentItems, array $params, RecipientInterface $recipient, $locale)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $locale is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

154
    public function getRecipientSpecificNewsletterSubject(array $generalContentItems, array $recipientContentItems, array $params, RecipientInterface $recipient, /** @scrutinizer ignore-unused */ $locale)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $recipientContentItems is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

154
    public function getRecipientSpecificNewsletterSubject(array $generalContentItems, /** @scrutinizer ignore-unused */ array $recipientContentItems, array $params, RecipientInterface $recipient, $locale)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
155
    {
156 1
        return $params['subject'];
157
    }
158
159
    /**
160
     * By overriding this function you can rearrange the content items to you liking. By default no ordering is done, so the order is as follows:.
161
     *
162
     * - all user-specific content items as returned by AzineNotifierService::getRecipientSpecificNewsletterContentItems
163
     * - all non-user-specific content items as returned by AzineNotifierService::getNonRecipientSpecificNewsletterContentItems
164
     *
165
     * @param array $contentItems
166
     *
167
     * @return array
168
     */
169 2
    public function orderContentItems(array $contentItems)
170
    {
171 2
        return $contentItems;
172
    }
173
174
    /**
175
     * Over ride this constructor if you need to inject more dependencies to get all the data together that you need for your newsletter/notifications.
176
     *
177
     * @param TemplateTwigSwiftMailerInterface $mailer
178
     * @param \Twig_Environment                $twig
179
     * @param UrlGeneratorInterface            $router
180
     * @param ManagerRegistry                  $managerRegistry
181
     * @param TemplateProviderInterface        $templateProvider
182
     * @param RecipientProviderInterface       $recipientProvider
183
     * @param TranslatorInterface              $translatorService
184
     * @param array                            $parameters
185
     */
186 8
    public function __construct(TemplateTwigSwiftMailerInterface $mailer, \Twig_Environment $twig, UrlGeneratorInterface $router,
187
                               ManagerRegistry $managerRegistry, TemplateProviderInterface $templateProvider, RecipientProviderInterface $recipientProvider,
188
            TranslatorInterface $translatorService, array $parameters)
189
    {
190 8
        $this->mailer = $mailer;
191 8
        $this->twig = $twig;
192 8
        $this->router = $router;
193 8
        $this->managerRegistry = $managerRegistry;
194 8
        $this->templateProvider = $templateProvider;
195 8
        $this->recipientProvider = $recipientProvider;
196 8
        $this->translatorService = $translatorService;
197 8
        $this->configParameter = $parameters;
198 8
    }
199
200
    //////////////////////////////////////////////////////////////////////////
201
    /* You probably don't need to change or override any of the stuff below */
202
    //////////////////////////////////////////////////////////////////////////
203
204
    const CONTENT_ITEMS = 'contentItems';
205
    /**
206
     * @var TemplateTwigSwiftMailerInterface
207
     */
208
    protected $mailer;
209
210
    /**
211
     * @var \Twig_Environment
212
     */
213
    protected $twig;
214
215
    /**
216
     * @var UrlGeneratorInterface
217
     */
218
    protected $router;
219
220
    /**
221
     * @var TemplateProviderInterface
222
     */
223
    protected $templateProvider;
224
225
    /**
226
     * @var RecipientProviderInterface
227
     */
228
    protected $recipientProvider;
229
230
    /**
231
     * @var ManagerRegistry
232
     */
233
    protected $managerRegistry;
234
235
    /**
236
     * Array of configuration-parameters from the config.yml.
237
     *
238
     * @var array
239
     */
240
    protected $configParameter;
241
242
    /**
243
     * The translator.
244
     *
245
     * @var TranslatorInterface
246
     */
247
    protected $translatorService;
248
249
    /**
250
     * Get the number of seconds in a "one-hour-interval".
251
     *
252
     * @return int of seconds to consider as an hour
253
     */
254 4
    protected function getHourInterval()
255
    {
256
        // about an hour ago (57min)
257
        // this is because if the last run started 60min. ago, then the notifications
258
        // for any recipient have been send after that and would be skipped until the next run.
259
        // if your cron-job runs every minute, this is not needed.
260 4
        return 	60 * 60 - 3 * 60;
261
    }
262
263
    /**
264
     * Get the number of seconds in a "one-day-interval".
265
     *
266
     * @return int of seconds to consider as a day
267
     */
268 3
    protected function getDayInterval()
269
    {
270
        // about a day ago (23h57min)
271
        // this is because if the last run started 24h. ago, then the notifications
272
        // for any recipient have been send after that and would be skipped until the next run.
273
        // if your cron-job runs every minute, this is not needed.
274 3
        return 60 * 60 * 24 - 3 * 60;
275
    }
276
277
    /**
278
     * (non-PHPdoc).
279
     *
280
     * @see Azine\EmailBundle\Services.NotifierServiceInterface::sendNotifications()
281
     */
282 3
    public function sendNotifications(array &$failedAddresses)
283
    {
284
        // get all recipientIds with pending notifications in the database, that are due to be sent
285 3
        $recipientIds = $this->getNotificationRecipientIds();
286
287
        // get vars that are the same for all recipients of this notification-mail-batch
288 3
        $params = $this->getVarsForNotificationsEmail();
289
290 3
        $notificationsTemplate = $this->configParameter[AzineEmailExtension::TEMPLATES.'_'.AzineEmailExtension::NOTIFICATIONS_TEMPLATE];
291
292 3
        $sentCount = 0;
293 3
        foreach ($recipientIds as $recipientId) {
294
            // send the mail for this recipient
295 3
            $failedAddress = $this->sendNotificationsFor($recipientId, $notificationsTemplate, $params);
296 3
            if (null !== $failedAddress && strlen($failedAddress) > 0) {
297 2
                $failedAddresses[] = $failedAddress;
298
            } else {
299 3
                ++$sentCount;
300
            }
301
        }
302
303 3
        return $sentCount;
304
    }
305
306
    /**
307
     * Send the notifications-email for one recipient.
308
     *
309
     * @param int    $recipientId
310
     * @param string $wrapperTemplateName
311
     * @param array  $params              array of parameters for this recipient
312
     *
313
     * @return string|null or the failed email addressess
314
     */
315 3
    public function sendNotificationsFor($recipientId, $wrapperTemplateName, $params)
316
    {
317
        // get the recipient
318 3
        $recipient = $this->recipientProvider->getRecipient($recipientId);
319
320
        // get all Notification-Items for the recipient from the database
321 3
        $notifications = $this->getNotificationsFor($recipient);
322 3
        if (0 == sizeof($notifications)) {
323 1
            return null;
324
        }
325
326
        // get the recipient specific parameters for the twig-templates
327 2
        $recipientParams = $this->getRecipientVarsForNotificationsEmail($recipient);
328 2
        $params = array_merge($recipientParams, $params);
329
330
        // prepare the arrays with template and template-variables for each notification
331 2
        $contentItems = array();
332 2
        foreach ($notifications as $notification) {
333
            // decode the $params from the json in the notification-entity
334 2
            $itemVars = $notification->getVariables();
335 2
            $itemVars = array_merge($params, $itemVars);
336 2
            $itemVars['notification'] = $notification;
337 2
            $itemVars['recipient'] = $recipient;
338
339 2
            $itemTemplateName = $notification->getTemplate();
340
341 2
            $contentItems[] = array($itemTemplateName => $itemVars);
342
        }
343
344
        // add the notifications to the params array so they will be rendered later
345 2
        $params[self::CONTENT_ITEMS] = $contentItems;
346 2
        $params['recipient'] = $recipient;
347 2
        $params['_locale'] = $recipient->getPreferredLocale();
348
349 2
        $subject = $this->getRecipientSpecificNotificationsSubject($contentItems, $recipient);
350
351
        // send the email with the right wrapper-template
352 2
        $sent = $this->mailer->sendSingleEmail($recipient->getEmail(), $recipient->getDisplayName(), $subject, $params, $wrapperTemplateName.'.txt.twig', $recipient->getPreferredLocale());
353
354 2
        if ($sent) {
355
            // save the updated notifications
356 2
            $this->setNotificationsAsSent($notifications);
357
358 2
            return null;
359
        }
360
361 2
        return $recipient->getEmail();
362
    }
363
364
    /**
365
     * (non-PHPdoc).
366
     *
367
     * @see Azine\EmailBundle\Services.NotifierServiceInterface::sendNewsletter()
368
     */
369 2
    public function sendNewsletter(array &$failedAddresses)
370
    {
371
        // params array for all recipients
372 2
        $params = array();
373
374
        // set a default subject
375 2
        $params['subject'] = $this->translatorService->trans('_az.email.newsletter.subject');
376
377
        // get the the non-recipient-specific contentItems of the newsletter
378 2
        $params[self::CONTENT_ITEMS] = $this->getNonRecipientSpecificNewsletterContentItems();
379
380
        // get recipientIds for the newsletter
381 2
        $recipientIds = $this->recipientProvider->getNewsletterRecipientIDs();
382
383 2
        $newsletterTemplate = $this->configParameter[AzineEmailExtension::TEMPLATES.'_'.AzineEmailExtension::NEWSLETTER_TEMPLATE];
384
385 2
        foreach ($recipientIds as $recipientId) {
386 2
            $failedAddress = $this->sendNewsletterFor($recipientId, $params, $newsletterTemplate);
387
388 2
            if (null !== $failedAddress && strlen($failedAddress) > 0) {
389 2
                $failedAddresses[] = $failedAddress;
390
            }
391
        }
392
393 2
        return sizeof($recipientIds) - sizeof($failedAddresses);
394
    }
395
396
    /**
397
     * Send the newsletter for one recipient.
398
     *
399
     * @param int    $recipientId
400
     * @param array  $params          params and contentItems that are the same for all recipients
401
     * @param string $wrapperTemplate
402
     *
403
     * @return string|null or the failed email addressess
404
     */
405 2
    public function sendNewsletterFor($recipientId, array $params, $wrapperTemplate)
406
    {
407 2
        $recipient = $this->recipientProvider->getRecipient($recipientId);
408
409
        // create new array for each recipient.
410 2
        $recipientParams = array_merge($params, $this->getRecipientSpecificNewsletterParams($recipient));
411
412
        // get the recipient-specific contentItems of the newsletter
413 2
        $recipientContentItems = $this->getRecipientSpecificNewsletterContentItems($recipient);
414
415
        // merge the recipient-specific and the general content items. recipient-specific first/at the top!
416 2
        $recipientParams[self::CONTENT_ITEMS] = $this->orderContentItems(array_merge($recipientContentItems, $params[self::CONTENT_ITEMS]));
417 2
        $recipientParams['_locale'] = $recipient->getPreferredLocale();
418
419 2
        if (0 == sizeof($recipientParams[self::CONTENT_ITEMS])) {
420 1
            return $recipient->getEmail();
421
        }
422
423 1
        $subject = $this->getRecipientSpecificNewsletterSubject($params[self::CONTENT_ITEMS], $recipientContentItems, $params, $recipient, $recipient->getPreferredLocale());
424
425
        // render and send the email with the right wrapper-template
426 1
        $sent = $this->mailer->sendSingleEmail($recipient->getEmail(), $recipient->getDisplayName(), $subject, $recipientParams, $wrapperTemplate.'.txt.twig', $recipient->getPreferredLocale());
427
428 1
        if ($sent) {
429
            // save that this recipient has recieved the newsletter
430 1
            return null;
431
        }
432
433 1
        return $recipient->getEmail();
434
    }
435
436
    /**
437
     * Get the Notifications that have not yet been sent yet.
438
     * Ordered by "template" and "title".
439
     *
440
     * @param RecipientInterface $recipient
441
     *
442
     * @return array of Notification
443
     */
444 3
    protected function getNotificationsFor(RecipientInterface $recipient)
445
    {
446
        // get the notification mode
447 3
        $notificationMode = $recipient->getNotificationMode();
448
449
        // get the date/time of the last notification
450 3
        $lastNotificationDate = $this->getNotificationRepository()->getLastNotificationDate($recipient->getId());
451
452 3
        $sendNotifications = false;
453 3
        $timeDelta = time() - $lastNotificationDate->getTimestamp();
454
455 3
        if (RecipientInterface::NOTIFICATION_MODE_IMMEDIATELY == $notificationMode) {
456 3
            $sendNotifications = true;
457 3
        } elseif (RecipientInterface::NOTIFICATION_MODE_HOURLY == $notificationMode) {
458 3
            $sendNotifications = ($timeDelta > $this->getHourInterval());
459 3
        } elseif (RecipientInterface::NOTIFICATION_MODE_DAYLY == $notificationMode) {
460 3
            $sendNotifications = ($timeDelta > $this->getDayInterval());
461
        } elseif (RecipientInterface::NOTIFICATION_MODE_NEVER == $notificationMode) {
462
            $this->markAllNotificationsAsSentFarInThePast($recipient);
463
464
            return array();
465
        }
466
467
        // regularly sent notifications now
468 3
        if ($sendNotifications) {
469 3
            $notifications = $this->getNotificationRepository()->getNotificationsToSend($recipient->getId());
470
471
        // if notifications exist, that should be sent immediately, then send those now disregarding the users mailing-preferences.
472
        } else {
473
            $notifications = $this->getNotificationRepository()->getNotificationsToSendImmediately($recipient->getId());
474
        }
475
476 3
        return $notifications;
477
    }
478
479
    /**
480
     * Get all IDs for Recipients of pending notifications.
481
     *
482
     * @return array of IDs
483
     */
484 3
    protected function getNotificationRecipientIds()
485
    {
486 3
        return $this->getNotificationRepository()->getNotificationRecipientIds();
487
    }
488
489
    /**
490
     * Update (set sent = now) and save the notifications.
491
     *
492
     * @param array $notifications
493
     */
494 2
    protected function setNotificationsAsSent(array $notifications)
495
    {
496 2
        foreach ($notifications as $notification) {
497 2
            $notification->setSent(new \DateTime());
498 2
            $this->managerRegistry->getManager()->persist($notification);
499
        }
500 2
        $this->managerRegistry->getManager()->flush();
501 2
    }
502
503
    /**
504
     * Mark all Notifications as sent long ago, as the recipient never want's to get any notifications.
505
     *
506
     * @param RecipientInterface $recipient
507
     */
508 1
    protected function markAllNotificationsAsSentFarInThePast(RecipientInterface $recipient)
509
    {
510 1
        $this->getNotificationRepository()->markAllNotificationsAsSentFarInThePast($recipient->getId());
511 1
    }
512
513
    /**
514
     * Get the interval in days between newsletter mailings.
515
     */
516 1
    protected function getNewsletterInterval()
517
    {
518 1
        return $this->configParameter[AzineEmailExtension::NEWSLETTER.'_'.AzineEmailExtension::NEWSLETTER_INTERVAL];
519
    }
520
521
    /**
522
     * Get the time of the day when the newsletter should be sent.
523
     *
524
     * @return string Time of the day in the format HH:mm
525
     */
526 1
    protected function getNewsletterSendTime()
527
    {
528 1
        return $this->configParameter[AzineEmailExtension::NEWSLETTER.'_'.AzineEmailExtension::NEWSLETTER_SEND_TIME];
529
    }
530
531
    /**
532
     * Get the DateTime at which the last newsletter mailing probably has taken place, if a newsletter is sent today.
533
     * (Calculated: send-time-today - interval in days).
534
     *
535
     * @return \DateTime
536
     */
537 1
    protected function getDateTimeOfLastNewsletter()
538
    {
539 1
        return new \DateTime($this->getNewsletterInterval().' days ago '.$this->getNewsletterSendTime());
540
    }
541
542
    /**
543
     * Get the DateTime at which the next newsletter mailing will take place, if a newsletter is sent today.
544
     * (Calculated: send-time-today + interval in days).
545
     */
546 1
    protected function getDateTimeOfNextNewsletter()
547
    {
548 1
        return new \DateTime('+'.$this->getNewsletterInterval().' days  '.$this->getNewsletterSendTime());
549
    }
550
551
    /**
552
     * Convenience-function to add and save a Notification-entity.
553
     *
554
     * @param int    $recipientId     the ID of the recipient of this notification => see RecipientProvider.getRecipient($id)
555
     * @param string $title           the title of the notification. depending on the recipients settings, multiple notifications are sent in one email.
556
     * @param string $content         the content of the notification
557
     * @param string $template        the twig-template to render the notification with
558
     * @param array  $templateVars    the parameters used in the twig-template, 'notification' => Notification and 'recipient' => RecipientInterface will be added to this array when rendering the twig-template
559
     * @param int    $importance      important messages are at the top of the notification-emails, un-important at the bottom
560
     * @param bool   $sendImmediately whether or not to ignore the recipients mailing-preference and send the notification a.s.a.p.
561
     *
562
     * @return Notification
563
     */
564 2
    public function addNotification($recipientId, $title, $content, $template, $templateVars, $importance, $sendImmediately)
565
    {
566 2
        $notification = new Notification();
567 2
        $notification->setRecipientId($recipientId);
568 2
        $notification->setTitle($title);
569 2
        $notification->setContent($content);
570 2
        $notification->setTemplate($template);
571 2
        $notification->setImportance($importance);
572 2
        $notification->setSendImmediately($sendImmediately);
573 2
        $notification->setVariables($templateVars);
574 2
        $this->managerRegistry->getManager()->persist($notification);
575 2
        $this->managerRegistry->getManager()->flush($notification);
576
577 2
        return $notification;
578
    }
579
580
    /**
581
     * Convenience-function to add and save a Notification-entity for a message => see AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TYPE.
582
     *
583
     * The following default are used:
584
     * $importance		= NORMAL
585
     * $sendImmediately	= fale
586
     * $template		= template for type AzineTemplateProvider::CONTENT_ITEM_MESSAGE_TYPE
587
     * $templateVars	= only those from the template-provider
588
     *
589
     * @param int    $recipientId
590
     * @param string $title
591
     * @param string $content     nl2br will be applied in the html-version of the email
592
     * @param string $goToUrl     if this is supplied, a link "Go to message" will be added
593
     */
594 1
    public function addNotificationMessage($recipientId, $title, $content, $goToUrl = null)
595
    {
596 1
        $contentItemTemplate = $this->configParameter[AzineEmailExtension::TEMPLATES.'_'.AzineEmailExtension::CONTENT_ITEM_TEMPLATE];
597 1
        $templateVars = array();
598 1
        if (null !== $goToUrl && strlen($goToUrl) > 0) {
599 1
            $templateVars['goToUrl'] = $goToUrl;
600
        }
601 1
        $this->addNotification($recipientId, $title, $content, $contentItemTemplate, $this->templateProvider->addTemplateVariablesFor($contentItemTemplate, $templateVars), Notification::IMPORTANCE_NORMAL, false);
602 1
    }
603
604
    /**
605
     * @return NotificationRepository
606
     */
607 4
    protected function getNotificationRepository()
608
    {
609 4
        return $this->managerRegistry->getRepository('AzineEmailBundle:Notification');
610
    }
611
}
612