<?php
namespace App\Controller;
use App\Repository\CategoryRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Service\TraduireContenu;
use App\Entity\Category;
use App\Entity\Subcategory;
use App\Form\CategoryType;
use App\Repository\SubcategoryRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bundle\FrameworkBundle\Controller;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Cocur\Slugify\Slugify;
use Symfony\Component\HttpFoundation\File\File;
use App\service\FileUploader;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Serializer\Context\Normalizer\ObjectNormalizerContextBuilder;
class CategoryController extends AbstractController
{
private TraduireContenu $traduireContenu;
private CategoryRepository $categoryRepository;
public function __construct(TraduireContenu $traduire, CategoryRepository $categoryRepository)
{
$this->traduireContenu = $traduire;
$this->categoryRepository = $categoryRepository;
}
/**
* @Route("/{_locale<en|fr|de|it|es>}/welcome", name="welcome")
*/
public function index(Request $request,$role): Response
{
$session=$request->getSession();
$langue=$session->get("_locale");
return $this->render('welcome/home_entreprise.html.twig', [
'role'=>$role,
'categories' => $this->getAllCategories($langue)
]);
}
/*****************************************************************/
//*********************************************************
/**
* @Route("/{_locale<en|fr|de|it|es>}/category/edit/{id}", name="categoryEdit")
*/
public function edit($id, Request $request)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
//Récupère la catégoire avec l'if $id
$em = $this->getDoctrine()->getManager();
$category = $this->categoryRepository->findOneBy(['id' => $id]);
//Si la catégorie n'existe pas on throw une 404
if (!$category) {
throw $this->createNotFoundException('Categorie non trouvée');
}
$image = $category->getImage();
$originalSub = new ArrayCollection();
$originalImage = [];
foreach ($category->getSubcategories() as $subcategory) {
$originalSub->add($subcategory);
$originalImage[$subcategory->getSlug()] = $subcategory->getImage();
}
$form = $this->createForm(CategoryType::class, $category);
$slugify = new Slugify();
$form->handleRequest($request);
if ($form->isSubmitted()) {
//TODO: valider les sous-catégories
foreach ($category->getSubcategories() as $subcategory) {
if (!$originalSub->contains($subcategory)) {
if ($subcategory->getImage() == null) {
$form->addError(new FormError('l\'image et obligatoire de : ' . $subcategory->getName()));
}
if (!empty($em->getRepository(Subcategory::class)->findOneBy(['name' => $subcategory->getname()]))) {
$form->addError(new FormError('la sous-catégorie' . $subcategory->getName() . 'exsiste déja'));
break;
}
}
}
if ($form->isValid()) {
//TODO: Sauver la catégories et les sous-catégories
$slug = $slugify->slugify($category->getName());
$category->setSlug($slug);
if ($category->getImage() == null) {
$file = new File($image);
$category->setImage($file->getFilename());
}
//Modification des sous catégories
foreach ($originalSub as $subcategory) {
if ($subcategory->getImage() == null) {
$file = new File($originalImage[$subcategory->getSlug()]);
$subcategory->setImage($file->getFilename());
}
if (false === $category->getSubcategories()->contains($subcategory)) {
$category->getSubcategories()->removeElement($subcategory);
$em->persist($subcategory);
}
}
array_unique($category->getSubcategories()->toArray(), SORT_REGULAR);
$this->categoryRepository->persist($category);
$this->categoryRepository->flush();
$this->addFlash(
'notice',
'Catégorie enregistrée'
);
return $this->redirectToRoute('categoryEdit', ['id' => $id]);
}
}
return $this->render('category/edit.html.twig', [
'form' => $form->createView(),
'categoryName' => $category->getName(),
]);
}
/**
* @Route("/{_locale<en|fr|de|it|es>}/administration/categories/",name="categoryManage")
*/
public function manage(Request $request)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$categories = $this->categoryRepository->findAll();
return $this->render('category/manage.html.twig', [
'categories' => $categories,
]);
}
/**
* @Route("/{_locale<en|fr|de|it|es>}/category/add/", name="categoryAdd")
*/
public function add(Request $request)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$slugify = new Slugify();
$category = new Category();
$originalSubcategories = new ArrayCollection();
$em = $this->getDoctrine()->getManager();
$imageName = "empty.png";
foreach ($category->getSubcategories() as &$subcategory) {
$originalSubcategories->add($subcategory);
}
$form = $this->createForm(CategoryType::class, $category);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
foreach ($originalSubcategories as $subcategory) {
$file = $subcategory->getImage();
$slug = $slugify->slugify($subcategory->getName());
$imageName = $subcategory->getImage();
$subcategory->setSlug($slug);
$category->setImage($imageName);
if ($file) {
$fileName = $this->generateUniqueFileName() . '.' . $file->guessExtension();
$file->move(
$this->getParameter('subcategories_directory'),
$fileName
);
$category->setImage($fileName);
if (false === $category->getSubcategories()->contains($category)) {
$em->persist($subcategory);
}
}
$em->persist($subcategory);
}
$file = $category->getImage();
$slug = $slugify->slugify($category->getName());
$category->setSlug($slug);
$category->setImage($imageName);
if ($file) {
$fileName = $this->generateUniqueFileName() . '.' . $file->guessExtension();
$file->move(
$this->getParameter('categories_directory'),
$fileName
);
$category->setImage($fileName);
}
$em->persist($category);
$em->flush();
return $this->redirectToRoute('categoryAdd');
}
return $this->render('category/add.html.twig', [
'form' => $form->createView(),
'categoryName' => $category->getName(),
]);
}
// /**
// * @Route("/{_locale<en|fr|de|it|es>}/get-categories", methods="GET")
// */
#[Route('/{_locale<en|fr|de|it|es>}/get-categories', methods: ['GET'])]
public function getAlLCategories($langue)
{
$categories = $this->categoryRepository->findBy(["unicity" => 1]);
foreach ($categories as $category) {
$categoryToSend = ($langue == "fr") ? $category : $this->traduireContenu->retourTrad($category, $langue);
$subcategories = $categoryToSend->getSubcategories();
//dd($subcategories);
$subcatItems = array();
foreach ($subcategories as $subcat) {
$subcatItems[] = array(
'name' => $subcat->getName(),
'id' => $subcat->getId()
);
}
$data[] = array(
'id' => $categoryToSend->getId() /*$category->getId()*/,
'name' => $categoryToSend->getName() /*$category->getName()*/,
'subcategories' => $subcatItems,
'imgname' => $category->getName()
);
}
/////////////// handle Circular Reference when serializing ///////////////////
/*$encoder = new JsonEncoder();
$defaultContext = [
AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object, $format, $context) {
return $object->getName();
},
];
$normalizer = new ObjectNormalizer(null, null, null, null, null, null, $defaultContext);
$serializer = new Serializer([$normalizer], [$encoder]);*/
///////////////////////////////////////////////////////
//$data = $serializer->serialize($data,'json');
//$data = $this->get('serializer')->serialize($data, 'json');
return new JsonResponse($data, Response::HTTP_OK, [], false);
}
/**
* @Route("/{_locale<en|fr|de|it|es>}/{catId}/get-subcategories/", methods="GET")
*/
private function getSubCat($catId)
{
$em = $this->getDoctrine()->getManager();
$data = $em->getRepository(Catjoinsubcat::class)->findBy(['idx_category' => $catId]);
$data = $this->get('serializer')->serialize($data, 'json');
return new JsonResponse($data, Response::HTTP_OK, [], true);
}
public function getCategory($id)
{
return $this->categoryRepository->find($id);
}
/**
* @Route("/{_locale<en|fr|de|it|es>}/category/{slug}", name="blog_show")
*/
public function show($slug, Request $request, SerializerInterface $serializer, SubcategoryRepository $subcategoryRepository)
{
$langue = $request->getSession()->get("_locale");
$category = $this->categoryRepository->findOneBy(['slug' => $slug]);
if (!$category) {
throw $this->createNotFoundException('La categorie n\'existe pas');
}
if ($langue != "fr") {
$category = $this->traduireContenu->retourTrad($category, $langue);
}
$all_categories = $this->categoryRepository->findBy(['unicity' => 1]);
$liste_categories_traduites = [];
foreach ($all_categories as $categorie_particuliere) {
$liste_categories_traduites[] = $this->traduireContenu->retourTrad($categorie_particuliere, $langue);
}
//dd($all_categories);
$originalSubcategories = new ArrayCollection();
foreach ($category->getSubcategories() as &$subcategory) {
$originalSubcategories->add($subcategory);
}
// dd($category);
$chemin = '';
$category_name = '';
$subcat_name = '';
$category2 = $this->categoryRepository->findOneBy(['slug' => $slug]);
$companyList = $category2->getCompanies();
$companyJson = [];
$subcategoriesForCompany = [];
foreach ($companyList as $company) {
$companyJson[] = $serializer->serialize($company, 'json', ['groups' => ['company', 'category']]);
$subcategoriesForCompany[] = $subcategoryRepository->findByCompany($company->getId());
}
return $this->render('category/show.html.twig', [
'chemin2' => $chemin,
'category_name' => $category_name,
'subcat_name' => $subcat_name,
'allcategories' => $liste_categories_traduites,
'allcategoriesorginal' => $all_categories,
'category' => $category,
'categoryOriginal' => $category2,
'subcategories' => $originalSubcategories,
'subCategoriesCount' => count($originalSubcategories),
'companyList' => $companyJson,
'language' => $langue,
'subcategoriesForCompany' => $subcategoriesForCompany
]);
}
/**
* @Route("/{_locale<en|fr|de|it|es>}/administration/category/delete/{id}", name="categoryDelete")
*/
public function delete($id)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$category = $this->categoryRepository->findOneBy(array('id' => $id));
if ($category) {
$this->categoryRepository->remove($category);
$this->categoryRepository->flush();
}
return $this->redirectToRoute('categoryManage');
}
private function generateUniqueFileName()
{
return md5(uniqid());
}
}