<?php
namespace App\Controller;
use App\Entity\Blog;
use App\Entity\Category;
use App\Form\CategoryType;
use App\Entity\PresidentsSlide;
use App\Controller\AppController;
use App\Service\FileUploaderService;
use App\Repository\CategoryRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\PresidentsSlideRepository;
use DateTime;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
class CategoryController extends AppController
{
/**
* @Route("/{_locale<%app.supported_locales%>}/{slug}", name="category_view", priority=-1)
*/
public function view($slug, Request $request)
{
/**
* @var CategoryRepository
*/
$categoryRepository = $this->em->getRepository(Category::class);
$category = $categoryRepository->findOneBy([
'slug' => $slug
]);
if (!$category) {
throw new NotFoundHttpException();
}
//Sécurisation du contenu
if ($category->getIsSecure()) {
$session = $request->getSession();
$isAuth = $session->get('isAuth', null);
$now = new DateTime('now');
$diff = $now < $isAuth;
if (!$diff) {
return $this->redirectToRoute('secure_page_index');
}
}
$pageParams = [
'controllerName' => 'Category',
'category' => $category,
// 'blocs' => $blocs
];
if ($category->getIsBlogPage()) {
/**
* @var BlogRepository
*/
$repo = $this->em->getRepository(Blog::class);
$limit = 21;
$page = $request->query->getInt("page", 1);
$total = $repo->count([]);
$posts = $repo->getPosts($page, $limit);
$pageParams['posts'] = $posts;
$pageParams['page'] = $page;
$pageParams['limit'] = $limit;
$pageParams['total'] = $total;
$pageParams['totalPages'] = ceil($total / $limit);
}
if ($category->getDisplayPresidentsSlide()) {
/**
* @var PresidentsSlideRepository
*/
$repo = $this->em->getRepository(PresidentsSlide::class);
$presidentsSlide = $repo->findBy(['online' => 1], ['date' => 'ASC']);
$pageParams['presidentsSlide'] = $presidentsSlide;
}
if ($category->getGetChildrenInContent()) {
$children = $categoryRepository->children($category);
$pageParams['children'] = $children;
}
return $this->render('category/view.html.twig', $pageParams);
}
/**
* @Route("/admin/category/list", name="category_admin_list")
*/
public function adminList(Request $request): Response
{
/**
* @var CategoryRepository
*/
$query = $this->em->createQueryBuilder()
->select('node.id, node.title, node.content', 'node.slug', 'node.level')
->from(Category::class, 'node')
->andWhere('node.level > :level')
->setParameter('level', 0)
->orderBy('node.root')
->addOrderBy('node.lft')
->getQuery();
return $this->render('category/adminList.html.twig', [
'controllerName' => 'Category',
'items' => $query->getArrayResult()
]);
}
/**
* @Route("/admin/category/add", name="category_admin_add")
*/
public function adminAdd(Request $request, FileUploaderService $fileUploader)
{
$category = new Category;
$form = $this->createForm(CategoryType::class, $category);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($category->getParent() != null) {
$category
->setParentTitle($category->getParent()->getTitle())
->setParentSlug($category->getParent()->getSlug());
}
/**
* @var UploadedFile
*/
$illustration = $form->get('illustration')->getData();
if ($illustration) {
$illustrationName = $fileUploader->upload($illustration, 'category/');
$category->setIllustration('uploads/images/category/' . $illustrationName);
}
$this->em->persist($category);
$this->em->flush();
//Ajout des index de recherche
$this->searchEngineService->manage(
Category::class,
$category->getId(),
[
'name' => 'category_view',
'params' => [
'slug' => $category->getSlug()
]
],
[
$category->getTitle(),
$category->getSubtitle(),
$category->getContent(),
$category->getParentTitle()
],
[
'title' => $category->getSeoTitle(),
'description' => $category->getSeoDescription()
]
);
$successMessage = $this->translator->trans('addMessage', [], 'commun');
$this->addFlash('success', $successMessage);
return $this->redirectToRoute('category_admin_list');
}
$formView = $form->createView();
return $this->render('category/adminAdd.html.twig', [
'controllerName' => 'Category',
'controllerFunction' => 'adminAdd',
'formView' => $formView
]);
}
/**
* @Route("/admin/category/{id}/edit", name="category_admin_edit")
*/
public function adminEdit($id, Request $request, FileUploaderService $fileUploader)
{
/**
* @var CategoryRepository
*/
$categoryRepository = $this->em->getRepository(Category::class);
$category = $categoryRepository->findOneBy([
'id' => $id
]);
if (!$category) {
throw new NotFoundHttpException();
}
$form = $this->createForm(CategoryType::class, $category);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($category->getParent() != null) {
$category
->setParentTitle($category->getParent()->getTitle())
->setParentSlug($category->getParent()->getSlug());
}
/**
* @var UploadedFile
*/
$illustration = $form->get('illustration')->getData();
if ($illustration) {
$illustrationName = $fileUploader->upload($illustration, 'category/');
$category->setIllustration('uploads/images/category/' . $illustrationName);
}
$this->em->persist($category);
$this->em->flush();
//Ajout des index de recherche
$this->searchEngineService->manage(
Category::class,
$category->getId(),
[
'name' => 'category_view',
'params' => [
'slug' => $category->getSlug()
]
],
[
$category->getTitle(),
$category->getSubtitle(),
$category->getContent(),
$category->getParentTitle()
],
[
'title' => $category->getSeoTitle(),
'description' => $category->getSeoDescription()
]
);
$successMessage = $this->translator->trans('updateMessage', [], 'commun');
$this->addFlash('success', $successMessage);
return $this->redirectToRoute('category_admin_list');
}
$formView = $form->createView();
return $this->render('category/adminEdit.html.twig', [
'controllerName' => 'Category',
'controllerFunction' => 'adminEdit',
'formView' => $formView
]);
}
/**
* @Route("/admin/category/{id}/editor", name="category_admin_editor")
*/
public function categoryEditor(Request $request, int $id, $size = "light"): Response
{
/**
* @var CategoryRepository
*/
$categoryRepository = $this->em->getRepository(Category::class);
$category = $categoryRepository->findOneBy([
'id' => $id
]);
if (!$category) {
throw new NotFoundHttpException();
}
$twig = 'category/adminEditor.html.twig';
if (!empty($request->query->get('size')) && $request->query->get('size') == "full") {
$size = 'full';
$twig = 'category/adminEditorFull.html.twig';
}
return $this->render($twig, [
'controllerName' => 'Category',
'itemId' => $category->getId(),
'controllerFunction' => 'adminEdit',
'size' => $size
]);
}
/**
* @Route("/admin/save-template", name="admin_save_template")
*/
public function saveTemplate(Request $request, EntityManagerInterface $em)
{
$data = [];
if ($request->isXMLHttpRequest()) {
foreach ($request->request as $key => $value) {
$data[$key] = $value;
}
$response = $this->grapesService->saveTemplate($data['id'], Category::class, $data);
//
$categoryRepository = $this->em->getRepository(Category::class);
$category = $categoryRepository->findOneBy([
'id' => $data['id']
]);
$this->searchEngineService->manage(
Category::class,
$category->getId(),
[
'name' => 'category_view',
'params' => [
'slug' => $category->getSlug()
]
],
[
$category->getTitle(),
$category->getSubtitle(),
$category->getContent(),
$category->getParentTitle()
],
[
'title' => $category->getSeoTitle(),
'description' => $category->getSeoDescription()
]
);
return new JsonResponse(null);
}
return new JsonResponse("pas de l'ajax");
}
/**
* @Route("/admin/load-template", name="admin_load_template")
*/
public function loadTemplate(Request $request, EntityManagerInterface $em)
{
if ($request->isXMLHttpRequest()) {
$templateId = (int) $request->request->get('id');
$template = $this->grapesService->loadTemplate($templateId, Category::class);
return new JsonResponse($template);
}
return new JsonResponse("pas de l'ajax");
}
/**
* Get Images from project dir
* @Route("/admin/get-editor-assets", name="admin_get_editor_assets")
*/
public function getAssets(): JsonResponse
{
$data = [];
$fileFinder = new Finder;
$fileFinder->files()->in($this->getParameter('ASSETS_DIR'));
foreach ($fileFinder as $file) {
$data['data'][] = $this->getParameter('ASSETS_URL') . $file->getFilename();
}
return new JsonResponse($data);
}
/**
* Upload Image
* @Route("/admin/post-editor-assets", name="admin_post_editor_assets")
*/
public function postAssets(Request $request, SluggerInterface $slugger): JsonResponse
{
$assetFile = null;
$data = ['data' => []]; // Prototype data
if (!empty($request->files->get('files'))) {
$assetFile = $request->files->get('files')[0];
$originalFilename = pathinfo($assetFile->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
$safeFilename = $slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $assetFile->guessExtension();
}
// Move the file to the directory where brochures are stored
try {
$assetFile->move(
$this->getParameter('ASSETS_DIR'),
$newFilename
);
$data['data'][] = $this->getParameter('ASSETS_URL') . $newFilename;
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
return new JsonResponse($data);
}
/**
* Delete Images from project dir
* @Route("/admin/delete-editor-assets", name="admin_delete_editor_assets")
*/
public function deleteAssets(Request $request): JsonResponse
{
$data = [];
$fileSystem = new Filesystem;
if ($request->request->get('assetId')) {
$data = $request->request->get('assetId');
$assetName = explode('/', $data)[5];
$fileSystem->remove($this->getParameter('ASSETS_DIR') . $assetName);
return new JsonResponse('Image deleted');
}
return new JsonResponse('Image not found');
}
/**
* @Route("/admin/category/{id}/remove", name="category_admin_remove")
*/
public function adminRemove($id)
{
/**
* @var CategoryRepository
*/
$categoryRepository = $this->em->getRepository(Category::class);
$category = $categoryRepository->findOneBy([
'id' => $id
]);
if (!$category) {
throw new NotFoundHttpException();
}
$this->em->remove($category);
$this->em->flush();
//Suppression des index de recherche
$this->searchEngineService->manage(
Category::class,
$id,
[],
[],
[],
false
);
$successMessage = $this->translator->trans('deleteMessage', [], 'commun');
$this->addFlash('success', $successMessage);
return $this->redirectToRoute('category_admin_list');
}
/**
* @Route("/admin/category/{id}/up/{top}", name="category_admin_up")
*/
public function adminUp($id, $top = 0)
{
/**
* @var CategoryRepository
*/
$repo = $this->em->getRepository(Category::class);
$node = $repo->findOneById($id);
if ($top) {
$repo->moveUp($node, true);
} else {
$repo->moveUp($node);
}
$successMessage = $this->translator->trans('movedUp', [], 'Category');
$this->addFlash('success', $successMessage);
return $this->redirectToRoute('category_admin_list');
}
/**
* @Route("/admin/category/{id}/down/{bottom}", name="category_admin_down")
*/
public function adminDown($id, $bottom = 0)
{
/**
* @var CategoryRepository
*/
$repo = $this->em->getRepository(Category::class);
$node = $repo->findOneById($id);
if ($bottom) {
$repo->moveDown($node, true);
} else {
$repo->moveDown($node);
}
$successMessage = $this->translator->trans('movedUp', [], 'Category');
$this->addFlash('success', $successMessage);
return $this->redirectToRoute('category_admin_list');
}
}