<?php
namespace App\Controller;
use App\ClassTheatre\asides;
use App\ClassTheatre\TheatreController;
use App\Service\Functions;
use App\Service\TheatreMail\TheatreMail;
use App\Validator\Recaptcha;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Entity\Newsletters;
use TheatreCore\Entity\Subscribers;
use TheatreCore\Form\Type\RecaptchaType;
class LettreController extends TheatreController
{
// objet newsletters
public $newsletters = null;
// objet abonnés / subscribers
public $subscribers = null;
private $logger;
// {{{ _construct()
/** constructeur hérité
*
*/
public function __construct(
EntityManagerInterface $em,
TranslatorInterface $translator,
TokenStorageInterface $tokenStorage,
Functions $func,
TheatreMail $TheatreMail,
LoggerInterface $logger
)
{
// surbrillance du menu principal (thnet)
$GLOBALS['rub_courante'] = 'index';
parent::__construct($translator, $tokenStorage);
$GLOBALS['editset'] = 'lettre';
$this->context['controller'] = 'lettre';
$this->em = $em;
$this->func = $func;
$this->TheatreMail = $TheatreMail;
$this->asides = new asides();
$this->logger = $logger;
}
public function InitController($request = null)
{
// raccourcis
/* Lettre thnet, par défaut */
$newsletters_set = array('thnet');
$newsletters_opt = array();
$orig = 'thnet';
$newsletter = 'thnet';
// obtenir les labels
$this->newsletters = $this->em->getRepository(Newsletters::class);
$lettres_desc = $this->newsletters->getNewsletters(null, array('identifier', 'name'));
$lettres_label = array();
foreach ($lettres_desc as $lettre) {
$lettres_label[$lettre['identifier']] = $lettre['name'];
}
// demande une lettre d'infos spécifique
if (!empty($_REQUEST['newsletter'])) {
// par defaut : la lettre demandée + thnet en option
if (array_key_exists($_REQUEST['newsletter'], $lettres_label) && $_REQUEST['newsletter'] != 'thnet') {
$rq_newsletter = $_REQUEST['newsletter'];
$newsletters_set = array($rq_newsletter);
$newsletters_opt = array('thnet' => array('label' => $lettres_label['thnet'], 'default' => 1));
$orig = $rq_newsletter;
$newsletter = $orig;
$this->view->lettre_name = $lettres_label[$rq_newsletter];
$this->view->{'type_' . $rq_newsletter} = true;
$newsletter_image_path = getenv('PATH_IMG') . 'menu/logo/' . $newsletter . '.jpg';
if (file_exists($newsletter_image_path)) {
$this->view->newsletter_image = $newsletter . '.jpg';
}
}
}
$this->view->newsletter = $newsletter;
$this->view->newsletter_label = $lettres_label[$newsletter];
$this->view->newsletters_set = $newsletters_set;
$this->view->newsletters_opt = $newsletters_opt;
$this->view->orig = $orig;
// origine de l'inscript et lien de retour
if (!empty($_REQUEST['nlfrom'])) {
$this->view->nlfrom = $_REQUEST['nlfrom'];
$this->view->backurl = urldecode($_REQUEST['nlfrom']);
}
// table des abonnés
$this->subscribers = $this->em->getRepository(Subscribers::class);
// le formulaire d'inscription
$this->formInscription($request);
//print_r($_POST);
// $submit = !empty($_REQUEST['inscription']);
// si le formulaire est bien rempli
if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
$this->validate();
}
}
// {{{ finalizeAction()
/** Code exécuté après chaque action
*
*
* @access protected
* @return void
*/
protected function finalizeAction()
{
$this->view->aside = $this->asides->view($this->view);
}
/**
* @Route("/lettre/inscription", name="lettre_inscription")
*/
public function inscription()
{
return $this->redirectToRoute('index', [], Response::HTTP_MOVED_PERMANENTLY);
}
public function formInscription($request = null)
{
// retrouver les infos sur les user
$user_infos = $this->getUser();
$this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
'attr' => [
'id' => 'masterform'
]
]);
// elements du formulaire
$this->context['formFactory']->add('email', TextType::class, [
'label' => 'Votre adresse de courriel',
'constraints' => [
new NotBlank([
'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
]),
new Email([
'message' => 'Votre adresse de courriel : veuillez verifier votre adresse de courriel'
])
],
'attr' => [
'size' => '40',
'id' => 'email'
]
]);
$this->context['formFactory']->add('pays', ChoiceType::class, [
'label' => 'Votre pays',
'choices' => $this->subscribers->getCountryList(),
'constraints' => [
new NotBlank([
'message' => 'Pays : veuillez préciser le pays'
]),
new Length([
'max' => 2,
'maxMessage' => 'Pays : veuillez préciser le pays'
])
],
'attr' => [
'id' => 'pays'
]
]);
if (empty($_POST['pays'])) {
$this->context['formFactory']->setData(array('pays' => 'FR'));
}
$this->context['formFactory']->add('inscription', SubmitType::class, [
'label' => 'Inscription',
'attr' => [
'class' => 'boutform'
]
]);
// captcha
if ($_ENV['CAPTCHA_ACTIVE'] && !($this->getUser() instanceof Extranetusers)) {
$this->context['formFactory']->add('recaptcha', RecaptchaType::class, [
'mapped' => false,
'empty_data' => '1',
'constraints' => [
new Recaptcha([
'request' => $request
])
]
]);
}
// on a le mail ou c'est un abonné connecté
if (!empty($_GET['email'])) {
$this->context['formFactory']->setData(array('email' => $_GET['email']));
} elseif ($user_infos instanceof Extranetusers && !empty($user_infos->getEmail())) {
$this->context['formFactory']->setData(array('email' => $user_infos->getEmail()));
}
$this->context['form'] = $this->context['formFactory']->getForm();
$this->context['form']->handleRequest($request);
}
public function validate()
{
$error = &$this->context['error'];
$reponse = &$this->context['reponse'];
// formatage des majuscules minuscules slash et globales
$email = addslashes(strtolower($this->context['form']->get('email')->getData()));
// origine de l'inscription
if (!empty($_POST['orig'])) {
$orig = $_POST['orig'];
} else {
$orig = 'thnet';
}
if (!empty($_POST['lang'])) {
$lang = $_POST['lang'];
} else {
$lang = 'fr';
}
$pays = $this->context['form']->get('pays')->getData();
// definition des champs de la table
$valeur_champs = array(
$lang => 1,
);
//print_r($_POST);
$lettres = array_keys($_POST['lettre']);
if (!empty($lettres)) {
// verifier si l'utilisateur n'est pas déjà inscrit à une des lettres
foreach ($lettres as $k => $l) {
if ($this->subscribers->isSubscriber($email, $l)) {
unset($lettres[$k]);
$lettres_inscrit[$k] = $l;
}
}
// liste des lettres déjà abonné
if (!empty($lettres_inscrit)) {
$lettres_inscrit_desc = $this->newsletters->getNewsletters($lettres_inscrit, array('identifier', 'name'));
$liste_lettres_inscrit = array();
foreach ($lettres_inscrit_desc as $lettre) {
$liste_lettres_inscrit[] = $lettre['name'];
}
$reponse['inscription_deja'] = $this->context['tr']->trans('inscription_lettre_deja', ['slug_lettre' => implode($liste_lettres_inscrit, ', ')]);
$this->view->inscription_ok = true;
}
}
if (!empty($lettres)) {
//$subscribers->set_debug(true);
// incription aux lettres
$success = $this->subscribers->setSubscribe($email, $lettres, $pays, $orig, $valeur_champs);
// ok
if ($success) {
$lettres_desc = $this->newsletters->getNewsletters($lettres, array('identifier', 'name'));
$liste_lettres = array();
foreach ($lettres_desc as $lettre) {
$liste_lettres[] = $lettre['name'];
}
$reponse['inscription_ok'] = $this->context['tr']->trans('inscription_lettre_ok', ['slug_lettre' => implode($liste_lettres, ', ')]);
$this->view->inscription_ok = true;
} else {
$error['inscription_no'] = $this->context['tr']->trans('erreur_enregistrement');
}
// si inscription OK, on envoie un mail
if (empty($error) && $success) {
// envoi du message
$this->TheatreMail->setDestinataire($email); // destinataire
$this->TheatreMail->setExpediteur(getenv('CONTACT_MAIL')); // expediteur et return-path
$this->TheatreMail->setSubject($this->context['tr']->trans('inscription_lettre_sujet'));
// adresse de la page de desincription
$desth = getenv('URL_THNET') . '/lettre/desinscription';
// texte de la nl
$params_tr = array(
'lettre' => implode($liste_lettres, "\r\n"),
'desinscrire' => $desth
);
$this->TheatreMail->prepare(
'emails/inscription_lettre.html.twig',
$params_tr,
'emails/inscription_lettre.txt.twig'
);
// envoi
try {
$this->TheatreMail->send();
$reponse['ok'] = 'Message de confirmation envoyé.';
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
$this->logger->debug(($e->getTraceAsString()));
}
}
}
$this->view->reponse = $reponse;
}
}