<?php
namespace App\Controller\CMS;
use App\Entity\CMS\Article;
use App\Entity\CMS\ArticleCategorie;
use App\Entity\CMS\Categorie;
use App\Form\CMS\CategorieType;
use App\Form\CMS\SupprimerCategorieType;
use App\Library\Datatable\Util\Datatable;
use App\Security\Voter\EntityVoter;
use App\Service\FO\Logo;
use Doctrine\ORM\EntityManagerInterface;
use JMS\Serializer\SerializerBuilder;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class CategorieController extends AbstractController
{
/**
* @Route("/cms/categorie/nouveau", name="dtc_cms_categorie_ajouter")
*/
public function ajouterAction(Request $request, EntityManagerInterface $em, Logo $logoService, TranslatorInterface $translator, ValidatorInterface $validator)
{
$categorie = new Categorie();
$user = $this->getUser();
//$categorie->setUtilisateur($user);
$form = $this->createForm(CategorieType::class, $categorie);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
$tokenP = $request->request->get('tokenPicture');
if ($form->isValid()) {
$em->persist($categorie);
$em->flush();
$logoService->sauvegarder($categorie, 'cms_categorie', $tokenP);
$this->addFlash(
'notice',
$translator->trans('Catégorie ajoutée avec succès !')
);
return $this->redirectToRoute('dtc_cms_categorie_modifier', ["id" => $categorie->getId()]);
} else {
$errors = $validator->validate($categorie);
}
}
return $this->render('Cms/Categorie/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
}
/**
* @Route("/cms/categorie/modifier/{id}", name="dtc_cms_categorie_modifier", requirements={"id"="\d+"})
*/
public function modifierAction(Request $request, Categorie $categorie, EntityManagerInterface $em, Logo $logoService,
Datatable $datatable, TranslatorInterface $translator, ValidatorInterface $validator
) {
$user = $this->getUser();
//$categorie->setUtilisateur($user);
$form = $this->createForm(CategorieType::class, $categorie);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
$droit = $this->isGranted(EntityVoter::UPDATE, Categorie::class);
if ( ! $droit) {
return $this->redirectToRoute('dtc_cms_categorie_modifier', ["id" => $categorie->getId()]);
}
if ($form->isValid()) {
$em->persist($categorie);
$em->flush();
$logoService->sauvegarder($categorie, 'cms_categorie');
$this->addFlash(
'notice',
$translator->trans('Catégorie sauvegardé avec succès !')
);
return $this->redirectToRoute('dtc_cms_categorie_modifier', ["id" => $categorie->getId()]);
} else {
$errors = $validator->validate($categorie);
}
}
$this->datatableArticles($categorie, $datatable, $translator);
return $this->render('Cms/Categorie/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'categorie' => $categorie]);
}
/**
* @Route("/cms/categorie/{page}", name="dtc_cms_categorie_liste", defaults={"page":1}, requirements={"page"="\d+"})
*/
public function listerAction(Request $request, $page, Datatable $datatable, TranslatorInterface $translator)
{
$tableau_class_cellule = [];
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [0], "visible" => true, "orderable" => false];
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [1], "visible" => true];
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [2], "visible" => true, "orderable" => false];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [3], "visible" => true];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [4], "visible" => true];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [5], "visible" => true];
$tableau_class_cellule[] = ["className" => " colonne_id", "targets" => [6], "visible" => true, "orderable" => false];
$this->datatable($datatable, $translator);
return $this->render('Cms/Categorie/lister.html.twig', ['name' => 'categorie', 'tableauClassColonne' => $tableau_class_cellule]);
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatable(Datatable $datatable, TranslatorInterface $translator)
{
$datatable->setEntity(Categorie::class, "x")
->setFields(
[
$translator->trans("ID") => 'x.id',
$translator->trans("Logo") => 'x.logo',
$translator->trans("Titre") => 'x.titre',
$translator->trans("Ordre") => 'x.ordre',
$translator->trans("Statut") => 'x.statut',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->setWhere(
'x.id != :id',
['id' => '1']
)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_cms_categorie_modifier',
],
],
1 => [
'view' => 'FO/DataTable/logo.html.twig',
'params' => [
'edit_route' => 'dtc_cms_categorie_modifier',
],
],
2 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_cms_categorie_modifier',
],
],
4 => [
'view' => 'FO/DataTable/statut.html.twig',
'params' => [
'edit_route' => 'dtc_cms_categorie_changer_statut',
],
],
5 => [
'view' => 'FO/DataTable/actions.html.twig',
'params' => [
'edit_route' => 'dtc_cms_categorie_modifier',
'objet' => Categorie::class,
],
],
]
)
->setMultiple(
[
'delete' => [
'title' => 'Non disponible',
'route' => 'dtc_cms_categorie_liste',
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)
->setSearchFields([2]);
//$datatable->setSearchFields(array(0,2));
return $datatable;
}
/**
* Grid action
* @return Response
*/
/**
* @Route("/cms/categorie/grid", name="dtc_cms_categorie_liste_grid")
*/
public function gridAction(Request $request, Datatable $datatable, TranslatorInterface $translator)
{
return $this->datatable($datatable, $translator)->execute();
}
/**
* @Route("/cms/categorie/recherche", name="dtc_cms_categorie_recherche")
*/
public function rechercheAction(Request $request, EntityManagerInterface $em, PaginatorInterface $paginator)
{
$q = $request->query->get('q');
$parent = $request->query->get('par');
$repo = $em->getRepository(Categorie::class);
$results = $repo->getRechercheCategorie($q, $parent);
$pagination = $paginator->paginate(
$results, /* query NOT result */
$request->query->getInt('page', 1) /*page number*/,
10 /*limit per page*/
);
$pagination_results = $pagination->getItems();
$option_placeholde = ["libelle" => "Sélectionnez", "id" => ""];
if ($request->query->getInt('page', 1) == 1) {
array_unshift($pagination_results, $option_placeholde);
}
$pagination->setItems($pagination_results);
$serializer = SerializerBuilder::create()->build();
return JsonResponse::fromJsonString($serializer->serialize($pagination, 'json'));
}
/**
* @Route("", name="")
*/
public function listerCategorieDossierArticleAction(Request $request, $article = null, $mode = "", EntityManagerInterface $em)
{
$repo_article = $em->getRepository(Article::class);
$article = $repo_article->find($article);
$repo_categorie = $em->getRepository(Categorie::class);
$repo_article_categorie = $em->getRepository(ArticleCategorie::class);
$nbCategoriesEnfant = [];
$articleCategories = [];
if (is_object($article)) {
//$categoriesArticle = $repo_article_categorie->findByArticle($articleId);
foreach ($article->getArticleCategorie() as $categorieArticle) {
$boucler = true;
$articleCategories[] = $categorieArticle->getCategorie()->getId();
if (is_object($categorieArticle->getCategorie()->getCategorieParent()) and $categorieArticle->getCategorie()->getCategorieParent()->getId() > 1) {
$parent = $categorieArticle->getCategorie()->getCategorieParent();
while ($boucler) {
if ( ! array_key_exists($parent->getId(), $nbCategoriesEnfant)) {
$nbCategoriesEnfant[$parent->getId()] = 1;
} else {
$nbCategoriesEnfant[$parent->getId()]++;
}
if (is_object($parent->getCategorieParent()) and $parent->getCategorieParent()->getId() > 1) {
$parent = $parent->getCategorieParent();
} else {
$boucler = false;
}
}
}
}
}
//print_r($nbCategoriesEnfant);
//\Doctrine\Common\Util\Debug::dump($articleId);
$categories = $repo_categorie->findBy(['categorieParent' => 1], ['titre' => 'ASC']);//CategorieParent
return $this->render('Cms/Categorie/lister-dossier.html.twig', [
'nbCategoriesEnfant' => $nbCategoriesEnfant,
'categories' => $categories,
'article' => $article,
'categoriesArticle' => $articleCategories,
'mode' => $mode,
]);
}
/**
* @Route("/cms/categorie/supprimer/{id}", name="dtc_cms_categorie_supprimer", requirements={"id"="\d+"})
*/
public function supprimerAction(Request $request, Categorie $objet, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$titre_modal = $translator->trans("Demande de confirmation");
$user = $this->getUser();
$message = '';
//Verifier si la categorie a des produits
if (count($objet->getCategoriesEnfant()) > 0) {
$message .= 'La catégorie n\'est pas supprimable car elle contient des produits.';
}
//Verifier si la categorie a des categories enfantes
if (count($objet->getCategoriesEnfant()) > 0) {
if ($message != '') {
$message .= ' ';
}
$message .= 'La catégorie n\'est pas supprimable car elle contient des catégories enfants';
}
$form = $this->createForm(SupprimerCategorieType::class, $objet);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em->remove($objet);
$em->flush();
$this->addFlash(
'notice',
$translator->trans('Catégorie supprimée avec succès !')
);
$url = $this->generateUrl('dtc_categorie_liste');
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url]);
} else {
$errors = $validator->validate($objet);
$rendu = $this->renderView('Cms/Categorie/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'message' => $message]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('Cms/Categorie/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'message' => $message]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatableArticles($categorie, Datatable $datatable, TranslatorInterface $translator)
{
$datatable
->setDatatableId('dta-produits')
->setEntity(Article::class, "x")
->setFields(
[
$translator->trans("ID") => 'x.id',
$translator->trans("Titre") => 'x.titre',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->addJoin('x.articleCategorie', 'ac', \Doctrine\ORM\Query\Expr\Join::INNER_JOIN)
->setWhere(
'ac.categorie = :categorie',
['categorie' => $categorie]
)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_cms_article_modifier',
],
],
2 => [
'view' => 'FO/DataTable/actions.html.twig',
'params' => [
'edit_route' => 'dtc_cms_article_modifier',
'objet' => Article::class,
],
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)//->setSearchFields(array(2,3,4))
;
//$datatable->setSearchFields(array(0,2));
return $datatable;
}
/**
* Grid action
* @return Response
*/
/**
* @Route("/cms/categorie/produits/grid/{id}", name="dtc_cms_categorie_articles_liste_grid", requirements={"id"="\d+"})
*/
public function gridArticlesAction(Request $request, Categorie $categorie, Datatable $datatable, TranslatorInterface $translator)
{
//$this->datatableProduits($categorie);
return $this->datatableArticles($categorie, $datatable, $translator)->execute();
}
/**
* @Route("/cms/categorie/statut/{id}", name="dtc_cms_categorie_changer_statut", requirements={"id"="\d+"})
*/
public function changeStatutAction(Request $request, Categorie $categorie, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
if ($categorie->getStatut() == 1) {
$categorie->setStatut(0);
} else {
$categorie->setStatut(1);
}
$em->persist($categorie);
$em->flush();
$headers = [
'Content-Type' => 'application/json',
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST',
];
return new JsonResponse(['data' => '1'], 200, $headers);
}
}