Keine Beschreibung

SubscriberActions.php 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. namespace MailPoet\Subscribers;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\SubscriberEntity;
  5. use MailPoet\Models\Segment;
  6. use MailPoet\Models\Subscriber;
  7. use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
  8. use MailPoet\Segments\SegmentsRepository;
  9. use MailPoet\Settings\SettingsController;
  10. use MailPoet\Util\Helpers;
  11. class SubscriberActions {
  12. /** @var SettingsController */
  13. private $settings;
  14. /** @var NewSubscriberNotificationMailer */
  15. private $newSubscriberNotificationMailer;
  16. /** @var ConfirmationEmailMailer */
  17. private $confirmationEmailMailer;
  18. /** @var WelcomeScheduler */
  19. private $welcomeScheduler;
  20. /** @var SubscriberSaveController */
  21. private $subscriberSaveController;
  22. /** @var SubscribersRepository */
  23. private $subscribersRepository;
  24. /** @var SubscriberSegmentRepository */
  25. private $subscriberSegmentRepository;
  26. /** @var SegmentsRepository */
  27. private $segmentsRepository;
  28. public function __construct(
  29. SettingsController $settings,
  30. NewSubscriberNotificationMailer $newSubscriberNotificationMailer,
  31. ConfirmationEmailMailer $confirmationEmailMailer,
  32. WelcomeScheduler $welcomeScheduler,
  33. SegmentsRepository $segmentsRepository,
  34. SubscriberSaveController $subscriberSaveController,
  35. SubscribersRepository $subscribersRepository,
  36. SubscriberSegmentRepository $subscriberSegmentRepository
  37. ) {
  38. $this->settings = $settings;
  39. $this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer;
  40. $this->confirmationEmailMailer = $confirmationEmailMailer;
  41. $this->welcomeScheduler = $welcomeScheduler;
  42. $this->subscriberSaveController = $subscriberSaveController;
  43. $this->subscribersRepository = $subscribersRepository;
  44. $this->subscriberSegmentRepository = $subscriberSegmentRepository;
  45. $this->segmentsRepository = $segmentsRepository;
  46. }
  47. public function subscribe($subscriberData = [], $segmentIds = []): SubscriberEntity {
  48. // filter out keys from the subscriber_data array
  49. // that should not be editable when subscribing
  50. $subscriberData = $this->subscriberSaveController->filterOutReservedColumns($subscriberData);
  51. $signupConfirmationEnabled = (bool)$this->settings->get(
  52. 'signup_confirmation.enabled'
  53. );
  54. $subscriberData['subscribed_ip'] = Helpers::getIP();
  55. $subscriber = $this->subscribersRepository->findOneBy(['email' => $subscriberData['email']]);
  56. if (!$subscriber && !isset($subscriberData['source'])) {
  57. $subscriberData['source'] = Source::FORM;
  58. }
  59. if (!$subscriber || !$signupConfirmationEnabled) {
  60. // create new subscriber or update if no confirmation is required
  61. $subscriber = $this->subscriberSaveController->createOrUpdate($subscriberData, $subscriber);
  62. } else {
  63. // store subscriber data to be updated after confirmation
  64. $unconfirmedData = $this->subscriberSaveController->filterOutReservedColumns($subscriberData);
  65. $unconfirmedData = json_encode($unconfirmedData);
  66. $subscriber->setUnconfirmedData($unconfirmedData ?: null);
  67. }
  68. // Update custom fields
  69. $this->subscriberSaveController->updateCustomFields($subscriberData, $subscriber);
  70. // restore trashed subscriber
  71. if ($subscriber->getDeletedAt()) {
  72. $subscriber->setDeletedAt(null);
  73. }
  74. // set status depending on signup confirmation setting
  75. if ($subscriber->getStatus() !== SubscriberEntity::STATUS_SUBSCRIBED) {
  76. if ($signupConfirmationEnabled === true) {
  77. $subscriber->setStatus(SubscriberEntity::STATUS_UNCONFIRMED);
  78. } else {
  79. $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
  80. }
  81. }
  82. $this->subscribersRepository->flush();
  83. // link subscriber to segments
  84. $segments = $this->segmentsRepository->findBy(['id' => $segmentIds]);
  85. $this->subscriberSegmentRepository->subscribeToSegments($subscriber, $segments);
  86. $subscriberModel = Subscriber::findOne($subscriber->getId());
  87. if ($subscriberModel) {
  88. $this->confirmationEmailMailer->sendConfirmationEmailOnce($subscriberModel);
  89. }
  90. // We want to send the notification on subscribe only when signupConfirmation is disabled
  91. if ($signupConfirmationEnabled === false && $subscriber->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED && $subscriberModel) {
  92. $this->newSubscriberNotificationMailer->send($subscriberModel, Segment::whereIn('id', $segmentIds)->findMany());
  93. $this->welcomeScheduler->scheduleSubscriberWelcomeNotification(
  94. $subscriber->getId(),
  95. $segmentIds
  96. );
  97. }
  98. return $subscriber;
  99. }
  100. }