src/Controller/LancerUnPostController.php line 154

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\String\Slugger\SluggerInterface;
  8. use App\Form\FormLancerUnPostType;
  9. use App\Form\CategoryType;
  10. use App\Entity\Categorie;
  11. use App\Entity\Post;
  12. use App\Entity\Article;
  13. use App\Entity\User;
  14. use Symfony\Component\Security\Core\Security;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use App\Repository\PostRepository;
  17. use App\Repository\UserRepository;
  18. use App\Repository\CategorieRepository;
  19. class LancerUnPostController extends AbstractController
  20. {
  21.     private $security;
  22.     public function __construct(Security $security)
  23.     {
  24.         $this->security $security;
  25.     }
  26.     #[Route('/lancerunpost'name'app_lancer_un_post')]
  27.     public function index(): Response
  28.     {        
  29.         return $this->render('lancer_un_post/index.html.twig', [
  30.             'controller_name' => 'LancerUnPostController',
  31.         ]);
  32.     }
  33.     #[Route('/creationPost'name'app_creer_un_post')]
  34.     public function new(Request $requestSluggerInterface $slugger ,CategorieRepository $categorieRepository): Response
  35.     {
  36.         //instancie objet Post à la variable post
  37.         $post = new Post();
  38.         //Récup gestionnaire d'entité Doctrine
  39.         $entityManager $this->getDoctrine()->getManager();
  40.         $form $this->createForm(FormLancerUnPostType::class, $post);
  41.         //traite requete pour les données du form
  42.         $form->handleRequest($request);
  43.         $categories $categorieRepository->findAll();
  44.         if ($form->isSubmitted() && $form->isValid()) {
  45.             // Récup le fichier d'image dans le formulaire
  46.             $imageFile $form->get('image')->getData();
  47.             if ($imageFile) {
  48.                 //Récup le nom du fichier sans l'extension
  49.                 $originalFilename pathinfo($imageFile->getClientOriginalName(), PATHINFO_FILENAME);
  50.                 //slug permet de convertir en URL en une chaine poue la BDD
  51.                 $safeFilename $slugger->slug($originalFilename);
  52.                  // Crée un nom de fichier unique en ajoutant un identifiant et l'extension du fichier
  53.                 $newFilename $safeFilename.'-'.uniqid().'.'.$imageFile->guessExtension();
  54.                 try {
  55.                     $imageFile->move(
  56.                         $this->getParameter('images_directory'),
  57.                         $newFilename
  58.                     );
  59.                 } catch (FileException $e) {
  60.                 }
  61.                 $post->setImage($newFilename);
  62.             }
  63.              // Récupérer l'utilisateur actuel
  64.              $user $this->getUser();
  65.              $post->setUser($user);  
  66.             
  67.             $entityManager $this->getDoctrine()->getManager();
  68.             $entityManager->persist($post);
  69.             //Execute la requete
  70.             $entityManager->flush();
  71.             return $this->redirectToRoute('app_mes_posts');
  72.         }
  73.         return $this->render('lancer_un_post/newpost.html.twig', [
  74.             'form' => $form->createView(), 
  75.             'categories' => $categories,
  76.         ]);
  77.     }
  78.     
  79. //LISTES DES POSTS  
  80.     #[Route('/afficherLesPosts'name'afficher_les_posts')]
  81.     public function list(CategorieRepository $categorieRepository): Response
  82.     {
  83.         $entityManager $this->getDoctrine()->getManager();
  84.         $posts $entityManager->getRepository(Post::class)->findAll();
  85.         $categories $categorieRepository->findAll();
  86.         
  87.         // Tableau avec détails de chaque post
  88.         $postDetails = [];
  89.         foreach ($posts as $post) {
  90.             $article $post->getArticle(); 
  91.             $categorie $article->getCategorie();
  92.             
  93.             // Utilisez la relation User -> Post
  94.             $user $post->getUser();
  95.     
  96.            
  97.             
  98.             $postDetails[] = [
  99.                 'id' => $post->getId(),
  100.                 'title' => $article->getTitle(),
  101.                 'username' => $user->getUsername(), // Utilisez le nom d'utilisateur actuel ici
  102.                 'creationDate' => $article->getCreationDate(),
  103.                 'name' => $categorie->getName(),
  104.                 'content' => $post->getContent(),
  105.                 'image' => $post->getImage(), // de $post pour obtenir l'image
  106.             ];
  107.         }
  108.     
  109.         return $this->render('lancer_un_post/list.html.twig', [
  110.             'postDetails' => $postDetails,
  111.             'categories' => $categories,
  112.         ]);
  113.     }
  114.     
  115.     
  116. #[Route('/affichePost/{id}'name'app_affiche_un_post')]
  117. public function showpost($idCategorieRepository $categorieRepositoryUserRepository $userRepository): Response
  118.     {
  119.         // si l'id = 0, alors c'est un post non trouvé
  120.         if ($id == 0) {
  121.             //redirection
  122.             return $this->render('lancer_un_post/post_non_trouve.html.twig', [
  123.                 'categories' => $categorieRepository->findAll()
  124.             ]);
  125.         }
  126.          // Récupère Doctrine pour interagir avec BDD
  127.         $entityManager $this->getDoctrine()->getManager();
  128.         // Récupère le post correspondant à l'id donné depuis la BDD
  129.         $post $entityManager->getRepository(Post::class)->find($id);
  130.         $categories $categorieRepository->findAll();
  131.         // Vérifier si le post existe
  132.         if (!$post) {
  133.             return $this->render('lancer_un_post/post_non_trouve.html.twig', [
  134.                 'categories' => $categories
  135.             ]);
  136.         }
  137.         // Récup l'article et la catégorie associés au post
  138.         $article $post->getArticle();
  139.           // Récup la catégorie associée à l'article
  140.         $categorie $article->getCategorie();
  141.         // Séparer le contenu principal des réponses en sautant une ligne
  142.         $contentLines explode("\n"$post->getContent());
  143.         // Récupère le contenu principal
  144.         $mainContent array_shift($contentLines);
  145.         $responses = [];
  146.         foreach ($contentLines as $line) {
  147.             // Vérifier si la ligne contient un séparateur (le nom d'utilisateur)
  148.             if (strpos($line':') !== false) {
  149.                 // Diviser la ligne en 2 avec explode pour obtenir le nom d'utilisateur et le contenu de la réponse
  150.                 list($username$content) = explode(':'$line2);
  151.     
  152.                 // Rechercher l'utilisateur associé à la réponse
  153.                 $user $userRepository->findOneBy(['username' => trim($username)]);
  154.     
  155.                 // Vérifier si l'utilisateur existe et n'est pas supprimé
  156.                 if ($user) {
  157.                     $responses[] = ['username' => trim($username), 'content' => trim($content)];
  158.                 }
  159.             }
  160.         }
  161.         // Créer les détails du post
  162.         $postDetails = [
  163.             'id' => $post->getId(),
  164.             'title' => $article->getTitle(),
  165.             'username' => $post->getUser()->getUsername(),
  166.             'creationDate' => $article->getCreationDate(),
  167.             'name' => $categorie->getName(),
  168.             'content' => $mainContent,
  169.             'image' => $post->getImage(),
  170.             'responses' => $responses,
  171.         ];
  172.         return $this->render('lancer_un_post/showpost.html.twig', [
  173.             'postDetails' => $postDetails,
  174.             'categories' => $categories,
  175.         ]);
  176.     }
  177.     
  178.  
  179. #[Route('/repondreAuPost/{id}'name'app_repondre_au_post')]
  180. public function repondreAuPost(Request $requestint $idEntityManagerInterface $entityManager): Response
  181. {
  182.     $post $entityManager->getRepository(Post::class)->find($id);
  183.     $user $this->getUser();
  184.     if (!$user) {
  185.         throw $this->createNotFoundException('Utilisateur non trouvé');
  186.     }
  187.     if (!$post) {
  188.         throw $this->createNotFoundException('Post non trouvé');
  189.     }
  190.     if ($request->isMethod('POST')) {
  191.         $responseContent $request->request->get('response');
  192.         if (!empty($responseContent)) {
  193.             // Créer la nouvelle réponse avec le nouveau nom d'utilisateur
  194.             $newResponse $user->getUsername() . ': ' $responseContent;
  195.             // MAJ le contenu du post avec la nouvelle réponse
  196.             $updatedContent $post->getContent() . "\n" $newResponse;
  197.             $post->setContent($updatedContent);
  198.             // MAJ toutes les réponses perso dans le contenu du post
  199.             $contentLines explode("\n"$post->getContent());
  200.             $mainContent array_shift($contentLines);
  201.             $responses = [];
  202.             foreach ($contentLines as $line) {
  203.                 if (strpos($line':') !== false) {
  204.                     list($username$content) = explode(':'$line2);
  205.                     // MAJ le nom d'utilisateur dans chaque réponse existante
  206.                     if (trim($username) === $user->getUsername()) {
  207.                         $line $user->getUsername() . ':' trim($content);
  208.                     }
  209.                     $responses[] = $line;
  210.                 }
  211.             }
  212.             // Reconstruire le contenu MAJ en sautant une ligne avec les nouvelles réponses
  213.             $updatedContent $mainContent "\n" implode("\n"$responses);
  214.             // MAJ le contenu du post avec le nouveau contenu 
  215.             $post->setContent($updatedContent);
  216.             $entityManager->flush();
  217.             return $this->redirectToRoute('app_affiche_un_post', ['id' => $id]);
  218.         }
  219.     }
  220.     return $this->redirectToRoute('app_affiche_un_post', ['id' => $id]);
  221. }
  222.     
  223. #[Route('/mes-posts'name'app_mes_posts')]
  224.     public function mesPosts(EntityManagerInterface $entityManager,CategorieRepository $categorieRepository ,PostRepository $postRepository,Security $security): Response
  225.     {
  226.         $user $security->getUser();
  227.         $posts $postRepository->findBy(['user' => $user]);
  228.         $categories $categorieRepository->findAll();
  229.         // Vérifier s'il y a des posts
  230.     if (empty($posts)) {
  231.         // Redirection vers une page spécifique si vide
  232.         return $this->redirectToRoute('app_mes_posts_vide');
  233.     }
  234.         return $this->render('lancer_un_post/mesposts.html.twig', [
  235.             'posts' => $posts,
  236.             'categories' => $categories,
  237.         ]);
  238.     }
  239. // Affichage pour POST vide 
  240. #[Route('/mes-posts-vide'name'app_mes_posts_vide')]
  241. public function mesPostsVide(CategorieRepository $categorieRepository): Response
  242. {
  243.     // Récupérer toutes les catégories pour affichage
  244.     $categories $categorieRepository->findAll();
  245.     return $this->render('lancer_un_post/mesposts_vide.html.twig', [
  246.         'categories' => $categories,
  247.     ]);
  248. }
  249.     #[Route('/supprimer-post/{id}'name'supprimer_post')]
  250.     public function supprimerPost(int $idEntityManagerInterface $entityManager,Post $post): Response
  251.     {
  252.         $entityManager $this->getDoctrine()->getManager();
  253.         $entityManager->remove($post);
  254.         $entityManager->flush();
  255.         return $this->redirectToRoute('app_mes_posts');
  256.     }
  257.  
  258.     /**
  259.      * @Route("/category/success", name="category_success")
  260.      */
  261.     public function success(): Response
  262.     {
  263.         return new Response('Post à été créer avec succès !');
  264.     }
  265. }