<?php
namespace App\Controller\App\Model;
use App\Entity\Armoire;
use App\Entity\Categorie;
use App\Entity\Classeur;
use App\Entity\Etagere;
use App\Entity\Localisation;
use App\Entity\Model;
use App\Entity\Page;
use App\Entity\SousCategorie;
use App\Entity\Tag;
use App\Form\SearchFilterType;
use App\Form\SearchFormType;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Form\ModelFormType;
#[Route('/model', name: 'model_')]
class ModelController extends AbstractController
{
private $ModelRepository;
#[Route('/collection', name: 'collection', methods: ['GET', 'POST'])]
//Méthode pour afficher le détail du modèle
public function collection(EntityManagerInterface $entityManager, Request $request, PaginatorInterface $paginator): Response
{
$form = $this->createForm(SearchFilterType::class, null, [
'method' =>'GET',
]);
$form2 = $this->createForm(SearchFormType::class, null, [
'method' => 'GET',
]);
$form->handleRequest($request);
$form2->handleRequest($request);
//Pour que la grille ou liste reste d'une page à l'autre
$mode = $request->query->get('mode', 'grid');
$allModels = $entityManager->getRepository(Model::class)->findAll();
//Count
$count = count($allModels);
$pageCount = 0;
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$allModels = $entityManager->getRepository(Model::class)->getByFilter($data);
$pageCount = count($allModels);
}
elseif ($form2->isSubmitted() && $form2->isValid()){
$data = $form2->getData();
$allModels = $entityManager->getRepository(Model::class)->getByFilter($data);
$pageCount = count($allModels);
}
elseif(!$form2->isSubmitted() && !$form->isSubmitted()) {
// Si le formulaire n'est pas soumis, récupérer tous les modèles
$allModels = $entityManager->getRepository(Model::class)->findAll();
$pageCount = count($allModels);
}
// Tri par ordre alphabétique avec le Titre
usort($allModels, function($a, $b) {
return strcmp($a->getTitre(), $b->getTitre());
});
//Pagination
$models = $paginator->paginate(
$allModels, /* query NOT result */
$request->query->getInt('p', 1), /*page number*/
8 /*limit per page*/
);
// $models = $this->ModelRepository->findBy($limit, $offset);
return $this->render('model/collection.html.twig', [
'form' => $form->createView(),
'form2' => $form2->createView(),
'models' => $models,
'count' => $count,
'pageCount'=> $pageCount,
'mode' => $mode,
]);
}
#[Route('/echange', name: 'echange', methods: ['GET'])]
//Méthode pour afficher le détail du modèle
public function echange(EntityManagerInterface $entityManager): Response
{
//Count
$models = $entityManager->getRepository(Model::class)->getDoublons();
$count = count($models);
// Tri par ordre alphabétique avec le Titre
usort($models, function($a, $b) {
return strcmp($a->getTitre(), $b->getTitre());
});
return $this->render('model/echange.html.twig', [
'models' => $models,
'count' => $count,
]);
}
#[Route('/create', name: 'create', methods: ['GET', 'POST'])]
public function create(Request $request, EntityManagerInterface $entityManager): Response
{
//Condition sur l'accessibilité
if (!$this->isGranted('ROLE_ADMIN')) {
return $this->redirectToRoute('app_model_collection');
}
// Création d'un nouvel objet Model
$model = new Model();
// Création du formulaire basé sur ModelFormType
$form = $this->createForm(ModelFormType::class, $model);
$form->handleRequest($request);
// Vérification de la validité du formulaire et enregistrement des données
if ($form->isSubmitted() && $form->isValid()) {
/*Récupération des catégories sélectionnées dans le formulaire
recherche en bdd et associe la catégorie à la collection lié*/
$categorieIds = $form->get('categories')->getData();
foreach ($categorieIds as $categorieId) {
$categorieObject = $entityManager->getRepository(Categorie::class)->find($categorieId);
$model->addCategorie($categorieObject);
}
$scategorieIds = $form->get('sousCategories')->getData();
foreach ($scategorieIds as $scategorieId) {
$scategorieObject = $entityManager->getRepository(SousCategorie::class)->find($scategorieId);
$model->addSousCategorie($scategorieObject);
}
/*Les tags sont récupérés, recherchés, et ajouter en
bdd si pas trouvés*/
$tagString = $form->get('tags')->getData();
$tagsList = explode(',', $tagString);
foreach ($tagsList as $tag) {
$tag=trim($tag);
$tagObject = $entityManager->getRepository(Tag::class)->findOneBy(['nom' => $tag]);
//Faire la vérif du même tag saisi 2 fois
if (!$tagObject) {
$tagObject = new Tag();
$tagObject->setNom($tag);
$entityManager->persist($tagObject);
}
$model->addTag($tagObject);
}
/*Récupération de la localisation, creation d'un objet,
association au modèle et enregistrement*/
$localisationVille = $form->get('localisation_ville')->getData();
$localisationDepartement = $form->get('localisation_departement')->getData();
$localisationRegion = $form->get('localisation_region')->getData();
$localisationPays = $form->get('localisation_pays')->getData();
// Création et association de la localisation au modèle
$localisationForm = new Localisation();
$localisationForm->setVille($localisationVille);
$localisationForm->setDepartement($localisationDepartement);
$localisationForm->setRegion($localisationRegion);
$localisationForm->setPays($localisationPays);
$model->setLocalisation($localisationForm);
$entityManager->persist($localisationForm);
$entityManager->persist($model);
$entityManager->flush();
// Récupération des noms
$armoire = $form->get('armoire_nom')->getData();
$classeur = $form->get('classeur_nom')->getData();
$numeroPage = $form->get('page_numero')->getData();
//if exists page with id_classeur = $classeur
//: $page = page que t'as trouvé
$page = $entityManager->getRepository(Page::class)->findOneBy(['classeur' => $classeur, 'numero' => $numeroPage]);
if (!$page){
$page = new Page();
$page->setNumero($numeroPage);
$classeur->addPage($page);
}
$model->addPage($page);
// Enregistrement des emplacements dans la base de données
$entityManager->persist($armoire);
$entityManager->persist($classeur);
$entityManager->persist($page);
$entityManager->persist($model);
$entityManager->flush();
//On redirige l'utilisateur vers le détail du modèle
return $this->redirectToRoute('app_model_show', ['id' => $model->getId()]);
}
//On passe le formulaire à la vue
return $this->render('model/create.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/{id}', name: 'show', methods: ['GET'])]
public function show(Model $model, Request $request): Response
{
$referer = $request->headers->get('referer');
return $this->render('model/show.html.twig', [
'model' => $model,
'back_page' => $referer,
]);
}
#[Route('/edit/{id}', name: 'edit', methods: ['GET', 'POST'])]
public function edit(Model $model, Request $request, EntityManagerInterface $entityManager): Response
{
if (!$this->isGranted('ROLE_ADMIN')) {
return $this->redirectToRoute('app_model_collection');
}
// Création du formulaire basé sur ModelFormType et pré-remplissage avec les valeurs existantes du modèle
$form = $this->createForm(ModelFormType::class, $model);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Vérification de la soumission du formulaire et de sa validité
// Récupérer le numéro de page depuis le formulaire
$pageNumero = $form->get('page_numero')->getData();
$classeur = $form->get('classeur_nom')->getData();
$etagere = $form->get('etagere_nom')->getData();
$armoire = $form->get('armoire_nom')->getData();
// On récupère l'entité liée au modèle
$page = $model->getPages()->first();
//On vérifie si il y a une page associée
if (!$page) {
// Si aucune page n'est associée, créer une nouvelle page
$page = new Page();
//On l'ajoute au model
$model->addPage($page);
}
// Mets à jour le numéro de page et les éléments associés liés
$page->setNumero($pageNumero);
$page->setClasseur($classeur);
$classeur->setEtagere($etagere);
$etagere->setArmoire($armoire);
/*Récupération de la localisation, creation d'un objet,
association au modèle et enregistrement*/
$localisationVille = $form->get('localisation_ville')->getData();
$localisationDepartement = $form->get('localisation_departement')->getData();
$localisationRegion = $form->get('localisation_region')->getData();
$localisationPays = $form->get('localisation_pays')->getData();
// Création et association de la localisation au modèle
$localisationForm =$model->getLocalisation();
if(is_null($model->getLocalisation())) {
$localisationForm = new Localisation();
}
$localisationForm->setVille($localisationVille);
$localisationForm->setDepartement($localisationDepartement);
$localisationForm->setRegion($localisationRegion);
$localisationForm->setPays($localisationPays);
$model->setLocalisation($localisationForm);
$entityManager->persist($localisationForm);
$tagsText = $form->get('tags')->getData();
$tagNames = explode(',', $tagsText);
// Supprimez tous les tags existants du modèle
foreach ($model->getTags() as $tag) {
$model->removeTag($tag);
}
// Ajoutez les nouveaux tags individuels
foreach ($tagNames as $tagName) {
$tagName=trim($tagName);
// Recherchez si le tag existe déjà, sinon créez-le
$tag = $entityManager->getRepository(Tag::class)->findOneBy(['nom' => $tagName]);
if (!$tag) {
$tag = new Tag();
$tag->setNom($tagName);
$entityManager->persist($tag);
}
$model->addTag($tag);
}
$entityManager->persist($model);
$entityManager->flush();
// Redirection vers la page de détail du modèle modifié
return $this->redirectToRoute('app_model_show', ['id' => $model->getId()]);
}
// Affichage du formulaire de modification
return $this->render('model/create.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/delete/{id}', name: 'delete')]
public function delete(Model $model, Request $request, EntityManagerInterface $entityManager): Response
{
if (!$this->isGranted('ROLE_ADMIN')) {
return $this->redirectToRoute('app_model_collection');
}
//Partie ajoutée
$id = $request->attributes->get('id');
$model = $entityManager->getRepository(Model::class)->find($id);
if (!$model) {
throw $this->createNotFoundException('Model not found');
}
//
foreach ($model->getPhotos() as $photo){
$path = $photo->getChemin();
if (file_exists($_SERVER['DOCUMENT_ROOT'].$path)) {
unlink($_SERVER['DOCUMENT_ROOT'].$path);
$model->removePhoto($photo);
$entityManager->remove($photo);
}
}
// $entityManager->flush();
$entityManager->remove($model);
$entityManager->flush();
return $this->redirectToRoute('app_model_collection');
}
}