<?php
namespace App\Controller;
use App\Form\NewsletterFormType;
use Factory\SupportBundle\Repository\FormRepository;
use Pimcore\Model\DataObject\IContact;
use App\Classes\Controller\AbstractFrontController as AbstractFrontController;
use App\Classes\DataMapper\Newsletter\NewsletterListingDataMapper;
use App\Classes\IContact\iContactApi;
use App\Service\Contract\RecaptchaValidationServiceInterface;
use App\Traits\ControllerSidebarLinks;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class NewsletterController extends AbstractFrontController
{
use ControllerSidebarLinks;
/**
* @var FormRepository
*/
protected $formRepository;
protected $recaptchaValidationService;
public function __construct(
FormRepository $formRepository,
RecaptchaValidationServiceInterface $recaptchaValidationService
) {
$this->formRepository = $formRepository;
$this->recaptchaValidationService = $recaptchaValidationService;
}
#[Template()]
public function indexAction(Request $request)
{
$lists = [];
$IContact = IContact::getList()->current();
if ($IContact) {
$lists = $IContact->getLists();
}
$formAction = $this->generateUrl('newsletter_subscribe');
$newsletterForm = $this->formRepository->createForm(
NewsletterFormType::class,
null,
['action' => $formAction]
);
$this->view->newsletterForm = $newsletterForm->createView();
$this->view->lists = NewsletterListingDataMapper::list($lists)->all($request);
}
/**
* @Route("newsletter/subscribe", name="newsletter_subscribe", methods={"POST"})
*
* @param Request $request
*/
public function send(Request $request)
{
$listIDs = $request->get('lists');
if (!$listIDs) {
$payload = array_merge(
$request->query->all(),
$request->request->all()
);
$this->addFlash('_oldFormData', serialize($payload));
$this->addFlash('error', $this->trans('newsletter.lists.empty'));
return $this->redirectBack($request);
}
$form = $this->createForm(
NewsletterFormType::class
);
$form->handleRequest($request);
if ($form->isSubmitted() && !$form->isValid()) {
$payload = array_merge(
$request->query->all(),
$request->request->all()
);
$this->addFlash('_oldFormData', serialize($payload));
return $this->redirectBack($request);
}
$data = $form->getData();
if (!$this->recaptchaValidationService->isValid($data)) {
$payload = array_merge(
$request->query->all(),
$request->request->all()
);
$this->addFlash('_oldFormData', serialize($payload));
$this->addFlash('error', 'stoelting.recaptcha-failed.error');
return $this->redirectBack($request);
}
$IContact = IContact::getList()->current();
if ($IContact) {
if (!empty($IContact->getAppID()) && !empty($IContact->getPassword()) && !empty($IContact->getUsername())) {
iContactApi::getInstance()->setConfig(array(
'appId' => $IContact->getAppID(),
'apiPassword' => $IContact->getPassword(),
'apiUsername' => $IContact->getUsername()
));
$oiContact = iContactApi::getInstance();
try {
$data = $form->getData();
$newContact = $oiContact->addContact($data['Email'], null, null, $data['Firstname']);
if ($newContact) {
if ($newContact->email == 'Removed') {
$this->addFlash('error', $this->trans('newsletter.contact.removed'));
} else {
foreach ($listIDs as $listID) {
$oiContact->subscribeContactToList($newContact->contactId, $listID);
}
}
} else {
if ($oiContact->getErrors()) {
$this->addFlash('error', $this->trans('newsletter.contact.empty'));
return $this->redirectBack($request);
}
}
} catch (\Exception $oException) {
$errorMsg = '';
foreach($oiContact->getErrors() as $error){
$errorMsg .= $error;
}
$payload = array_merge(
$request->query->all(),
$request->request->all()
);
$this->addFlash('error', $error);
$this->addFlash('_oldFormData', serialize($payload));
return $this->redirectBack($request);
}
}
}
$this->addFlash('success', $this->trans('newsletter.subscribed.message'));
return $this->redirectBack($request);
}
}