<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Properties;
use App\Form\PropertiesType;
use App\Repository\ImageRepository;
use App\Repository\PropertiesRepository;
use DateTimeImmutable;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
/**
* @Route("/properties")
*/
class PropertiesController extends AbstractController
{
/**
* @Route("/", name="app_properties_index", methods={"GET"})
*/
public function index(PropertiesRepository $propertiesRepository): Response
{
if ($this->getUser()->getRoles()[0] == "ROLE_ADMIN") {
$properties = $propertiesRepository->findAll();
} else {
$properties = $propertiesRepository->findBy(['user' => $this->getUser()]);
}
return $this->render('properties/index.html.twig', [
'properties' => $properties,
]);
}
/**
* @IsGranted("ROLE_ADMIN")
* @Route("/new", name="app_properties_new", methods={"GET", "POST"})
*/
public function new(Request $request, PropertiesRepository $propertiesRepository): Response
{
$property = new Properties();
$form = $this->createForm(PropertiesType::class, $property);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$images = $property->getImages();
foreach ($images as $key => $image) {
$image->setProperties($property);
$images->set($key, $image);
}
$property->setCreatedAt(new DateTimeImmutable());
$property->setisAvailable(true);
$propertiesRepository->add($property, true);
$this->addFlash('success', 'Ce bien a correctement été ajouté!');
return $this->redirectToRoute('app_properties_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('properties/new.html.twig', [
'property' => $property,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="app_properties_show", methods={"GET"})
*/
public function show(Properties $property): Response
{
return $this->render('properties/show.html.twig', [
'property' => $property,
]);
}
/**
* @IsGranted("ROLE_ADMIN")
* @Route("/{id}/edit", name="app_properties_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Properties $property, PropertiesRepository $propertiesRepository, ImageRepository $imageRepository): Response
{
$form = $this->createForm(PropertiesType::class, $property);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$images = $property->getImages();
foreach ($images as $key => $image) {
if ($image->getImageFile() == null) {
$property->removeImage($image);
$imageRepository->remove($image, true);
} else {
$image->setProperties($property);
$images->set($key, $image);
}
}
$propertiesRepository->add($property, true);
$this->addFlash('success', 'les informations de la propriété ont bien été modifié!');
return $this->redirectToRoute('app_properties_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('properties/edit.html.twig', [
'property' => $property,
'form' => $form,
]);
}
/**
* @IsGranted("ROLE_ADMIN")
* @Route("/properties/{id}", name="app_properties_delete", methods={"POST"})
*/
public function delete(Request $request, Properties $property, EntityManagerInterface $entityManager): Response
{
$token = $request->request->get('_token');
if (!$this->isCsrfTokenValid('delete' . $property->getId(), $token)) {
throw $this->createAccessDeniedException('Token CSRF invalide.');
}
$entityManager->getConnection()->beginTransaction();
try {
$id = $property->getId();
// Suppression directe avec une requête SQL native
$sql = "DELETE FROM properties WHERE id = :id";
$stmt = $entityManager->getConnection()->prepare($sql);
$stmt->execute(['id' => $id]);
$entityManager->getConnection()->commit();
$this->addFlash('success', 'La propriété a été supprimée avec succès!');
} catch (\Exception $e) {
$entityManager->getConnection()->rollBack();
// Afficher le message complet de l'erreur
$this->addFlash('error', 'Une erreur est survenue lors de la suppression de la propriété : ' . $e->getMessage());
// Optionnel : Logguer l'erreur $e
}
return $this->redirectToRoute('app_properties_index', [], Response::HTTP_SEE_OTHER);
}
}