Files
kupshop/bundles/KupShop/ContentBundle/View/NewsletterSubscribeView.php
2025-08-02 16:30:27 +02:00

188 lines
5.9 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: ondra
* Date: 25.10.17
* Time: 8:55.
*/
namespace KupShop\ContentBundle\View;
use KupShop\ContentBundle\Util\Captcha;
use KupShop\ContentBundle\View\Exception\ValidationException;
use KupShop\KupShopBundle\Context\LanguageContext;
use KupShop\KupShopBundle\Email\NewsletterSubscribeEmail;
use KupShop\KupShopBundle\Exception\PermanentRedirectException;
use KupShop\KupShopBundle\Util\Mail\EmailCheck;
use KupShop\KupShopBundle\Views\Traits\RequestTrait;
use KupShop\KupShopBundle\Views\View;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Contracts\Service\Attribute\Required;
class NewsletterSubscribeView extends View
{
use \DatabaseCommunication;
use RequestTrait;
private $emailService;
private $emailCheck;
private $languageContext;
/** @var SessionInterface */
private $session;
private $hideSubscribeForm = false;
private $isNewlySubscibed = false;
protected $template = 'newsletter.subscribe.tpl';
public function __construct(NewsletterSubscribeEmail $emailService, EmailCheck $emailCheck, LanguageContext $languageContext)
{
$this->emailService = $emailService;
$this->emailCheck = $emailCheck;
$this->languageContext = $languageContext;
}
/**
* @required
*/
public function setSession(SessionInterface $session): void
{
$this->session = $session;
}
public function getTitle()
{
return translate('signUpTitle', 'newsletter');
}
public function getBreadcrumbs()
{
return getReturnNavigation(-1, 'NO_TYPE', ['Newsletter']);
}
public function getBodyVariables()
{
$vars = parent::getBodyVariables();
$return = $this->subscribe();
$vars['subscribed'] = $return;
$vars['act'] = 'subscribe';
$vars['email'] = $this->request->get('email');
$vars['hide_form'] = $this->session->get('hideSubscribeForm', $this->hideSubscribeForm);
$vars['new_subscriber'] = $this->session->get('isNewlySubscibed', $this->isNewlySubscibed);
$this->session->remove('hideSubscribeForm');
$this->session->remove('isNewlySubscibed');
return $vars;
}
public function subscribe()
{
$email = $this->request->get('email');
$code = $this->request->get('code');
$parameters = $this->request->get('parameters', []);
$today = new \DateTime();
$today = $today->format('d.m.Y');
if ($email && !$code) {
$email = filter_var($email, FILTER_VALIDATE_EMAIL);
if (!$this->emailCheck->isEmailDomainValid($email)) {
addUserMessage(translate('errorInvalidEmail', 'newsletter'));
return false;
}
try {
Captcha::checkCaptcha(null, 'shared');
} catch (ValidationException $e) {
addUserMessage($e->getMessage(), 'danger');
return false;
}
if (!$email) {
addUserMessage(translate('errorInvalidEmail', 'newsletter'));
} else {
if (!$this->checkAlreadySubscribed($email)) {
$code = md5($email.'-'.$today);
$message = $this->emailService->getEmail([
'OVEROVACI_ADRESA' => path('kupshop_content_newsletter_subscribe', ['code' => $code, 'email' => $email, 'parameters' => array_filter($this->getSubscribeParameters())], 0),
'EMAIL_UZIVATELE' => $email,
]);
$message['to'] = $email;
$this->emailService->sendEmail($message);
addUserMessage(translate('emailSuccessSent', 'newsletter'), 'success');
$this->hideSubscribeForm = true;
return true;
} else {
addUserMessage(translate('alreadySubscribed', 'newsletter'));
}
}
} elseif ($email && $code) {
$codeCheck = md5($email.'-'.$today);
$yesterday = (new \DateTime())->modify('-1 day')->format('d.m.Y');
$yesterdayCodeCheck = md5($email.'-'.$yesterday);
if ($code == $codeCheck || $code == $yesterdayCodeCheck) {
$fields = ['get_news' => 'Y', 'figure' => 'N'];
if (findModule(\Modules::TRANSLATIONS)) {
$fields['id_language'] = $this->languageContext->getActiveId();
}
$groups = ['Odběr novinek'];
if ($parameters['user_group'] ?? false) {
$groups = array_merge($groups, $parameters['user_group']);
}
addUserEmail($email, $groups, $fields, true);
addUserMessage(translate('newsletterSubscribeSuccess', 'newsletter'), 'success');
if (findModule(\Modules::COMPONENTS)) {
throw new PermanentRedirectException(
path('home')
);
}
$this->session->set('isNewlySubscibed', true);
$this->session->set('hideSubscribeForm', true);
throw new PermanentRedirectException(
path('kupshop_content_newsletter_subscribe')
);
} else {
addUserMessage(translate('linkExpirated', 'newsletter'));
throw new PermanentRedirectException(
path('kupshop_content_newsletter_subscribe')
);
}
}
return false;
}
public function checkAlreadySubscribed($email)
{
$user = $this->selectSQL('users', ['email' => $email, 'get_news' => 'Y'])->fetch();
if ($user) {
return true;
}
return false;
}
protected function getSubscribeParameters(): array
{
return [
'user_group' => $this->request->get('user_group'),
];
}
}