<?php
namespace App\Controller;
use App\Entity\Images;
use App\Entity\Vehicules;
use App\Entity\VehiculeVariable;
use App\Repository\CategoriesRepository;
use App\Repository\MarquesRepository;
use App\Repository\ModelesRepository;
use App\Repository\UserRepository;
use App\Repository\VariableConstantsRepository;
use App\Repository\VariablesRepository;
use App\Repository\VehiculesRepository;
use App\Repository\VillesRepository;
use App\services\ImageOptimizer;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Notifier\Notification\Notification;
use Symfony\Component\Notifier\NotifierInterface;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/vehicule', name: 'app_vehicule')]
class VehiculeController extends AbstractController
{
private CategoriesRepository $categoriesRepository;
private VariablesRepository $variablesRepository ;
private VariableConstantsRepository $variableConstantsRepository;
private MarquesRepository $marquesRepository;
private ModelesRepository $modelesRepository ;
private VehiculesRepository $vehiculesRepository;
private VillesRepository $villesRepository;
private UserRepository $userRepository;
private ImageOptimizer $imageOptimizer ;
/**
* @param CategoriesRepository $categoriesRepository
* @param VariablesRepository $variablesRepository
* @param VariableConstantsRepository $variableConstantsRepository
* @param MarquesRepository $marquesRepository
* @param ModelesRepository $modelesRepository
* @param VehiculesRepository $vehiculesRepository
* @param VillesRepository $villesRepository
* @param UserRepository $userRepository
*/
public function __construct(CategoriesRepository $categoriesRepository, VariablesRepository $variablesRepository,
VariableConstantsRepository $variableConstantsRepository, MarquesRepository $marquesRepository,
ModelesRepository $modelesRepository, VehiculesRepository $vehiculesRepository,
VillesRepository $villesRepository, UserRepository $userRepository , ImageOptimizer $imageOptimizer)
{
$this->categoriesRepository = $categoriesRepository;
$this->variablesRepository = $variablesRepository;
$this->variableConstantsRepository = $variableConstantsRepository;
$this->marquesRepository = $marquesRepository;
$this->modelesRepository = $modelesRepository;
$this->vehiculesRepository = $vehiculesRepository;
$this->villesRepository = $villesRepository;
$this->userRepository = $userRepository;
$this->imageOptimizer = $imageOptimizer;
}
#[Route('/', name: 'index')]
public function index(Request $request, PaginatorInterface $paginator): Response
{
$donnees=[];
$lastVh =$this->vehiculesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC",], 6);
//$marques = $this->marquesRepository->findAll();
// $modeles = $this->modelesRepository->findAll();
if($request->isMethod("POST")){
$categs = $_POST["categs"] ?? null;
$marques = $_POST["marques"] ?? null;
$modeles = $_POST["modeles"] ?? null;
$res= $this->vehiculesRepository->searchVehicule($request,$categs, $modeles, $marques);
foreach ($res as $key=>$value){
$donnees[] = $this->convertToVehicule($value);
}
}else{
$donnees = $this->vehiculesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC",], 1000);
}
$vehicules= null;
if(count($donnees) > 0){
$vehicules = $paginator->paginate(
$donnees,
$request->query->getInt('page', 1),15);
}
return $this->render('vehicule/index.html.twig', [
'vehicules' => $vehicules,
// 'modeles'=>$modeles,
// 'marques'=>$marques,
'lastVh'=>$lastVh
]);
}
#[Route('add', name: 'add')]
public function add(Request $request, EntityManagerInterface $entityManager): Response
{
if(!$this->getUser()){
return $this->redirectToRoute('app_login');
}
$categorie = $this->categoriesRepository->findOneBy(["code"=>UtilsFunctions::VEHICULE_CODE]);
$variables = $this->variablesRepository->findBy(["Categorie"=>$categorie]);
$marques = $this->marquesRepository->findAll();
$modeles = $this->modelesRepository->findAll();
$villes = $this->villesRepository->findAll() ;
if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-vehicule', $request->request->get('token')))) {
$vehicule = $this->buildVehicule($request);
if(isset($_POST["variableValue"]))
$variableValue = $_POST["variableValue"];
$photofile = $request->files->get("photoImage");
$newFilename = "";
$destination = "";
if (!empty($photofile)) {
$destination = $this->getParameter('kernel.project_dir') . '/public/uploads/vehicules/' . trim($vehicule->getCode());
$newFilename = uniqid() . "-" . $vehicule->getCode() . '.' . $photofile->guessExtension();
$vehicule->setPhotoImage($newFilename);
}
try {
$photofile->move($destination, $newFilename);
$this->imageOptimizer->resize($destination.'/'.$newFilename);
} catch (FileException $ex) {
}
$entityManager->persist($vehicule);
$entityManager->flush();
//save Variable value
if(isset($_POST["variableValue"]))
foreach($variableValue as $key => $value)
{
$v =$this->variablesRepository->findOneBy(["code"=>$key]);
$vehiculeVariable = new VehiculeVariable();
$vehiculeVariable->setVehicule($vehicule);
$vehiculeVariable->setVariable($v);
$vehiculeVariable->setValeur($value);
$entityManager->persist($vehiculeVariable);
$entityManager->flush();
}
return $this->redirectToRoute('app_vehiculedetail',['id'=>$vehicule->getId()]);
}
return $this->render('vehicule/add.html.twig', [
'variables'=> $variables,
'villes'=>$villes,
'modeles'=>$modeles,
'marques'=>$marques
]);
}
#[Route('detail/{id}', name: 'detail')]
public function detail( Vehicules $vehicule):Response
{
return $this->render('vehicule/detail.html.twig', [
'vehicule' => $vehicule
]);
}
#[Route('detailslug/{slug}', name: 'detailslug')]
public function detailSlug(Vehicules $vehicule):Response
{
$vehicules = $this->vehiculesRepository->findBy(["typeoperation"=>$vehicule->getTypeoperation()], ["pubDate"=>"DESC"], 12);
return $this->render('vehicule/public-detail.html.twig', [
'vehicule' => $vehicule,
'vehicules'=> $vehicules
]);
}
public function buildVehicule($request):Vehicules
{
$vehicule = new Vehicules();
$vehicule->setLibelle($request->request->get('libelle'));
$vehicule->setDescription($request->request->get('description'));
$prix = !empty($request->request->get('prix'))?$request->request->get('prix'):0 ;
$vehicule->setPrix($prix);
$isnoprice= !empty($request->request->get('isNoprice'));
$vehicule->setIsNoprice($isnoprice);
$vehicule->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
$vehicule->setVille($this->villesRepository->find($request->request->get('ville')));
$vehicule->setVendeur($this->getUser());
$vehicule->setSlug(substr($vehicule->getLibelle(),0,6)."-".UtilsFunctions::generateRandomString(5));
$vehicule->setCode(UtilsFunctions::generateRandomString(8));
$vehicule->setTypeoperation($request->request->get("typeoperation"));
$vehicule->setCreatedAt(new \DateTimeImmutable());
$marque = $this->marquesRepository->find($request->request->get('marques'));
$vehicule->setMarque($marque);
$modeles = $this->modelesRepository->find($request->request->get('modele'));
$vehicule->setModele($modeles);
$vehicule->setEtat($request->request->get('etat'));
return $vehicule;
}
#[Route('publier/{id}', name: 'publication')]
public function publier(VehiculesRepository $vehiculesRepository, Vehicules $vehicule, EntityManagerInterface $entityManager,NotifierInterface $notifier): Response
{
if ($vehicule->getId() > 0) {
$vehicule->setStatus(UtilsFunctions::PUBLICATION_STATUS);
$vehicule->setPubDate(new \DateTimeImmutable());
$entityManager->persist($vehicule);
$entityManager->flush();
$notifier->send(new Notification("Operation réussie publication effectuée",['browser']));
} else {
return $this->render('errorrs/notfound.html.twig', [
'vehicule' => $vehicule
]);
}
return $this->render('vehicule/detail.html.twig', [
'vehicule' => $vehicule
]);
}
#[Route('suspendre/{id}', name: 'suspension')]
public function suspendreVehicule(VehiculesRepository $vehiculesRepository, Vehicules $vehicule, EntityManagerInterface $entityManager, NotifierInterface $notifier): Response{
if($vehicule->getId() > 0){
$vehicule->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
$vehicule->setPubDate(new \DateTimeImmutable());
$entityManager->persist($vehicule);
$entityManager->flush();
$notifier->send(new Notification("Operation réussie le vehicule est suspendu",['browser']));
}else{
return $this->render('errorrs/notfound.html.twig', [
'vehicule' => $vehicule
]);
}
return $this->render('vehicule/detail.html.twig', [
'vehicule' => $vehicule
]);
}
#[Route('delete/{id}', name: 'supprimer')]
public function supprimerVehicule(VehiculesRepository $vehiculesRepository, Vehicules $vehicule, EntityManagerInterface $entityManager): Response{
if($vehicule->getId() > 0){
$vehicule->setStatus(UtilsFunctions::DELETE_STATUS);
$entityManager->persist($vehicule);
$entityManager->flush();
}else{
return $this->render('errorrs/notfound.html.twig', [
'vehicule' => $vehicule
]);
}
return $this->redirectToRoute('app_vendor_home_index');
}
#[Route('search/{slugCategorie}', name: 'categorie')]
public function searchByCategorie(Request $request, PaginatorInterface $paginator, $slugCategorie): Response
{
$lastVh =$this->vehiculesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC",], 6);
$categories = $this->categoriesRepository->findOneBy(["slug"=>trim($slugCategorie)]);
$donnees=[];
$searchCategorie = $categories ;
$marques = $this->marquesRepository->findAll();
$modeles = $this->modelesRepository->findAll();
if($request->isMethod("POST")){
$categs = $_POST["categs"] ?? null;
$marques = $_POST["marques"] ?? null;
$modeles = $_POST["modeles"] ?? null;
$res= $this->vehiculesRepository->searchVehicule($request,$categs, $modeles, $marques);
foreach ($res as $key=>$value){
$donnees[] = $this->convertToVehicule($value);
}
}else if (UtilsFunctions::VEHICULE_A_LOUER_CODE == $categories->getCode()){
$donnees = $this->vehiculesRepository->findBy(["typeoperation"=>"LOCATION"], ["pubDate"=>"DESC",], 1000);
}else if(UtilsFunctions::VEHICULE_A_VENDRE_CODE == $categories->getCode()){
$donnees = $this->vehiculesRepository->findBy(["typeoperation"=>"VENTE"], ["pubDate"=>"DESC",], 1000);
}else{
$donnees = $this->vehiculesRepository->findBy([], ["pubDate"=>"DESC",], 1000);
}
$vehicules= null;
if(count($donnees) > 0){
$vehicules = $paginator->paginate(
$donnees,
$request->query->getInt('page', 1),15);
}
return $this->render('vehicule/index.html.twig', [
'vehicules' => $vehicules,
'modeles'=>$modeles,
'marques'=>$marques,
'searchCategorie'=>$searchCategorie,
'lastVh'=>$lastVh,
]);
}
#[Route('image/{id}', name: 'addimage')]
public function addImage(Request $request, EntityManagerInterface $entityManager,VehiculesRepository $vehiculesRepository, Vehicules $vehicule){
if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-image', $request->request->get('token')))) {
$vehiculeId = $request->request->get('id');
$vhForImage = $vehiculesRepository->find($vehiculeId);
$image1 = $request->files->get("image1");
$image2 = $request->files->get("image2");
$image3 = $request->files->get("image3");
$image4 = $request->files->get("image4");
$this->deleteOldImage($vhForImage);
$this->saveImage($vhForImage,$image1, $entityManager);
$this->saveImage($vhForImage,$image2,$entityManager);
$this->saveImage($vhForImage,$image3, $entityManager);
$this->saveImage($vhForImage,$image4, $entityManager);
return $this->redirectToRoute('app_vehiculedetail',['id'=>$vehiculeId]);
}
return $this->render('vehicule/add-image.html.twig', [
'vehicule' => $vehicule
]);
}
public function saveImage(Vehicules $vehicule, $imageFile, EntityManagerInterface $entityManager){
$imageTosave = new Images();
if (!empty($imageFile)) {
$destination = $this->getParameter('kernel.project_dir') . '/public/uploads/vehicules/' . trim($vehicule->getCode());
$code = UtilsFunctions::generateRandomString(4);
$newFilename = uniqid() . "-" .$code . '.' . $imageFile->guessExtension();
$imageTosave->setCode($code);
$imageTosave->setNom($newFilename);
$imageTosave->setVehicule($vehicule);
try {
$imageFile->move($destination, $newFilename);
$this->imageOptimizer->resize($destination.'/'.$newFilename);
$entityManager->persist($imageTosave);
$entityManager->flush();
} catch (FileException $ex) {
}
}
}
public function deleteOldImage(Vehicules $vehicule){
$images = $vehicule->getImagesVh() ;
if(!empty($images)){
for($i=0; $i < $images->count() ; $i++){
$image = $images->get($i);
$this->imagesRepository->remove($image);
}
}
}
private function convertToVehicule($value):Vehicules{
$vehicule = new Vehicules();
$vehicule->setId($value["id"]);
$vehicule->setVendeur($this->userRepository->find($value["vendeur_id"]));
$vehicule->setLibelle($value['libelle']);
$vehicule->setDescription($value["description"]);
$vehicule->setSlug($value["slug"]);
$vehicule->setCode($value["code"]);
$vehicule->setTypeoperation($value["typeoperation"]);
$vehicule->setStatus($value["status"]);
$vehicule->setPrix($value["prix"]);
$vehicule->setIsNoprice($value["is_noprice"]);
$vehicule->setPhotoImage($value["photo_image"]);
$vehicule->setMarque($this->marquesRepository->find($value["marque_id"]));
$vehicule->setVille($this->villesRepository->find($value["ville_id"]));
if(!empty($value["modele_id"]))
$vehicule->setModele($this->modelesRepository->find($value["modele_id"]));
$vehicule->setCreatedAt( new \DateTimeImmutable($value["created_at"]));
$vehicule->setPubDate( new \DateTimeImmutable($value["pub_date"]));
// $vehicule->setCategorie($this->categoriesRepository->find($value["categorie_id"]));
return $vehicule ;
}
}