customerAccountManagement = $customerAccountManagement; $this->emailValidator = $emailValidator ?: ObjectManager::getInstance()->get(EmailValidator::class); parent::__construct( $context, $subscriberFactory, $customerSession, $storeManager, $customerUrl ); } /** * Validates that the email address isn't being used by a different account. * * @param string $email * @throws LocalizedException * @return void */ protected function validateEmailAvailable($email) { $websiteId = $this->_storeManager->getStore()->getWebsiteId(); if ($this->_customerSession->isLoggedIn() && ($this->_customerSession->getCustomerDataObject()->getEmail() !== $email && !$this->customerAccountManagement->isEmailAvailable($email, $websiteId)) ) { throw new LocalizedException( __('This email address is already assigned to another user.') ); } } /** * Validates that if the current user is a guest, that they can subscribe to a newsletter. * * @throws LocalizedException * @return void */ protected function validateGuestSubscription() { if ($this->_objectManager->get(ScopeConfigInterface::class) ->getValue( Subscriber::XML_PATH_ALLOW_GUEST_SUBSCRIBE_FLAG, ScopeInterface::SCOPE_STORE ) != 1 && !$this->_customerSession->isLoggedIn() ) { throw new LocalizedException( __( 'Sorry, but the administrator denied subscription for guests. Please register.', $this->_customerUrl->getRegisterUrl() ) ); } } /** * Validates the format of the email address * * @param string $email * @throws LocalizedException * @return void */ protected function validateEmailFormat($email) { if (!$this->emailValidator->isValid($email)) { throw new LocalizedException(__('Please enter a valid email address.')); } } /** * New subscription action * * @return void */ public function execute() { if ($this->getRequest()->isPost() && $this->getRequest()->getPost('email')) { $email = (string)$this->getRequest()->getPost('email'); try { $this->validateEmailFormat($email); $this->validateGuestSubscription(); $this->validateEmailAvailable($email); $subscriber = $this->_subscriberFactory->create()->loadByEmail($email); if ($subscriber->getId() && (int) $subscriber->getSubscriberStatus() === Subscriber::STATUS_SUBSCRIBED ) { throw new LocalizedException( __('This email address is already subscribed.') ); } $status = (int) $this->_subscriberFactory->create()->subscribe($email); $this->messageManager->addSuccessMessage($this->getSuccessMessage($status)); } catch (LocalizedException $e) { $this->messageManager->addErrorMessage($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addExceptionMessage($e, __('Something went wrong with the subscription.')); } } $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl()); } /** * Get success message * * @param int $status * @return Phrase */ private function getSuccessMessage(int $status): Phrase { if ($status === Subscriber::STATUS_NOT_ACTIVE) { return __('The confirmation request has been sent.'); } return __('Thank you for your subscription.'); } }