src/Controller/App/Model/ModelController.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\Controller\App\Model;
  3. use App\Entity\Armoire;
  4. use App\Entity\Categorie;
  5. use App\Entity\Classeur;
  6. use App\Entity\Etagere;
  7. use App\Entity\Localisation;
  8. use App\Entity\Model;
  9. use App\Entity\Page;
  10. use App\Entity\SousCategorie;
  11. use App\Entity\Tag;
  12. use App\Form\SearchFilterType;
  13. use App\Form\SearchFormType;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Knp\Component\Pager\PaginatorInterface;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use App\Form\ModelFormType;
  21. #[Route('/model'name'model_')]
  22. class ModelController extends AbstractController
  23. {
  24.     private $ModelRepository;
  25.     #[Route('/collection'name'collection'methods: ['GET''POST'])]
  26.     //Méthode pour afficher le détail du modèle
  27.     public function collection(EntityManagerInterface $entityManagerRequest $requestPaginatorInterface $paginator): Response
  28.     {
  29.         $form $this->createForm(SearchFilterType::class, ['ia' => true], [
  30.             'method' =>'GET',
  31.         ]);
  32.         $form2 $this->createForm(SearchFormType::class, null, [
  33.             'method' => 'GET',
  34.         ]);
  35.         $form->handleRequest($request);
  36.         $form2->handleRequest($request);
  37.         //Pour que la grille ou liste reste d'une page à l'autre
  38.         $mode $request->query->get('mode''grid');
  39.         $allModels $entityManager->getRepository(Model::class)->findAll();
  40.         //Count
  41.         $count count($allModels);
  42.         $pageCount 0;
  43.         if ($form->isSubmitted() && $form->isValid()) {
  44.             $data $form->getData();
  45.             $allModels $entityManager->getRepository(Model::class)->getByFilter($data);
  46.             $pageCount count($allModels);
  47.         }
  48.         elseif ($form2->isSubmitted() && $form2->isValid()){
  49.             $data $form2->getData();
  50.             $allModels $entityManager->getRepository(Model::class)->getByFilter($data);
  51.             $pageCount count($allModels);
  52.         }
  53.         elseif(!$form2->isSubmitted() && !$form->isSubmitted()) {
  54.             // Si le formulaire n'est pas soumis, récupérer tous les modèles
  55.             $allModels $entityManager->getRepository(Model::class)->findAll();
  56.             $pageCount count($allModels);
  57.         }
  58.         // Tri par ordre alphabétique avec le Titre
  59.         usort($allModels, function($a$b) {
  60.             return strcmp($a->getTitre(), $b->getTitre());
  61.         });
  62.         //Pagination
  63.         $models $paginator->paginate(
  64.             $allModels/* query NOT result */
  65.             $request->query->getInt('p'1), /*page number*/
  66.             60 /*limit per page*/
  67.         );
  68. //        $models = $this->ModelRepository->findBy($limit, $offset);
  69.         return $this->render('model/collection.html.twig', [
  70.             'form' => $form->createView(),
  71.             'form2' => $form2->createView(),
  72.             'models' => $models,
  73.             'count' => $count,
  74.             'pageCount'=> $pageCount,
  75.             'mode' => $mode,
  76.         ]);
  77.     }
  78.     #[Route('/echange'name'echange'methods: ['GET'])]
  79.     //Méthode pour afficher le détail du modèle
  80.     public function echange(EntityManagerInterface $entityManager): Response
  81.     {
  82.         //Count
  83.         $models $entityManager->getRepository(Model::class)->getDoublons();
  84.         $count count($models);
  85.         // Tri par ordre alphabétique avec le Titre
  86.         usort($models, function($a$b) {
  87.             return strcmp($a->getTitre(), $b->getTitre());
  88.         });
  89.         return $this->render('model/echange.html.twig', [
  90.             'models' => $models,
  91.             'count' => $count,
  92.         ]);
  93.     }
  94.     #[Route('/create'name'create'methods: ['GET''POST'])]
  95.     public function create(Request $requestEntityManagerInterface $entityManager): Response
  96.     {
  97.         //Condition sur l'accessibilité
  98.         if (!$this->isGranted('ROLE_ADMIN')) {
  99.             return $this->redirectToRoute('app_model_collection');
  100.         }
  101.         // Création d'un nouvel objet Model
  102.         $model = new Model();
  103.         // Création du formulaire basé sur ModelFormType
  104.         $form $this->createForm(ModelFormType::class, $model);
  105.         $form->handleRequest($request);
  106.         // Vérification de la validité du formulaire et enregistrement des données
  107.         if ($form->isSubmitted() && $form->isValid()) {
  108.             /*Récupération des catégories sélectionnées dans le formulaire
  109.              recherche en bdd et associe la catégorie à la collection lié*/
  110.             $categorieIds $form->get('categories')->getData();
  111.             foreach ($categorieIds as $categorieId) {
  112.                 $categorieObject $entityManager->getRepository(Categorie::class)->find($categorieId);
  113.                 $model->addCategorie($categorieObject);
  114.             }
  115.             $scategorieIds $form->get('sousCategories')->getData();
  116.             foreach ($scategorieIds as $scategorieId) {
  117.                 $scategorieObject $entityManager->getRepository(SousCategorie::class)->find($scategorieId);
  118.                 $model->addSousCategorie($scategorieObject);
  119.             }
  120.             /*Les tags sont récupérés, recherchés, et ajouter en
  121.             bdd si pas trouvés*/
  122.             $tagString $form->get('tags')->getData();
  123.             $tagsList explode(','$tagString);
  124.             foreach ($tagsList as $tag) {
  125.                 $tag=trim($tag);
  126.                 $tagObject $entityManager->getRepository(Tag::class)->findOneBy(['nom' => $tag]);
  127.                 //Faire la vérif du même tag saisi 2 fois
  128.                 if (!$tagObject) {
  129.                     $tagObject = new Tag();
  130.                     $tagObject->setNom($tag);
  131.                     $entityManager->persist($tagObject);
  132.                 }
  133.                 $model->addTag($tagObject);
  134.             }
  135.             /*Récupération de la localisation, creation d'un objet,
  136.             association au modèle et enregistrement*/
  137.             $localisationVille $form->get('localisation_ville')->getData();
  138.             $localisationDepartement $form->get('localisation_departement')->getData();
  139.             $localisationRegion $form->get('localisation_region')->getData();
  140.             $localisationPays $form->get('localisation_pays')->getData();
  141.             // Création et association de la localisation au modèle
  142.             $localisationForm = new Localisation();
  143.             $localisationForm->setVille($localisationVille);
  144.             $localisationForm->setDepartement($localisationDepartement);
  145.             $localisationForm->setRegion($localisationRegion);
  146.             $localisationForm->setPays($localisationPays);
  147.             $model->setLocalisation($localisationForm);
  148.             $entityManager->persist($localisationForm);
  149.             $entityManager->persist($model);
  150.             $entityManager->flush();
  151.             // Récupération des noms
  152.             $armoire $form->get('armoire_nom')->getData();
  153.             $classeur $form->get('classeur_nom')->getData();
  154.             $numeroPage $form->get('page_numero')->getData();
  155.             //if exists page with id_classeur = $classeur
  156.             //: $page = page que t'as trouvé
  157.             $page $entityManager->getRepository(Page::class)->findOneBy(['classeur' => $classeur'numero' => $numeroPage]);
  158.             if (!$page){
  159.                 $page = new Page();
  160.                 $page->setNumero($numeroPage);
  161.                 $classeur->addPage($page);
  162.             }
  163.             $model->addPage($page);
  164.             // Enregistrement des emplacements dans la base de données
  165.             $entityManager->persist($armoire);
  166.             $entityManager->persist($classeur);
  167.             $entityManager->persist($page);
  168.             $entityManager->persist($model);
  169.             $entityManager->flush();
  170.             //On redirige l'utilisateur vers le détail du modèle
  171.             return $this->redirectToRoute('app_model_show', ['id' => $model->getId()]);
  172.         }
  173.         if($request->isXmlHttpRequest()){
  174.             return $this->json([
  175.                 'error' => false,
  176.                 'route' => false,
  177.                 'view' => $this->renderView('model/edit.html.twig', [
  178.                     'form' => $form->createView(),
  179.                 ]),
  180.                 'data' => false,
  181.             ]);
  182.         }
  183.         //On passe le formulaire à la vue
  184.         return $this->render('model/create.html.twig', [
  185.             'form' => $form->createView(),
  186.         ]);
  187.     }
  188.     #[Route('/{id}'name'show'methods: ['GET'])]
  189.     public function show(Model $modelRequest $request): Response
  190.     {
  191.         $referer $request->headers->get('referer');
  192.         return $this->render('model/show.html.twig', [
  193.             'model' => $model,
  194.             'back_page' => $referer,
  195.         ]);
  196.     }
  197.     #[Route('/confirmer-ia/{id}'name'confirmer_ia'methods: ['GET'])]
  198.     public function confirmer_ia(Model $modelRequest $requestEntityManagerInterface $entityManager): Response
  199.     {
  200.         $model->setIaValide(1);
  201.         $entityManager->persist($model);
  202.         $entityManager->flush();
  203.         return $this->redirectToRoute('app_model_show', ['id' => $model->getId()]);
  204.     }
  205.     #[Route('/edit/{id}'name'edit'methods: ['GET''POST'])]
  206.     public function edit(Model $modelRequest $requestEntityManagerInterface $entityManager): Response
  207.     {
  208.         if (!$this->isGranted('ROLE_ADMIN')) {
  209.             return $this->redirectToRoute('app_model_collection');
  210.         }
  211.         // Création du formulaire basé sur ModelFormType et pré-remplissage avec les valeurs existantes du modèle
  212.         $form $this->createForm(ModelFormType::class, $model);
  213.         $form->handleRequest($request);
  214.         if ($form->isSubmitted() && $form->isValid()) {
  215.             // Vérification de la soumission du formulaire et de sa validité
  216.             // Récupérer le numéro de page depuis le formulaire
  217.             $pageNumero $form->get('page_numero')->getData();
  218.             $classeur $form->get('classeur_nom')->getData();
  219.             $etagere $form->get('etagere_nom')->getData();
  220.             $armoire $form->get('armoire_nom')->getData();
  221.             // On récupère l'entité liée au modèle
  222.             $page $model->getPage();
  223.             //On vérifie si il y a une page associée
  224.             if (!$page) {
  225.                 // Si aucune page n'est associée, créer une nouvelle page
  226.                 $page = new Page();
  227.             }
  228.             // Mets à jour le numéro de page et les éléments associés liés
  229.             $page->setNumero($pageNumero);
  230.             $page->setClasseur($classeur);
  231.             $classeur->setEtagere($etagere);
  232.             $etagere->setArmoire($armoire);
  233.             $entityManager->persist($page);
  234.             $model->setPage($page);
  235.             /*Récupération de la localisation, creation d'un objet,
  236.             association au modèle et enregistrement*/
  237.             $localisationVille $form->get('localisation_ville')->getData();
  238.             $localisationDepartement $form->get('localisation_departement')->getData();
  239.             $localisationRegion $form->get('localisation_region')->getData();
  240.             $localisationPays $form->get('localisation_pays')->getData();
  241.             // Création et association de la localisation au modèle
  242.             $localisationForm =$model->getLocalisation();
  243.             if(is_null($model->getLocalisation())) {
  244.                 $localisationForm = new Localisation();
  245.             }
  246.             $localisationForm->setVille($localisationVille);
  247.             $localisationForm->setDepartement($localisationDepartement);
  248.             $localisationForm->setRegion($localisationRegion);
  249.             $localisationForm->setPays($localisationPays);
  250.             $model->setLocalisation($localisationForm);
  251.             $entityManager->persist($localisationForm);
  252.             $tagsText $form->get('tags')->getData();
  253.             $tagNames explode(','$tagsText);
  254.             // Supprimez tous les tags existants du modèle
  255.             foreach ($model->getTags() as $tag) {
  256.                 $model->removeTag($tag);
  257.             }
  258.             // Ajoutez les nouveaux tags individuels
  259.             foreach ($tagNames as $tagName) {
  260.                 $tagName=trim($tagName);
  261.                 // Recherchez si le tag existe déjà, sinon créez-le
  262.                 $tag $entityManager->getRepository(Tag::class)->findOneBy(['nom' => $tagName]);
  263.                 if (!$tag) {
  264.                     $tag = new Tag();
  265.                     $tag->setNom($tagName);
  266.                     $entityManager->persist($tag);
  267.                 }
  268.                 $model->addTag($tag);
  269.             }
  270.             $entityManager->persist($model);
  271.             $entityManager->flush();
  272.             // Redirection vers la page de détail du modèle modifié
  273.             return $this->redirectToRoute('app_model_show', ['id' => $model->getId()]);
  274.         }
  275.         // Affichage du formulaire de modification
  276.         return $this->render('model/create.html.twig', [
  277.             'form' => $form->createView(),
  278.         ]);
  279.     }
  280.     #[Route('/delete/{id}'name'delete')]
  281.     public function delete(Model $modelRequest $requestEntityManagerInterface $entityManager): Response
  282.     {
  283.         if (!$this->isGranted('ROLE_ADMIN')) {
  284.             return $this->redirectToRoute('app_model_collection');
  285.         }
  286.         //Partie ajoutée
  287.         $id $request->attributes->get('id');
  288.         $model $entityManager->getRepository(Model::class)->find($id);
  289.         if (!$model) {
  290.             throw $this->createNotFoundException('Model not found');
  291.         }
  292.         //
  293.         foreach ($model->getPhotos() as $photo){
  294.             $path $photo->getChemin();
  295.             if (file_exists($_SERVER['DOCUMENT_ROOT'].$path)) {
  296.                 unlink($_SERVER['DOCUMENT_ROOT'].$path);
  297.                 $model->removePhoto($photo);
  298.                 $entityManager->remove($photo);
  299.             }
  300.         }
  301. //        $entityManager->flush();
  302.         $entityManager->remove($model);
  303.         $entityManager->flush();
  304.         return $this->redirectToRoute('app_model_collection');
  305.     }
  306. }