src/Controller/ImmeubleController.php line 233

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Articles;
  4. use App\Entity\Categories;
  5. use App\Entity\Images;
  6. use App\Entity\Immeubles;
  7. use App\Entity\ImmeubleVariable;
  8. use App\Repository\ArticlesRepository;
  9. use App\Repository\CategoriesRepository;
  10. use App\Repository\ImagesRepository;
  11. use App\Repository\ImmeublesRepository;
  12. use App\Repository\QuartiersRepository;
  13. use App\Repository\UserRepository;
  14. use App\Repository\VariableConstantsRepository;
  15. use App\Repository\VariablesRepository;
  16. use App\Repository\VillesRepository;
  17. use App\services\ImageOptimizer;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use JetBrains\PhpStorm\Immutable;
  20. use Knp\Component\Pager\PaginatorInterface;
  21. use phpDocumentor\Reflection\Types\Boolean;
  22. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  23. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Notifier\Notification\Notification;
  27. use Symfony\Component\Notifier\NotifierInterface;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. #[Route('/immeuble'name'app_immeuble')]
  30. class ImmeubleController extends AbstractController
  31. {
  32.     private CategoriesRepository $categoriesRepository;
  33.     private VariablesRepository $variablesRepository ;
  34.     private VariableConstantsRepository $variableConstantsRepository;
  35.     private VillesRepository $villesRepository ;
  36.     private QuartiersRepository $quartiersRepository ;
  37.     private ImmeublesRepository $immeublesRepository ;
  38.     private UserRepository $userRepository ;
  39.     private ImagesRepository $imagesRepository;
  40.     private ImageOptimizer $imageOptimizer ;
  41.     /**
  42.      * @param CategoriesRepository $categoriesRepository
  43.      * @param VariablesRepository $variablesRepository
  44.      * @param VariableConstantsRepository $variableConstantsRepository
  45.      * @param VillesRepository $villesRepository
  46.      * @param QuartiersRepository $quartiersRepository
  47.      * @param ImmeublesRepository $immeublesRepository
  48.      * @param UserRepository $userRepository
  49.      * @param ImagesRepository $imagesRepository
  50.      */
  51.     public function __construct(CategoriesRepository $categoriesRepositoryVariablesRepository $variablesRepository,
  52.                                 VariableConstantsRepository $variableConstantsRepositoryVillesRepository $villesRepository,
  53.                                 QuartiersRepository $quartiersRepositoryImmeublesRepository $immeublesRepository,
  54.                                 UserRepository $userRepositoryImagesRepository $imagesRepositoryImageOptimizer $imageOptimizer)
  55.     {
  56.         $this->categoriesRepository $categoriesRepository;
  57.         $this->variablesRepository $variablesRepository;
  58.         $this->variableConstantsRepository $variableConstantsRepository;
  59.         $this->villesRepository $villesRepository;
  60.         $this->quartiersRepository $quartiersRepository;
  61.         $this->immeublesRepository $immeublesRepository;
  62.         $this->userRepository $userRepository;
  63.         $this->ImagesRepository $imagesRepository;
  64.         $this->imageOptimizer $imageOptimizer;
  65.     }
  66.     #[Route('/'name'index')]
  67.     public function index(Request $requestPaginatorInterface $paginator): Response
  68.     {
  69.         $search false ;
  70.         $donnees=[];
  71.         $lastImmeubles $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC"],6);
  72.         if($request->isMethod("POST")){
  73.             $search true ;
  74.             $categs $_POST["categs"] ?? null;
  75.             $villes $_POST["villes"] ?? null;
  76.             $quartiers $_POST["quartiers"] ?? null;
  77.             $res=  $this->immeublesRepository->searchImmeuble($request,$villes$quartiers$categs);
  78.             foreach ($res as $key=>$value){
  79.                 $donnees[] = $this->convertToImmeuble($value);
  80.             }
  81.         }else{
  82.             $donnees $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC",], 1000);
  83.         }
  84.         $immeubles=null;
  85.         if(count($donnees) > 0){
  86.             $immeubles $paginator->paginate(
  87.                 $donnees,
  88.                 $request->query->getInt('page'1),15);
  89.         }
  90.         return $this->render('immeuble/index.html.twig', [
  91.             'immeubles' => $immeubles,
  92.             'lastImmeubles'=> $lastImmeubles,
  93.             'search'=> $search 
  94.         ]);
  95.     }
  96.     #[Route('search/{slugCategorie}'name'categorie')]
  97.     public function searchByCategorie(Request $requestPaginatorInterface $paginator$slugCategorie): Response
  98.     {
  99.         $search true ;
  100.         $categories $this->categoriesRepository->findOneBy(["slug"=>trim($slugCategorie)]);
  101.         $donnees=[];
  102.         $searchCategorie $categories ;
  103.         $lastImmeubles $this->immeublesRepository->findBy(["status"=> UtilsFunctions::PUBLICATION_STATUS], ["pubDate"=>"DESC"],6);
  104.         if($request->isMethod("POST")){
  105.             $categs $_POST["categs"] ?? null;
  106.             $villes $_POST["villes"] ?? null;
  107.             $quartiers $_POST["quartiers"] ?? null;
  108.             $res=  $this->immeublesRepository->searchImmeuble($request,$villes$quartiers$categs);
  109.             foreach ($res as $key=>$value){
  110.                 $donnees[] = $this->convertToImmeuble($value);
  111.             }
  112.         }else if(UtilsFunctions::IMMO_CODE == $categories->getCode()) {
  113.             $donnees $this->immeublesRepository->findBy([], ["pubDate"=>"DESC",], 1000);
  114.         }else{
  115.             $donnees $this->immeublesRepository->findBy(["categorie"=>$categories], ["pubDate"=>"DESC",], 1000);
  116.         }
  117.         $immeubles=null;
  118.         if(count($donnees) > 0){
  119.             $immeubles $paginator->paginate(
  120.                 $donnees,
  121.                 $request->query->getInt('page'1),15);
  122.         }
  123.         return $this->render('immeuble/index.html.twig', [
  124.             'immeubles' => $immeubles,
  125.             'searchCategorie'=>$searchCategorie,
  126.             'lastImmeubles'=> $lastImmeubles,
  127.             'search'=> $search 
  128.           
  129.         ]);
  130.     }
  131.     #[Route('add'name'add')]
  132.     public function add(Request $request,  EntityManagerInterface $entityManager): Response
  133.     {
  134.         if(!$this->getUser()){
  135.             return $this->redirectToRoute('app_login');
  136.         }
  137.         $categorie $this->categoriesRepository->findOneBy(["code"=>UtilsFunctions::IMMO_CODE]);
  138.         $sousCateg$this->categoriesRepository->findBy(["parent"=>$categorie],["libelle"=>'ASC']);
  139.         $variables $this->variablesRepository->findBy(["Categorie"=>$categorie]);
  140.         $villes =  $this->villesRepository->findAll() ;
  141.         $immeuble = new Immeubles();
  142.         if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-immeuble'$request->request->get('token')))) {
  143.             if(isset($_POST["variableValue"]))
  144.                 $variableValue $_POST["variableValue"];
  145.             $immeuble $this->buildImmeuble($request);
  146.             $photofile $request->files->get("photo");
  147.             $newFilename "";
  148.             $destination "";
  149.             if (!empty($photofile)) {
  150.                 $destination $this->getParameter('kernel.project_dir') . '/public/uploads/immeubles/' trim($immeuble->getCode());
  151.                 $newFilename uniqid() . "-" $immeuble->getCode() . '.' $photofile->guessExtension();
  152.                 $immeuble->setPhoto($newFilename);
  153.             }
  154.             if ($this->immeubleCheck($immeuble)) {
  155.                 try {
  156.                     $photofile->move($destination$newFilename);
  157.                     $this->imageOptimizer->resize($destination.'/'.$newFilename);
  158.                 } catch (FileException $ex) {
  159.                 }
  160.                 $entityManager->persist($immeuble);
  161.                 $entityManager->flush();
  162.                 //save Variable value
  163.                 if(isset($_POST["variableValue"]))
  164.                 foreach($variableValue as $key => $value)
  165.                 {
  166.                     $v =$this->variablesRepository->findOneBy(["code"=>$key]);
  167.                    $immeubleVariable = new ImmeubleVariable();
  168.                    $immeubleVariable->setImmeuble($immeuble);
  169.                    $immeubleVariable->setVariable($v);
  170.                    $immeubleVariable->setValeur($value);
  171.                    $entityManager->persist($immeubleVariable);
  172.                    $entityManager->flush();
  173.                 }
  174.                 return $this->redirectToRoute('app_immeubledetail',['id'=>$immeuble->getId()]);
  175.             }
  176.         }
  177.             return $this->render('immeuble/add.html.twig', [
  178.             'sousCategories' => $sousCateg,
  179.             'variables'=> $variables,
  180.                 'villes'=>$villes
  181.         ]);
  182.     }
  183.     #[Route('detail/{id}'name'detail')]
  184.     public function detail(ImagesRepository $imagesRepositoryImmeubles $immeuble):Response
  185.     {
  186.         return $this->render('immeuble/detail.html.twig', [
  187.             'immeuble' => $immeuble
  188.         ]);
  189.     }
  190.     #[Route('quartier'name'quartier')]
  191.     public function listquatierByville(Request $request,VillesRepository $villesRepositoryQuartiersRepository $quartiersRepository)
  192.     {
  193.             $ouptut= array();
  194.             $idville$request->request->get('id');
  195.             $ville$villesRepository->findBy(["id"=>$idville]);
  196.             $quartiers $quartiersRepository->findBy(["ville"=>$ville]);
  197.            
  198.             foreach($quartiers as $q ){
  199.                 
  200.                array_push($ouptut,array($q->getId(),$q->getNom()));
  201.             }
  202.            
  203.             return  new \Symfony\Component\HttpFoundation\JsonResponse($ouptut);
  204.       
  205.        
  206.     }
  207.     #[Route('detailslug/{slug}'name'detailslug')]
  208.     public function detailSlug(ImagesRepository $imagesRepositoryImmeubles $immeuble):Response
  209.     {
  210.         $immeubles $this->immeublesRepository->findBy(["categorie"=>$immeuble->getCategorie()], ["pubDate"=>"DESC"], 12);
  211.         return $this->render('immeuble/public-detail.html.twig', [
  212.             'immeuble' => $immeuble,
  213.             'immeubles'=>$immeubles
  214.         ]);
  215.     }
  216.     #[Route('publier/{id}'name'publication')]
  217.     public function publierImmeuble(ImmeublesRepository $immeublesRepositoryImmeubles $immeublesEntityManagerInterface $entityManager,NotifierInterface $notifier): Response
  218.     {
  219.         if ($immeubles->getId() > 0) {
  220.             $immeubles->setStatus(UtilsFunctions::PUBLICATION_STATUS);
  221.             $immeubles->setPubDate(new \DateTimeImmutable());
  222.             $entityManager->persist($immeubles);
  223.             $entityManager->flush();
  224.             $notifier->send(new Notification("Operation réussie  publication effectuée",['browser']));
  225.         } else {
  226.             return $this->render('errorrs/notfound.html.twig', [
  227.                 'immeuble' => $immeubles
  228.             ]);
  229.         }
  230.         return $this->render('immeuble/detail.html.twig', [
  231.             'immeuble' => $immeubles
  232.         ]);
  233.     }
  234.     #[Route('suspendre/{id}'name'suspension')]
  235.     public function suspendreImmeuble(ImmeublesRepository $immeublesRepository,  Immeubles $immeublesEntityManagerInterface $entityManagerNotifierInterface $notifier): Response{
  236.         if($immeubles->getId() > 0){
  237.             $immeubles->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
  238.             $immeubles->setPubDate(new \DateTimeImmutable());
  239.             $entityManager->persist($immeubles);
  240.             $entityManager->flush();
  241.             $notifier->send(new Notification("Operation réussie  l'immeuble est suspendu",['browser']));
  242.         }else{
  243.             return $this->render('errorrs/notfound.html.twig', [
  244.                 'immeubles' => $immeubles
  245.             ]);
  246.         }
  247.         return $this->render('vehicule/detail.html.twig', [
  248.             'immeubles' => $immeubles
  249.         ]);
  250.     }
  251.     #[Route('delete/{id}'name'supprimer')]
  252.     public function supprimerImmeuble(ImmeublesRepository $immeublesRepositoryImmeubles $immeublesEntityManagerInterface $entityManager): Response{
  253.         if($immeubles->getId() > 0){
  254.             $immeubles->setStatus(UtilsFunctions::DELETE_STATUS);
  255.             $entityManager->persist($immeubles);
  256.             $entityManager->flush();
  257.         }else{
  258.             return $this->render('errorrs/notfound.html.twig', [
  259.                 'immeubles' => $immeubles
  260.             ]);
  261.         }
  262.         return $this->redirectToRoute('app_vendor_home_index');
  263.     }
  264.     #[Route('image/{id}'name'addimage')]
  265.     public function addImage(Request $request,  EntityManagerInterface $entityManager,ImmeublesRepository $immeublesRepositoryImmeubles $immeubles){
  266.         if($request->isMethod("POST") && ($this->isCsrfTokenValid('add-immeuble'$request->request->get('token')))) {
  267.             $immeublesId $request->request->get('id');
  268.             $immeubleForImage $immeublesRepository->find($immeublesId);
  269.             $image1 $request->files->get("image1");
  270.             $image2 $request->files->get("image2");
  271.             $image3 $request->files->get("image3");
  272.             $image4 $request->files->get("image4");
  273.             $this->deleteOldImage($immeubleForImage);
  274.             $this->saveImage($immeubleForImage,$image1$entityManager);
  275.             $this->saveImage($immeubleForImage,$image2,$entityManager);
  276.             $this->saveImage($immeubleForImage,$image3$entityManager);
  277.             $this->saveImage($immeubleForImage,$image4$entityManager);
  278.             return $this->redirectToRoute('app_immeubledetail',['id'=>$immeublesId]);
  279.         }
  280.         return $this->render('immeuble/add-image.html.twig', [
  281.             'immeuble' => $immeubles
  282.         ]);
  283.     }
  284.     public function saveImage(Immeubles $immeuble$imageFileEntityManagerInterface $entityManager){
  285.         $imageTosave = new Images();
  286.         if (!empty($imageFile)) {
  287.             $destination $this->getParameter('kernel.project_dir') . '/public/uploads/immeubles/' trim($immeuble->getCode());
  288.             $code UtilsFunctions::generateRandomString(4);
  289.             $newFilename uniqid() . "-" .$code '.' $imageFile->guessExtension();
  290.             $imageTosave->setCode($code);
  291.             $imageTosave->setNom($newFilename);
  292.             $imageTosave->setImmeuble($immeuble);
  293.             try {
  294.                 $imageFile->move($destination$newFilename);
  295.                 $this->imageOptimizer->resize($destination.'/'.$newFilename);
  296.                 $entityManager->persist($imageTosave);
  297.                 $entityManager->flush();
  298.             } catch (FileException $ex) {
  299.                 throw new \Exception('Erreur enregistrement du fichier image');   
  300.             }
  301.         }
  302.     }
  303.     public function deleteOldImage(Immeubles $immeuble){
  304.         $images $immeuble->getImages() ;
  305.         if(!$images->isEmpty()){
  306.             for($i=0$i $images->count() ; $i++){
  307.                 $image $images->get($i);
  308.                 $this->imagesRepository->remove($image);
  309.             }
  310.         }
  311.     }
  312.     public  function buildImmeuble($request):Immeubles
  313.     {
  314.         $immeuble = new Immeubles();
  315.         $immeuble->setLibelle($request->request->get('libelle'));
  316.         $immeuble->setDescription($request->request->get('description'));
  317.         $prix = !empty($request->request->get('prix'))?$request->request->get('prix'):;
  318.         $immeuble->setPrix($prix);
  319.         $isnoprice= !empty($request->request->get('isNoprice'));
  320.         $immeuble->setIsNoprice($isnoprice);
  321.         $immeuble->setStatus(UtilsFunctions::NO_PUBLICATION_STATUS);
  322.         $immeuble->setCategorie($this->categoriesRepository->find($request->request->get('categorie')));
  323.         $immeuble->setVille($this->villesRepository->find($request->request->get('ville')));
  324.         $quartierId $request->request->get("quartier");
  325.         if(!empty($quartierId)){
  326.             $quartier $this->quartiersRepository->find($quartierId);
  327.             if($quartier != null)
  328.                 $immeuble->setQuartier($quartier);
  329.         }
  330.         $immeuble->setVendeur($this->getUser());
  331.         $immeuble->setSlug(substr($immeuble->getLibelle(),0,6)."-".UtilsFunctions::generateRandomString(5));
  332.         $immeuble->setCode(UtilsFunctions::generateRandomString(8));
  333.         $immeuble->setTypeoperation($request->request->get("typeoperation"));
  334.         $immeuble->setCreatedAt(new \DateTimeImmutable());
  335.         return  $immeuble;
  336.     }
  337.     private function immeubleCheck($immeuble):bool
  338.     {
  339.         return true;
  340.     }
  341.     private function  convertToImmeuble($value):Immeubles{
  342.         $immeuble = new Immeubles();
  343.         $immeuble->setId($value["id"]);
  344.         $immeuble->setVendeur($this->userRepository->find($value["vendeur_id"]));
  345.         $immeuble->setLibelle($value['libelle']);
  346.         $immeuble->setDescription($value["description"]);
  347.         $immeuble->setSlug($value["slug"]);
  348.         $immeuble->setCode($value["code"]);
  349.         $immeuble->setTypeoperation($value["typeoperation"]);
  350.         $immeuble->setStatus($value["status"]);
  351.         $immeuble->setPrix($value["prix"]);
  352.         $immeuble->setIsNoprice($value["is_noprice"]);
  353.         $immeuble->setPhoto($value["photo"]);
  354.         $immeuble->setVille($this->villesRepository->find($value["ville_id"]));
  355.         if(!empty($value["quartier_id"]))
  356.             $immeuble->setQuartier($this->quartiersRepository->find($value["quartier_id"]));
  357.         $immeuble->setCreatedAt( new \DateTimeImmutable($value["created_at"]));
  358.         $immeuble->setPubDate( new \DateTimeImmutable($value["pub_date"]));
  359.         $immeuble->setCategorie($this->categoriesRepository->find($value["categorie_id"]));
  360.         return $immeuble ;
  361.     }
  362. }