src/Controller/CategoryController.php line 290

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Repository\CategoryRepository;
  4. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use App\Service\TraduireContenu;
  9. use App\Entity\Category;
  10. use App\Entity\Subcategory;
  11. use App\Form\CategoryType;
  12. use App\Repository\SubcategoryRepository;
  13. use Doctrine\Common\Collections\ArrayCollection;
  14. use Symfony\Bundle\FrameworkBundle\Controller;
  15. use Symfony\Component\Form\FormError;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Cocur\Slugify\Slugify;
  18. use Symfony\Component\HttpFoundation\File\File;
  19. use App\service\FileUploader;
  20. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  21. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  22. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  23. use Symfony\Component\Serializer\Serializer;
  24. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  25. use Symfony\Component\Serializer\SerializerInterface;
  26. use Symfony\Component\Serializer\Context\Normalizer\ObjectNormalizerContextBuilder;
  27. class CategoryController extends AbstractController
  28. {
  29.     private TraduireContenu $traduireContenu;
  30.     private CategoryRepository $categoryRepository;
  31.     public function __construct(TraduireContenu $traduireCategoryRepository $categoryRepository)
  32.     {
  33.         $this->traduireContenu $traduire;
  34.         $this->categoryRepository $categoryRepository;
  35.     }
  36.     /**
  37.      * @Route("/{_locale<en|fr|de|it|es>}/welcome", name="welcome")
  38.      */
  39.     public function index(Request $request,$role): Response
  40.     {
  41.         $session=$request->getSession();
  42.         $langue=$session->get("_locale");
  43.         
  44.         return $this->render('welcome/home_entreprise.html.twig', [
  45.             'role'=>$role,
  46.             'categories' => $this->getAllCategories($langue)
  47.         ]);
  48.     }
  49.     /*****************************************************************/
  50.     //*********************************************************
  51.     /**
  52.      * @Route("/{_locale<en|fr|de|it|es>}/category/edit/{id}", name="categoryEdit")
  53.      */
  54.     public function edit($idRequest $request)
  55.     {
  56.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  57.         //Récupère la catégoire avec l'if $id
  58.         $em $this->getDoctrine()->getManager();
  59.         $category $this->categoryRepository->findOneBy(['id' => $id]);
  60.         //Si la catégorie n'existe pas on throw une 404
  61.         if (!$category) {
  62.             throw $this->createNotFoundException('Categorie non trouvée');
  63.         }
  64.         $image $category->getImage();
  65.         $originalSub = new ArrayCollection();
  66.         $originalImage = [];
  67.         foreach ($category->getSubcategories() as $subcategory) {
  68.             $originalSub->add($subcategory);
  69.             $originalImage[$subcategory->getSlug()] = $subcategory->getImage();
  70.         }
  71.         $form $this->createForm(CategoryType::class, $category);
  72.         $slugify = new Slugify();
  73.         $form->handleRequest($request);
  74.         if ($form->isSubmitted()) {
  75.             //TODO: valider les sous-catégories
  76.             foreach ($category->getSubcategories() as $subcategory) {
  77.                 if (!$originalSub->contains($subcategory)) {
  78.                     if ($subcategory->getImage() == null) {
  79.                         $form->addError(new FormError('l\'image et obligatoire de : ' $subcategory->getName()));
  80.                     }
  81.                     if (!empty($em->getRepository(Subcategory::class)->findOneBy(['name' => $subcategory->getname()]))) {
  82.                         $form->addError(new FormError('la sous-catégorie' $subcategory->getName() . 'exsiste déja'));
  83.                         break;
  84.                     }
  85.                 }
  86.             }
  87.             if ($form->isValid()) {
  88.                 //TODO: Sauver la catégories et les sous-catégories
  89.                 $slug $slugify->slugify($category->getName());
  90.                 $category->setSlug($slug);
  91.                 if ($category->getImage() == null) {
  92.                     $file = new File($image);
  93.                     $category->setImage($file->getFilename());
  94.                 }
  95.                 //Modification des sous catégories
  96.                 foreach ($originalSub as $subcategory) {
  97.                     if ($subcategory->getImage() == null) {
  98.                         $file = new File($originalImage[$subcategory->getSlug()]);
  99.                         $subcategory->setImage($file->getFilename());
  100.                     }
  101.                     if (false === $category->getSubcategories()->contains($subcategory)) {
  102.                         $category->getSubcategories()->removeElement($subcategory);
  103.                         $em->persist($subcategory);
  104.                     }
  105.                 }
  106.                 array_unique($category->getSubcategories()->toArray(), SORT_REGULAR);
  107.                 $this->categoryRepository->persist($category);
  108.                 $this->categoryRepository->flush();
  109.                 $this->addFlash(
  110.                     'notice',
  111.                     'Catégorie enregistrée'
  112.                 );
  113.                 return $this->redirectToRoute('categoryEdit', ['id' => $id]);
  114.             }
  115.         }
  116.         return $this->render('category/edit.html.twig', [
  117.             'form' => $form->createView(),
  118.             'categoryName' => $category->getName(),
  119.         ]);
  120.     }
  121.     /**
  122.      * @Route("/{_locale<en|fr|de|it|es>}/administration/categories/",name="categoryManage")
  123.      */
  124.     public function manage(Request $request)
  125.     {
  126.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  127.         $categories $this->categoryRepository->findAll();
  128.         return $this->render('category/manage.html.twig', [
  129.             'categories' => $categories,
  130.         ]);
  131.     }
  132.     /**
  133.      * @Route("/{_locale<en|fr|de|it|es>}/category/add/", name="categoryAdd")
  134.      */
  135.     public function add(Request $request)
  136.     {
  137.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  138.         $slugify = new Slugify();
  139.         $category = new Category();
  140.         $originalSubcategories = new ArrayCollection();
  141.         $em $this->getDoctrine()->getManager();
  142.         $imageName "empty.png";
  143.         foreach ($category->getSubcategories() as &$subcategory) {
  144.             $originalSubcategories->add($subcategory);
  145.         }
  146.         $form $this->createForm(CategoryType::class, $category);
  147.         $form->handleRequest($request);
  148.         if ($form->isSubmitted() && $form->isValid()) {
  149.             foreach ($originalSubcategories as $subcategory) {
  150.                 $file $subcategory->getImage();
  151.                 $slug $slugify->slugify($subcategory->getName());
  152.                 $imageName $subcategory->getImage();
  153.                 $subcategory->setSlug($slug);
  154.                 $category->setImage($imageName);
  155.                 if ($file) {
  156.                     $fileName $this->generateUniqueFileName() . '.' $file->guessExtension();
  157.                     $file->move(
  158.                         $this->getParameter('subcategories_directory'),
  159.                         $fileName
  160.                     );
  161.                     $category->setImage($fileName);
  162.                     if (false === $category->getSubcategories()->contains($category)) {
  163.                         $em->persist($subcategory);
  164.                     }
  165.                 }
  166.                 $em->persist($subcategory);
  167.             }
  168.             $file $category->getImage();
  169.             $slug $slugify->slugify($category->getName());
  170.             $category->setSlug($slug);
  171.             $category->setImage($imageName);
  172.             if ($file) {
  173.                 $fileName $this->generateUniqueFileName() . '.' $file->guessExtension();
  174.                 $file->move(
  175.                     $this->getParameter('categories_directory'),
  176.                     $fileName
  177.                 );
  178.                 $category->setImage($fileName);
  179.             }
  180.             $em->persist($category);
  181.             $em->flush();
  182.             return $this->redirectToRoute('categoryAdd');
  183.         }
  184.         return $this->render('category/add.html.twig', [
  185.             'form' => $form->createView(),
  186.             'categoryName' => $category->getName(),
  187.         ]);
  188.     }
  189. //    /**
  190. //     * @Route("/{_locale<en|fr|de|it|es>}/get-categories", methods="GET")
  191. //     */
  192.     #[Route('/{_locale<en|fr|de|it|es>}/get-categories'methods: ['GET'])]
  193.     public function getAlLCategories($langue)
  194.     {
  195.         $categories $this->categoryRepository->findBy(["unicity" => 1]);
  196.         foreach ($categories as $category) {
  197.             $categoryToSend = ($langue == "fr") ? $category $this->traduireContenu->retourTrad($category$langue);
  198.             $subcategories =  $categoryToSend->getSubcategories();
  199.             //dd($subcategories);
  200.             $subcatItems = array();
  201.             foreach ($subcategories as $subcat) {
  202.                 $subcatItems[] = array(
  203.                     'name' => $subcat->getName(),
  204.                     'id' => $subcat->getId()
  205.                 );
  206.             }
  207.             $data[] = array(
  208.                 'id' => $categoryToSend->getId() /*$category->getId()*/,
  209.                 'name' => $categoryToSend->getName() /*$category->getName()*/,
  210.                 'subcategories' => $subcatItems,
  211.                 'imgname' => $category->getName()
  212.             );
  213.         }
  214.         /////////////// handle Circular Reference when serializing ///////////////////
  215.         /*$encoder = new JsonEncoder();
  216.         $defaultContext = [
  217.             AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object, $format, $context) {
  218.                 return $object->getName();
  219.             },
  220.         ];
  221.         $normalizer = new ObjectNormalizer(null, null, null, null, null, null, $defaultContext);
  222.         $serializer = new Serializer([$normalizer], [$encoder]);*/
  223.         ///////////////////////////////////////////////////////
  224.         //$data = $serializer->serialize($data,'json');
  225.         //$data = $this->get('serializer')->serialize($data, 'json');
  226.         return new JsonResponse($dataResponse::HTTP_OK, [], false);
  227.     }
  228.     /**
  229.      * @Route("/{_locale<en|fr|de|it|es>}/{catId}/get-subcategories/", methods="GET")
  230.      */
  231.     private function getSubCat($catId)
  232.     {
  233.         $em $this->getDoctrine()->getManager();
  234.         $data $em->getRepository(Catjoinsubcat::class)->findBy(['idx_category' => $catId]);
  235.         $data $this->get('serializer')->serialize($data'json');
  236.         return new JsonResponse($dataResponse::HTTP_OK, [], true);
  237.     }
  238.     public function getCategory($id)
  239.     {
  240.         return $this->categoryRepository->find($id);
  241.     }
  242.     /**
  243.      * @Route("/{_locale<en|fr|de|it|es>}/category/{slug}", name="blog_show")
  244.      */
  245.     public function show($slugRequest $requestSerializerInterface $serializerSubcategoryRepository $subcategoryRepository)
  246.     {
  247.         $langue $request->getSession()->get("_locale");
  248.         $category $this->categoryRepository->findOneBy(['slug' => $slug]);
  249.         if (!$category) {
  250.             throw $this->createNotFoundException('La categorie n\'existe pas');
  251.         }
  252.         if ($langue != "fr") {
  253.             $category $this->traduireContenu->retourTrad($category$langue);
  254.         }
  255.         $all_categories $this->categoryRepository->findBy(['unicity' => 1]);
  256.         $liste_categories_traduites = [];
  257.         foreach ($all_categories as $categorie_particuliere) {
  258.             $liste_categories_traduites[] = $this->traduireContenu->retourTrad($categorie_particuliere$langue);
  259.         }
  260.         //dd($all_categories);
  261.         $originalSubcategories = new ArrayCollection();
  262.         foreach ($category->getSubcategories() as &$subcategory) {
  263.             $originalSubcategories->add($subcategory);
  264.         }
  265.         // dd($category);
  266.         $chemin '';
  267.         $category_name '';
  268.         $subcat_name '';
  269.         $category2 $this->categoryRepository->findOneBy(['slug' => $slug]);
  270.         $companyList $category2->getCompanies();
  271.         $companyJson = [];
  272.         $subcategoriesForCompany = [];
  273.         foreach ($companyList as $company) {
  274.             $companyJson[] = $serializer->serialize($company'json', ['groups' => ['company''category']]);
  275.             $subcategoriesForCompany[] = $subcategoryRepository->findByCompany($company->getId());
  276.         }
  277.         return $this->render('category/show.html.twig', [
  278.             'chemin2' => $chemin,
  279.             'category_name' => $category_name,
  280.             'subcat_name' => $subcat_name,
  281.             'allcategories' => $liste_categories_traduites,
  282.             'allcategoriesorginal' => $all_categories,
  283.             'category' => $category,
  284.             'categoryOriginal' => $category2,
  285.             'subcategories' => $originalSubcategories,
  286.             'subCategoriesCount' => count($originalSubcategories),
  287.             'companyList' => $companyJson,
  288.             'language' => $langue,
  289.             'subcategoriesForCompany' => $subcategoriesForCompany
  290.         ]);
  291.     }
  292.     /**
  293.      * @Route("/{_locale<en|fr|de|it|es>}/administration/category/delete/{id}", name="categoryDelete")
  294.      */
  295.     public function delete($id)
  296.     {
  297.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  298.         $category $this->categoryRepository->findOneBy(array('id' => $id));
  299.         if ($category) {
  300.             $this->categoryRepository->remove($category);
  301.             $this->categoryRepository->flush();
  302.         }
  303.         return $this->redirectToRoute('categoryManage');
  304.     }
  305.     private function generateUniqueFileName()
  306.     {
  307.         return md5(uniqid());
  308.     }
  309. }