<?php
namespace App\Controller;
use App\Entity\Supplier;
use App\Entity\Users;
use App\Entity\Articles;
use App\Entity\Commentaires;
use App\Form\CommentairesType;
use App\Entity\Categories;
use App\Entity\SousCategories;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Contracts\Translation\TranslatorInterface;
use Knp\Component\Pager\PaginatorInterface; // Nous appelons le bundle KNP Paginator
use Symfony\Bridge\Twig\Mime\NotificationEmail;
use Symfony\Component\Mailer\MailerInterface;
class MainController extends AbstractController
{
private $mailer;
public function __construct(MailerInterface $mailer)
{
$this->mailer = $mailer;
}
/**
* @Route("/", name="accueil")
*/
public function index(Request $request, PaginatorInterface $paginator)
{
// Nous générons la vue de la page d'accueil
$donnees = $this->getDoctrine()->getRepository(Articles::class)->findBy(['deleted_at' => null, 'actif' => 1],['created_at' => 'desc']);
$countNew = $this->getDoctrine()->getRepository(Articles::class)->countNewArticles();
$articles = $paginator->paginate(
$donnees, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
60 // Nombre de résultats par page
);
return $this->render('main/index.html.twig',[
'articles' => $articles,
'countNew' => $countNew
]);
}
public function rigthData(Request $request)
{
$bestSupplier = $this->getDoctrine()->getRepository(Supplier::class)->getBestSuppliers();
$popularArticle = $this->getDoctrine()->getRepository(Articles::class)->getPopularArticle();
return $this->render('main/rightIndex.html.twig',[
'bestSupplier' => $bestSupplier,
'popularArticle' => $popularArticle
]);
}
public function filterForm(Request $request)
{
$suppler = new Supplier;
$listCity = $suppler::$listCity;
return $this->render('main/filter_form.html.twig',[
'listCity' => $listCity,
]);
}
/**
* @Route("/new-promo", name="new")
*/
public function newPromo(Request $request, PaginatorInterface $paginator)
{
// Nous générons la vue de la page d'accueil
$donnees = $this->getDoctrine()->getRepository(Articles::class)->getNewArticles();
$articles = $paginator->paginate(
$donnees, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
60 // Nombre de résultats par page
);
return $this->render('main/indexNewArticles.html.twig',[
'articles' => $articles,
]);
}
/**
* @Route("/hot-promo", name="hot")
*/
public function hotPromo(Request $request, PaginatorInterface $paginator)
{
// Nous générons la vue de la page d'accueil
$donnees = $this->getDoctrine()->getRepository(Articles::class)->getHotArticles();
$articles = $paginator->paginate(
$donnees, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
60 // Nombre de résultats par page
);
return $this->render('main/indexHotArticles.html.twig',[
'articles' => $articles,
]);
}
/**
* @Route("/all-stores", name="all_stores")
*/
public function stores()
{
$suppliers = $this->getDoctrine()->getRepository(Supplier::class)->findBy(['deleted_at' => null],['name' => 'asc']);
// Nous générons la vue de la page d'accueil
return $this->render('main/stores.html.twig',[
"suppliers" => $suppliers
]);
}
/**
* @Route("/articles-store/{id}", name="article_store")
*/
public function storeArticles($id, Request $request)
{
//DQL for perfermence
$supplier = $this->getDoctrine()->getRepository(Supplier::class)->find($id);
//@TODOadd where actif and date limit promo
$articles = $this->getDoctrine()->getRepository(Articles::class)->findBy(['supplier' => $supplier ,'deleted_at' => null, 'actif' => 1],['created_at' => 'desc']);
// Nous générons la vue de la page d'accueil
return $this->render('main/articles.html.twig',[
"articles" => $articles,
"supplier" => $supplier
]);
}
/**
* @Route("/suppliers-store/{user_id}", name="suppliers_store")
*/
public function listStore($user_id, Request $request)
{
$user = $this->getDoctrine()->getRepository(Users::class)->find($user_id);
//DQL for perfermence
$suppliers = $this->getDoctrine()->getRepository(Supplier::class)->findBy(['user' => $user]);
// Nous générons la vue de la page d'accueil
return $this->render('main/user_suppliers.html.twig',[
"suppliers" => $suppliers
]);
}
/**
* @Route("/mentions-legales", name="mentions-legales")
*/
public function mentionsLegales()
{
// Nous générons la vue de la page des mentions légales
return $this->render('main/mentions-legales.html.twig');
}
/**
* @Route("/change_locale/{locale}", name="change_locale")
*/
public function changeLocale($locale, Request $request)
{
//$request->setLocale($locale);
$request->getSession()->set('_locale', $locale);
return $this->redirect($request->headers->get('referer'));
}
/**
* @Route("/view-article-sorte/{slug}", name="web_store_article")
*/
public function storeArticle($slug, Request $request, TranslatorInterface $translator)
{
// On récupère l'article correspondant au slug
$article = $this->getDoctrine()->getRepository(Articles::class)->findOneBy(['slug' => $slug]);
$commentaires = $this->getDoctrine()->getRepository(Commentaires::class)->findBy([
'articles' => $article,
'actif' => 1
],['created_at' => 'desc']);
if(!$article){
// Si aucun article n'est trouvé, nous créons une exception
throw $this->createNotFoundException('L\'article n\'existe pas');
}
// Nous créons l'instance de "Commentaires"
$commentaire = new Commentaires();
// Nous créons le formulaire en utilisant "CommentairesType" et on lui passe l'instance
$form = $this->createForm(CommentairesType::class, $commentaire);
// Nous récupérons les données
$form->handleRequest($request);
// Nous vérifions si le formulaire a été soumis et si les données sont valides
if ($form->isSubmitted() && $form->isValid()) {
// Hydrate notre commentaire avec l'article
$commentaire->setArticles($article);
// Hydrate notre commentaire avec la date et l'heure courants
$commentaire->setCreatedAt(new \DateTime('now'));
$doctrine = $this->getDoctrine()->getManager();
// On hydrate notre instance $commentaire
$doctrine->persist($commentaire);
// On écrit en base de données
$doctrine->flush();
$this->mailer->send((new NotificationEmail())
->subject('New comment posted')
->htmlTemplate('emails/comment_notification.html.twig')
->from('site@example.com')
->to('mohamed.chebli@hotmail.com')
->context(['commentPseudo' => $commentaire->getPseudo(),
'commentContenu' => $commentaire->getContenu()])
);
$message = $translator->trans('Comment published successfully');
$this->addFlash('message', $message);
return $this->redirectToRoute('web_store_article',['slug' => $slug]);
}
// Si l'article existe nous envoyons les données à la vue
return $this->render('main/web_article.html.twig', [
'form' => $form->createView(),
'article' => $article,
'commentaires' => $commentaires,
]);
}
/**
* @Route("/all-categories", name="all_categories")
*/
public function categories()
{
$suupliers = [];
$categories = $this->getDoctrine()->getRepository(Categories::class)->findBy(['deleted_at' => null],['nom' => 'asc']);
// Nous générons la vue de la page d'accueil
return $this->render('main/categories.html.twig',[
"categories" => $categories
]);
}
/**
* @Route("/articles/categorie/{slug}", name="articles_categorie")
*/
public function articlesCategorie($slug, Request $request)
{
$articles = [];
$categorie = $this->getDoctrine()->getRepository(Categories::class)->findOneBy(['slug' => $slug]);
$categories = $this->getDoctrine()->getRepository(Categories::class)->findBy(['deleted_at' => null],['nom' => 'asc']);
foreach ($categorie->getArticles() as $article){
if($article->getDeletedAt() == null && $article->getActif()) {
$articles[] = $article;
}
}
// Nous générons la vue de la page d'accueil
return $this->render('main/categorie_articles.html.twig',[
"categorie" => $categorie,
"categories" => $categories,
"articles" => $articles
]);
}
/**
* @Route("/articles/categorie/{slug}/sub-categorie/{id}", name="articles_sous_categorie")
*/
public function articlesSubCategorie($slug, $id, Request $request)
{
$articles = [];
$categorie = $this->getDoctrine()->getRepository(Categories::class)->findOneBy(['slug' => $slug]);
$subCategorie = $this->getDoctrine()->getRepository(SousCategories::class)->find($id);
foreach ($subCategorie->getArticles() as $article){
if($article->getDeletedAt() == null && $article->getActif()) {
$articles[] = $article;
}
}
// Nous générons la vue de la page d'accueil
return $this->render('main/sous_categorie_articles.html.twig',[
"subCategorie" => $subCategorie,
"categorie" => $categorie,
"articles" => $articles
]);
}
}