<?php
namespace App\Controller;
use App\Entity\Articles;
use App\Entity\Images;
use App\Repository\ArticlesRepository;
use App\Repository\CategoriesRepository;
use App\Repository\ImagesRepository;
use App\Repository\VillesRepository;
use App\services\ImageOptimizer;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Notifier\Notification\Notification;
use Symfony\Component\Notifier\Notifier;
use Symfony\Component\Notifier\NotifierInterface;
#[Route('/article', name: 'app_article')]
class ArticleController extends AbstractController
{
private CategoriesRepository $categoriesRepository ;
private ImagesRepository $imagesRepository ;
private VillesRepository $villesRepository;
private ImageOptimizer $imageOptimizer ;
/**
* @param CategoriesRepository $categoriesRepository
* @param ImagesRepository $imagesRepository
* @param VillesRepository $villesRepository
*/
public function __construct(CategoriesRepository $categoriesRepository, ImagesRepository $imagesRepository, VillesRepository $villesRepository, ImageOptimizer $imageOptimizer)
{
$this->categoriesRepository = $categoriesRepository;
$this->imagesRepository = $imagesRepository;
$this->villesRepository= $villesRepository ;
$this->imageOptimizer = $imageOptimizer ;
}
#[Route('/', name: 'index')]
public function index(): Response
{
return $this->render('article/index.html.twig', [
'controller_name' => 'ArticleController',
]);
}
#[Route('add', name: 'add')]
public function add(Request $request, EntityManagerInterface $entityManager): Response
{
if(!$this->getUser()){
return $this->redirectToRoute('app_login');
}
$article = new Articles();
$categories = $this->categoriesRepository->findAll();
$villes = $this->villesRepository->findAll() ;
if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-article', $request->request->get('token')))) {
$article = $this->buildArticle($request);
$articleFile = $request->files->get("articleFile");
$newFilename = "";
$destination = "";
if (!empty($articleFile)) {
$destination = $this->getParameter('kernel.project_dir') . '/public/uploads/articles/' . trim($article->getCode());
$newFilename = uniqid() . "-" . $article->getCode() . '.' . $articleFile->guessExtension();
$article->setImageprincipale($newFilename);
}
if ($this->articleCheck($article)) {
try {
$articleFile->move($destination, $newFilename);
$this->imageOptimizer->resize($destination.'/'.$newFilename);
} catch (FileException $ex) {
}
$entityManager->persist($article);
$entityManager->flush();
return $this->redirectToRoute('app_articledetail',['id'=>$article->getId()]);
}
}
return $this->render('article/add.html.twig', [
'categories' => $categories,
'article' => $article,
'villes'=>$villes
]);
}
#[Route('detail/{id}', name: 'detail')]
public function detailArticle(ArticlesRepository $articlesRepository, Articles $article): Response{
return $this->render('article/detail.html.twig', [
'article' => $article
]);
}
#[Route('publier/{id}', name: 'publication')]
public function publierArticle(ArticlesRepository $articlesRepository, Articles $article, EntityManagerInterface $entityManager,NotifierInterface $notifier): Response{
if($article->getId() > 0){
$article->setStatus(UtilsFunctions::PUBLICATION_STATUS);
$article->setPubDate(new \DateTimeImmutable());
$entityManager->persist($article);
$entityManager->flush();
$notifier->send(new Notification("Operation réussie l'article est bien publié",['browser']));
}else{
return $this->render('errorrs/notfound.html.twig', [
'article' => $article
]);
}
return $this->render('article/detail.html.twig', [
'article' => $article
]);
}
#[Route('suspendre/{id}', name: 'suspension')]
public function suspendreArticle(ArticlesRepository $articlesRepository, Articles $article, EntityManagerInterface $entityManager, NotifierInterface $notifier): Response{
if($article->getId() > 0){
$article->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
$article->setPubDate(new \DateTimeImmutable());
$entityManager->persist($article);
$entityManager->flush();
$notifier->send(new Notification("Operation réussie l'article est suspendu",['browser']));
}else{
return $this->render('errorrs/notfound.html.twig', [
'article' => $article
]);
}
return $this->render('article/detail.html.twig', [
'article' => $article
]);
}
#[Route('delete/{id}', name: 'supprimer')]
public function supprimerArticle(ArticlesRepository $articlesRepository, Articles $article, EntityManagerInterface $entityManager): Response{
if($article->getId() > 0){
$article->setStatus(UtilsFunctions::DELETE_STATUS);
$entityManager->persist($article);
$entityManager->flush();
}else{
return $this->render('errorrs/notfound.html.twig', [
'article' => $article
]);
}
return $this->redirectToRoute('app_vendor_home_index');
}
#[Route('image/{id}', name: 'addimage')]
public function addImage(Request $request, EntityManagerInterface $entityManager,ArticlesRepository $articlesRepository, Articles $article,){
$image = new Images();
if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-image', $request->request->get('token')))) {
$articleId = $request->request->get('id');
$articleForImage = $articlesRepository->find($articleId);
$image1 = $request->files->get("image1");
$image2 = $request->files->get("image2");
$image3 = $request->files->get("image3");
$image4 = $request->files->get("image4");
$this->deleteOldImage($articleForImage);
$this->saveImage($articleForImage,$image1, $entityManager);
$this->saveImage($articleForImage,$image2,$entityManager);
$this->saveImage($articleForImage,$image3, $entityManager);
$this->saveImage($articleForImage,$image4, $entityManager);
return $this->redirectToRoute('app_articledetail',['id'=>$articleId]);
}
return $this->render('article/add-image.html.twig', [
'article' => $article
]);
}
public function deleteOldImage(Articles $article){
$images = $article->getImages() ;
if(!$images->isEmpty()){
for($i=0; $i < $images->count() ; $i++){
$image = $images->get($i);
$this->imagesRepository->remove($image);
}
}
}
public function saveImage(Articles $article, $imageFile, EntityManagerInterface $entityManager){
$imageTosave = new Images();
if (!empty($imageFile)) {
$destination = $this->getParameter('kernel.project_dir') . '/public/uploads/articles/' . trim($article->getCode());
$code = UtilsFunctions::generateRandomString(4);
$newFilename = uniqid() . "-" .$code . '.' . $imageFile->guessExtension();
$imageTosave->setCode($code);
$imageTosave->setNom($newFilename);
$imageTosave->setArticle($article);
try {
$imageFile->move($destination, $newFilename);
$this->imageOptimizer->resize($destination.'/'.$newFilename);
$entityManager->persist($imageTosave);
$entityManager->flush();
} catch (FileException $ex) {
}
}
}
public function buildArticle($request):Articles
{
$article = new Articles();
$article->setLibelle($request->request->get('libelle'));
$article->setDescription($request->request->get('description'));
$article->setEtat($request->request->get('etat'));
$prix = !empty($request->request->get('prix'))?$request->request->get('prix'):0 ;
$article->setPrix($prix);
$article->setVille($request->request->get('ville'));
$ispromo = !empty($request->request->get('ispromo'));
$issolde = !empty($request->request->get('issolde'));
$isnoprice= !empty($request->request->get('isNoprice'));
$article->setIsNoprice($isnoprice);
$article->setIsSolde($issolde);
$article->setIspromo($ispromo);
$prixpromo = !empty($request->request->get('prixpromo'))?$request->request->get('prixpromo'):0 ;
$article->setPrixpromo($prixpromo);
$soldepourcentage =!empty($request->request->get('soldePourcentage'))?$request->request->get('soldePourcentage'):1 ;
$article->setSoldePourcentage($soldepourcentage);
$article->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
$article->setCategorie($this->categoriesRepository->find($request->request->get('categorie')));
$article->setVille($request->request->get('ville'));
$article->setCreatedBy($this->getUser());
$article->setSlug(substr($article->getLibelle(),0,6)."-".UtilsFunctions::generateRandomString(5));
$article->setCode(UtilsFunctions::generateRandomString(8));
$article->setCreatedAt(new \DateTimeImmutable());
return $article ;
}
private function articleCheck(Articles $article):bool{
return (!empty($article->getLibelle()) || !empty($article->getImageprincipale())|| !empty($article->getCategorie()) || !empty("ville")) ;
}
}