src/Controller/ArticlesController.php line 188
<?php
namespace App\Controller;
use App\Entity\Articles;
use App\Entity\Category;
use App\Entity\Comments;
use App\Form\ArticlesType;
use App\Form\CommentsType;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ArticlesController extends AbstractController
{
// Modèle REST :
// récupérer tous les articles
// route (= routing) intercepte les URL & demande ce qu'il doit faire
#[Route('/articles', name: 'app_articles')]
public function index(): Response
{
return $this->render('articles/index.html.twig', [
'controller_name' => 'ArticlesController',
]);
}
#[Route('/article/{id}/delete', name: 'delete_article', requirements: ['id' => '\d+'])]
public function deleteArticle(EntityManagerInterface $entityManager, string $id, Request $request): Response {
// si j'ai un post
// je récupère le paramètre POST ID
$id = $request->get('id');
$article = $entityManager->getRepository(Articles::class)->find($id);
if($picture = $article->getPicture()) {
@unlink(' ./images/articles/' . $picture); // si j'ai 1 img, la supprimer lors de la suppression de l'article
}
$entityManager->remove($article);
$entityManager->flush();
// rediriger vers la page d'accueil avec un msg de confirmation
$this->addFlash('confirmation', 'L\'article a bien été supprimé !');
return $this->redirectToRoute('app_home');
}
// route multiple
// récupérer 1 article
#[Route('/article/{id}', name: 'show_article_by_id', requirements:['id' => '\d+'])]
public function showArticle(EntityManagerInterface $entityManager, string $id, Request $request): Response
{
$idArticle = $request->get("id");
$article = $entityManager->getRepository(Articles::class)->find($idArticle);
// récupérer les commentaires valides pour cet article
$comments = $entityManager->getRepository(Comments::class)->findAllValidComments($idArticle);
$comment = new Comments();
$form = $this->createForm(CommentsType::class, $comment);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$comment->setArticle($article);
$comment->setDate(new \DateTime);
$comment->setUser($this->getUser());
$comment->setIsValid(false);
$entityManager->persist($comment);
$entityManager->flush();
// réinitialiser le formulaire
$comment = new Comments();
$form = $this->createForm(CommentsType::class, $comment);
$this->addFlash('confirmation', 'Votre commentaire sera examiné sous 24 h !');
}
// récupérer l'article en BDD avec l'id de mon article
// comment récupérer l'id (qui est paramétré dans l'URL)
// récupérer le paramètre id via l'argument $id
$article = $entityManager->getRepository(Articles::class)->findBy(["id" => $id]) [0];
// dd($article);
// récupérer en BDD les 3 articles les + récents liés à cette category
// différent de l'article en cours
// => devoir coder la requête dans Articles Repository
$relatedArticles = $entityManager->getRepository(Articles::class)->findLastThreeRelatedArticles
($article->getCategory(), $id);
// dd($category->getName());
return $this->render('articles/article.html.twig', [
'article' => $article,
'relatedArticles' => $relatedArticles,
'form_comment' => $form,
'comments' => $comments
]);
}
/**
* CETTE MÉTHODE PERMET DE MODIFIER UN ARTICLE
*/
#[Route('/article/{id}/modify', name: 'modify_article', requirements: ['id' => '\d+'])]
public function modifyArticle(EntityManagerInterface $entityManager, string $id, Request $request) {
// récupérer l'article en BDD qui a l'id $id
// ensuite créer le formulaire via ArticlesType
// render la page articles/article-modify.html.twig
// il faut render le formulaire ds cte page
$article = $entityManager->getRepository(Articles::class)->find($id); // récupérer l'article en BDD
$form = $this->createForm(ArticlesType::class, $article); // créer le formulaire
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($file = $article->getPosterFile()) {
$fileName = md5(uniqid()) . '.' . $file->guessExtension(); // je formate le nom
$file->move('./images/articles/' , $fileName); // je le copie sur le serveur
// ('/images/articles/') plutôt car cela concerne les articles
$article->setPicture($fileName);
}
$entityManager->persist($article);
$entityManager->flush();
$this->addFlash('confirmation', 'Votre article a bien été modifié en BDD');
return $this->redirectToRoute('app_route');
}
return $this->render('articles/modify.html.twig', [ // avec render la page articles/article/modify.html.twig
'articles_form' => $form->createView(), // le formulaire présent dans la page avec render
'article' => $article
]);
}
/**
* Cette method permet d'afficher tous les articles liés à une catégorie
*/
#[Route('/articles/{id}', name: 'show_articles_by_category', requirements:['id' => '\d+'])]
public function showArticleByCategory(EntityManagerInterface $entityManager, string $id): Response
{
// récupérer tous les articles liés à l'id category récupéré sur la root
// comment récupérer l'id de la category
// attention pour (Articles::class) & (Category::class) il faut enlever la dernière lettre de Articles & Category
// pour les recharger
$articles = $entityManager->getRepository(Articles::class)->findBy(["category"=> $id]);
$category = $entityManager->getRepository(Category::class)->find($id);
return $this->render('articles/index.html.twig', [
'listArticles' => $articles,
'category' => $category->getName()
]);
}
/**
* Cette method permet de créer 1 article dans 1 nouveau formulaire
*/
#[Route('/articles/new', name: 'create_article')]
public function createArticle(EntityManagerInterface $entityManager, Request $request): Response
{
$article = new Articles();
$form = $this->createForm(ArticlesType::class, $article); // on rajoute après class : le $article
$form->handleRequest($request);
// dd($form->getData());
// si j'ai 1 category de rentrée dans le form
// je vais la créer
// je set cette category créée en BDD dans mon article
// sinon je fais ce qu'il y a en dessous
if($form->isSubmitted() && $form->isValid()) {
if($file = $article->getPosterFile()) {
$fileName = md5(uniqid()) . '.' . $file->guessExtension(); // je formate le nom
$file->move('./images/articles/' , $fileName); // je le copie sur le serveur
// ('/images/articles/') plutôt car cela concerne les img des articles
// qui peuvent être changées à tout moment c'est pourquoi les img se trouvent
// dans public > images > articles
// bien vérifier dans la BDD que l'article est bien créé + l'img (avec la suite de n°)
// se trouve dans le serveur
$article->setPicture($fileName);
}
// 1ère solution
$entityManager->persist($article);
$entityManager->flush();
$this->addFlash('confirmation', 'L\'article a bien été ajouté !');
return $this->redirectToRoute('app_home');
}
return $this->render('articles/new.html.twig', [
'add_article_form' => $form->createView()
]);
}
// si j'ai 1 POST
// je récupère le paramètre ID POST
#[Route('/delete', name: 'delete')]
public function delete(EntityManagerInterface $entityManager, Request $request): Response
{
$id = $request->get('id');
$article = $entityManager->getRepository(Articles::class)->find($id);
if($picture = $article->getPicture()) { // si j'ai 1 img, je la supprime lors de la suppresion de l'article
@unlink('./images/articles/' . $picture);
}
$entityManager->remove($article);
$entityManager->flush();
return new Response(Response::HTTP_OK);
}
}