<?php
namespace Acme\SudcmsBundle\Controller\Front;
use Acme\SudcmsBundle\Repository\ActualiteRepository;
use Acme\SudcmsBundle\Repository\AutopromoRepository;
use Acme\SudcmsBundle\Repository\CatalogRepository;
use Acme\SudcmsBundle\Repository\EcoProductsRepository;
use Acme\SudcmsBundle\Repository\FlashMessageRepository;
use Acme\SudcmsBundle\Repository\FormAdressesRepository;
use Acme\SudcmsBundle\Repository\SiteReferencementRepository;
use Acme\SudcmsBundle\Repository\SiteRepository;
use Acme\SudcmsBundle\Service\BrevoService;
use Acme\SudcmsBundle\Service\MailerService;
use Acme\SudcmsBundle\Service\OtideaUtils;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;
use const SITE_NAME;
class FrontHomeController extends AbstractController
{
private $twig = false;
private $session;
public function __construct()
{
$this->session = new Session();
}
#[Route(path: '/', name: 'front_home')]
public function index(Request $request, Environment $twig, AutopromoRepository $autopromoRepository, OtideaUtils $otideaUtils, FlashMessageRepository $flashMessage, SiteReferencementRepository $repoAccRef, EcoProductsRepository $repoProd, CatalogRepository $repoCatalog, ActualiteRepository $repoActu, SiteRepository $siteRepository)
{
$this->twig = $twig;
// use to delete old data in ContactHistorique for ex.
$otideaUtils->deleteOldData();
$accRef = $repoAccRef->findOneBy(['site_lang' => $request->getLocale(), 'site_uid' => CURRENT_SITE_ID]);
if (is_null($accRef)) {
$accRef = $repoAccRef->findOneBy(['site_uid' => $this->session->get('admin_site_uid'), 'site_lang' => 'fr']);
}
//autopromo
$tabPromoZone1 = $tabPromoZone2 = $tabPromoZone3 = null;
$autoPromos = $autopromoRepository->findBy(array("isOnline" => 1, 'siteLang' => $request->getLocale(), 'siteUid' => CURRENT_SITE_ID), array('autopromoOrder' => 'ASC'));
$productsBestSellers = $repoProd->findBestSellerHome();
$productsNews = $repoProd->findNouveauteHome();
foreach ($autoPromos as $auto) {
if ($auto->getSection() == 1)
$tabPromoZone1[] = $auto;
elseif ($auto->getSection() == 2)
$tabPromoZone2[] = $auto;
elseif ($auto->getSection() == 3)
$tabPromoZone3[] = $auto;
}
$verifVideo = $this->verifVideo();
$flashInfo = $flashMessage->findBy(array('flash_enligne' => 1, 'site_lang' => $request->getLocale(), 'site_uid' => CURRENT_SITE_ID), array('flash_ordre' => 'ASC'));
$limitActu = $siteRepository->findOneBy(['id' => CURRENT_SITE_ID]);
$rentCatalog = $repoCatalog->findByCatAllCatalog(['site_lang' => $request->getLocale(), 'site_uid' => CURRENT_SITE_ID, 'categorie' => 0, 'isSell' => 2], ['cat_date_publication' => 'DESC']);
return $this->render('front/front_home/index.html.twig', [
'autoPromoList' => $autoPromos,
'rentCatalog' => $rentCatalog,
'tabPromoZone1' => $tabPromoZone1,
'tabPromoZone2' => $tabPromoZone2,
'tabPromoZone3' => $tabPromoZone3,
'actualites' => $repoActu->findByCatAllActu(['site_lang' => $request->getLocale(), 'site_uid' => CURRENT_SITE_ID, 'limit' => 3, 'categorie' => 0]),
'flashInfo' => $flashInfo,
'verifVideo' => $verifVideo,
'accRef' => $accRef,
'productsNews' => $productsNews,
'productsBestSellers' => $productsBestSellers,
'isHome' => true,
]);
}
#[Route(path: '/axAddNewsletter', name: 'axAddNewsletter')]
public function axAddNewsletter(Request $request, BrevoService $brevoService)
{
if (!$request->isXmlHttpRequest()) {
return new JsonResponse(['status' => false]);
}
$rgpd = filter_var($request->get('rgpd'), FILTER_VALIDATE_BOOLEAN);
$mail = $request->get('mail');
$flashMsg = '';
// Validation de l'e-mail avec une expression régulière
if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
$flashMsg = 'Veuillez saisir une adresse e-mail valide.';
return new JsonResponse(['status' => false, 'flashMsg' => $flashMsg]);
}
// Filtrage supplémentaire pour restreindre les caractères autorisés
if (preg_match('/[^a-zA-Z0-9@._-]/', $mail)) {
$flashMsg = 'L\'adresse e-mail ne doit contenir que des lettres, des chiffres, et les caractères @, ., - et _.';
return new JsonResponse(['status' => false, 'flashMsg' => $flashMsg]);
}
if (!$rgpd) {
$flashMsg = 'Veuillez accepter les conditions.';
return new JsonResponse(['status' => false, 'flashMsg' => $flashMsg]);
}
try {
if ($mail) {
$brevoService->addReplyTo($mail);
$flashMsg = 'Vous avez été ajouté avec succès à notre newsletter.';
} else {
$flashMsg = "Veuillez remplir tous les champs requis.";
}
return new JsonResponse(['status' => true, 'flashMsg' => $flashMsg]);
} catch (\Exception $e) {
if ($e->getCode() === 400 && str_contains($e->getMessage(), 'Invalid email address')) {
$flashMsg = 'Veuillez saisir une adresse e-mail valide.';
} elseif (str_contains($e->getMessage(), 'missing_parameter')) {
$flashMsg = 'Veuillez remplir tous les champs requis.';
} elseif (str_contains($e->getMessage(), 'Contact already exist')) {
$flashMsg = 'Vous êtes déjà inscrit à notre newsletter.';
} else {
$flashMsg = 'Une erreur est survenue, veuillez réessayer ultérieurement.';
}
return new JsonResponse(['status' => false, 'flashMsg' => $flashMsg]);
}
}
public function verifVideo()
{
$exist = false;
$directory[] = $this->getParameter("upload_directory_" . CURRENT_SITE_ID) . '/video_accueil';
foreach ($directory as $dir) {
if (!file_exists($dir)) {
mkdir($dir, 755);
}
}
// $allFiles = scandir($this->getParameter("upload_directory") . '/video_accueil');
$allFiles = scandir($this->getParameter("upload_directory_" . CURRENT_SITE_ID) . '/video_accueil');
$files = array_diff($allFiles, array('.', '..'));
foreach ($files as $file) {
if ($file == 'home-loop.mp4') {
$exist = true;
}
}
return $exist;
}
public function emailExemple(MailerService $mailerService, FormAdressesRepository $adressesRepository)
{
$files = array();
$mailerService->fromEmail = "no-reply@domaine.fr";
$mailerService->fromName = SITE_NAME;
$mailerService->subject = "Validation de votre commande";
$allRecipients = [];
$recipients = $adressesRepository->findBy(["form" => "contact"]);
if (sizeof($recipients) > 0) {
foreach ($recipients as $element) {
$allRecipients[] = [
"nom" => $element->getNom(),
"prenom" => $element->getPrenom(),
"email" => $element->getEmail(),
"type" => $element->getType()
];
}
}
$htmlContent = $this->renderView('layouts_emails/validation_commande.html.twig', [
'articles' => '',
]);
$mailerService->sendMail($allRecipients, $htmlContent, $files);
}
}