<?php
namespace Acme\SudcmsBundle\Controller\Admin;
use Acme\SudcmsBundle\Entity\Autopromo;
use Acme\SudcmsBundle\Form\AutopromoType;
use Acme\SudcmsBundle\Repository\AutopromoRepository;
use Acme\SudcmsBundle\Repository\ModuleRepository;
use Acme\SudcmsBundle\Repository\OptionsRepository;
use Acme\SudcmsBundle\Service\FileService;
use Acme\SudcmsBundle\Service\FlashNotificationAjax;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\String\Slugger\SluggerInterface;
use Twig\Environment;
#[Route(path: '/admin/autopromo')]
class AdminAutopromoController extends AbstractController
{
private $entityManager;
private $fileService;
private $autorizedMedias = ['jpg', 'jpeg', 'png'];
private $autorizedVideos = ['mp4'];
private $session;
private $moduleName;
private $twig = null;
public function __construct(EntityManagerInterface $entityManager, KernelInterface $appKernel, SluggerInterface $slugger, Filesystem $filesystem, FileService $fileService, ModuleRepository $repoMod, OptionsRepository $repoOpt, Environment $twig)
{
$this->entityManager = $entityManager;
$this->fileService = $fileService;
$this->slugger = $slugger;
$this->filesystem = $filesystem;
$this->postMaxSize = substr(ini_get('post_max_size'), 0, -1);
$this->uploadMaxFilesize = substr(ini_get('upload_max_filesize'), 0, -1);
$this->session = new Session();
$this->twig = $twig;
$this->moduleName = "admin_autopromo";
$optionsModule = $repoOpt->findBy(['option_name' => $this->moduleName], ['option_order' => 'ASC']);
$this->twig->addGlobal("optionsModule", $optionsModule);
//Création des répertoires lors de la première installation
$directory[] = $appKernel->getProjectDir() . '/public/medias_front/autopromo';
foreach ($directory as $dir) {
if (!file_exists($dir)) {
mkdir($dir, 755);
}
}
}
#[Route(path: '/', name: 'admin_autopromo')]
public function listAutopromo(Request $request, AutopromoRepository $autoPromoRepository)
{
if (isset($_FILES['video_fichier']) && !empty($_FILES['video_fichier'])) {
$file_name = $_FILES['video_fichier']['name'];
$file_extension = strrchr($file_name, ".");
$file_tmp_name = $_FILES['video_fichier']['tmp_name'];
$filedest = $this->getParameter("upload_directory_" . $this->session->get('admin_site_uid')) . '/video_accueil/';
$extension_autorisees = array(
0 => '.mp4',
1 => '.MP4'
);
$message = $file_extension . "<br>";
$message = $file_extension . "<br>";
$message = $file_extension . "<br>";
if (in_array($file_extension, $extension_autorisees)) {
// var_dump($_FILES['video_fichier']) ;
$neoFile_name = "home-loop.mp4";
if (move_uploaded_file($file_tmp_name, $filedest . $neoFile_name)) {
// echo "OK";
$message .= "La vidéo à bien été enregistrée";
$this->addFlash('success', $message);
} else {
// echo'Erreur';
// $message .= "Erreur";
$message .= "Erreur";
if ($_FILES['video_fichier']['error'] == 1) {
$message .= " : Poids du fichier supérieur à la limite autorisée";
$message .= "<br>";
$message .= "upload_max_filesize : " . ini_get('upload_max_filesize');
$message .= "<br>";
}
$this->addFlash('danger', $message);
}
} else {
$message .= "Erreur : Le format doit-être de type '.mp4'";
// echo'Uniquement .mp4, .MP4';
$this->addFlash('danger', $message);
}
}
$verifVideo = $this->verifVideo();
return $this->render('admin/admin_autopromo/index.html.twig', [
'autopromoList' => $autoPromoRepository->findBy(['siteUid' => $this->session->get('admin_site_uid'), 'siteLang' => $this->session->get('admin_site_lang')], array('autopromoOrder' => 'ASC')),
'autorizedVideos' => $this->autorizedVideos,
'postMaxSize' => $this->postMaxSize,
'uploadMaxFilesize' => $this->uploadMaxFilesize,
'verifVideo' => $verifVideo,
]);
}
public function verifVideo()
{
$exist = false;
$directory[] = $this->getParameter("upload_directory_" . $this->session->get('admin_site_uid')) . '/video_accueil';
foreach ($directory as $dir) {
if (!file_exists($dir)) {
mkdir($dir, 755);
}
}
$allFiles = scandir($this->getParameter("upload_directory_" . $this->session->get('admin_site_uid')) . '/video_accueil');
$files = array_diff($allFiles, array('.', '..'));
foreach ($files as $file) {
if ($file == 'home-loop.mp4') {
$exist = true;
}
}
return $exist;
}
#[Route(path: '/edit/{id}', name: 'admin_autopromo_edit', defaults: ['id' => 0])]
public function editAutopromo($id, AutopromoRepository $repo, Request $request)
{
$promo = new AutoPromo;
if ($id > 0)
$promo = $repo->find($id);
$form = $this->createForm(AutoPromoType::class, $promo);
$oldFileName = $promo->getImage();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($id == 0) {
$promo->setCreationDatetime(new \DateTime());
$promo->setSiteUid($this->session->get('admin_site_uid'));
$promo->setSiteLang($this->session->get('admin_site_lang'));
}
// upload du fichier
if ($form->get("image")->getData() !== null) {
$upload = $this->fileService->startUpload(
[
"fileData" => $form->get("image")->getData(),
"oldFileName" => $oldFileName,
"fileDestination" => $this->getParameter("upload_autopromo_" . $this->session->get('admin_site_uid')),
"autorizedExtensions" => $this->autorizedMedias,
"createWebp" => true
]);
// upload OK
if (isset($upload['state']) && $upload['state'] && isset($upload['filename']) && is_string($upload['filename'])) {
$promo->setImage($upload['filename']);
} // upload KO avec message perso
elseif (isset($upload['error_msg'])) {
$errorMsg = $upload['error_msg'];
$promo->setImage($oldFileName);
} // upload KO avec message générique
else {
$errorMsg = "Une erreur s'est produite lors de l'enregistrement du fichier";
$promo->setImage($oldFileName);
}
} else {
$promo->setImage($oldFileName);
}
try {
$this->entityManager->persist($promo);
$this->entityManager->flush();
} catch (Exception $e) {
$errorMsg = "Une erreur s'est produite lors de l'enregistrement";
}
$txt = $id > 0 ? "modifiée" : "ajoutée";
// il y a eu une erreur
if (isset($errorMsg)) {
$this->addFlash('danger', $errorMsg);
} // pas d'erreur
else {
$this->addFlash('success', "L'autopromo <b>" . $promo->getTitle() . "</b> a été " . $txt);
return $this->redirectToRoute('admin_autopromo');
}
}
return $this->render('admin/admin_autopromo/edit_autopromo.html.twig', [
'form' => $form->createView(),
'autopromo' => $promo,
'autorizedImages' => $this->autorizedMedias,
]);
}
#[Route(path: '/remove/{id}', name: 'admin_autopromo_remove')]
public function removeAutopromo($id, AutopromoRepository $promo)
{
$promo = $promo->find($id);
$filename = $promo->getImage();
$title = $promo->getTitle();
$this->entityManager->remove($promo);
$this->entityManager->flush();
try {
if (is_string($filename) && $filename != "" && $this->filesystem->exists($file = $this->getParameter('upload_autopromo_' . $this->session->get('admin_site_uid')) . "/" . $filename)) {
$this->fileService->removeFile([
"filePath" => $this->getParameter('upload_autopromo_' . $this->session->get('admin_site_uid')),
"filename" => $filename,
]);
}
$this->addFlash('success', "L'autopromo <b>" . $title . "</b> a pas été supprimée");
} catch (FileException $e) {
$this->addFlash('danger', "L'autopromo <b>" . $title . "</b> n'a pas été supprimée");
}
return $this->redirectToRoute('admin_autopromo');
}
/**
* @param Request $request
*/
#[Route(path: '/axSortAutopromo', name: 'admin_axSortAutopromo', options: ['expose' => true])]
public function axSortAutopromo(Request $request, AutoPromoRepository $autoPromoRepository, FlashNotificationAjax $flash)
{
if (isset($_POST['update'])) {
$error = 0;
foreach ($_POST['positions'] as $position) {
$index = $position[0];
$newPosition = $position[1];
$autoPromo = $autoPromoRepository->find($index);
$autoPromo->setAutopromoOrder($newPosition);
try {
$this->entityManager->persist($autoPromo);
$this->entityManager->flush();
} catch (FileException $e) {
$error++;
}
}
if ($error == 0) {
return new JsonResponse([
'status' => true,
'flashMessage' => $flash->notification('success', "L'ordre des autopromos a été mis à jour"),
]);
} else {
return new JsonResponse([
'status' => true,
'flashMessage' => $flash->notification('danger', "L'ordre des autopromos n'pas été mis à jour"),
]);
}
}
return new JsonResponse([
'status' => false,
]);
}
}