src/Controller/Articles/DeclinaisonController.php line 491

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Articles;
  3. use App\Entity\Articles\Article;
  4. use App\Entity\Articles\AttributArticle;
  5. use App\Entity\Articles\Declinaison;
  6. use App\Entity\Articles\DeclinaisonValeurAttributArticle;
  7. use App\Entity\Articles\Image;
  8. use App\Entity\Articles\ValeurAttributArticle;
  9. use App\Entity\FO\Parametrage;
  10. use App\Form\Articles\DeclinaisonType;
  11. use App\Form\Articles\DetacherArticleDeclinaisonType;
  12. use App\Form\Articles\RattacherArticleDeclinaisonType;
  13. use App\Library\Datatable\Util\Datatable;
  14. use App\Service\Articles\ArticleService;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\Validator\Validator\ValidatorInterface;
  22. use Symfony\Contracts\Translation\TranslatorInterface;
  23. class DeclinaisonController extends AbstractController
  24. {
  25.     /**
  26.      * @Route("/article/declinaisons/ajouter-image/multiple", name="dtc_declinaison_ajouter_image_multiple")
  27.      */
  28.     public function ajouterImagesMultipleAction(Request $requestEntityManagerInterface $emTranslatorInterface $translator)
  29.     {
  30.         $post $request->request->all();
  31.         $titre_modal $translator->trans("Nouvelle image");
  32.         $page        $request->query->get('page');
  33.         $get         $request->query->all();
  34.         $errors      = [];
  35.         $tokenPicture     sprintf('%09d'mt_rand(01999999999));
  36.         $photosExistantes "";
  37.         $objet            "";
  38.         $dossier "";
  39.         $entite  "";
  40.         $photos  '';
  41.         //$rendu = $this->renderView('Articles/Declinaison/ajouter_image_multiple.html.twig', array('errors'=>$errors));
  42.         //$rendu = $this->renderView('Articles/Image/content-upload-multiple.html.twig', array('errors'=>$errors));
  43.         $rendu $this->renderView(
  44.             'Articles/Image/content-upload-multiple.html.twig',
  45.             [
  46.                 'enfants'      => $post["articles"],
  47.                 'entite'       => $entite,
  48.                 'objet'        => $objet,
  49.                 'dossier'      => $dossier,
  50.                 'photos'       => $photosExistantes,
  51.                 'tokenPicture' => $tokenPicture,
  52.                 'photos2'      => $photos,
  53.             ]
  54.         );
  55.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  56.         //return new JsonResponse(array('valide'=>'1'), 200, array('Content-Type'=>'application/json'));
  57.     }
  58.     /**
  59.      * @Route("/article/declinaisons/supprimer-image/multiple", name="dtc_declinaison_supprimer_image_multiple")
  60.      */
  61.     public function supprimerImagesMultipleAction(Request $requestEntityManagerInterface $em)
  62.     {
  63.         $url        "";
  64.         $post       $request->request->all();
  65.         $repo_image $em->getRepository(Image::class);
  66.         if (array_key_exists('images'$post) && count($post["images"]) > 0) {
  67.             foreach ($post["images"] as $img) {
  68.                 $image $repo_image->find($img);
  69.                 if (is_object($image)) {
  70.                     $article $image->getArticle();
  71.                     $article->removeImage($image);
  72.                     $em->persist($article);
  73.                     //Suppression physique des images dans les diférrents dossiers
  74.                     $dossiers = ['thumbnails''small''originals''medium''large'];
  75.                     foreach ($dossiers as $dossier) {
  76.                         $urlAsupprimer $image->getUploadDir().'/'.$article->getId().'/'.$dossier.'/'.$image->getUrl();
  77.                         unlink($urlAsupprimer);
  78.                     }
  79.                     $em->remove($image);
  80.                 }
  81.             }
  82.             $em->flush();
  83.         }
  84.         return new JsonResponse(['url' => $url'valide' => '1']);
  85.     }
  86.     /**
  87.      * @Route("/article/declinaisons/appliquer-regles/multiple", name="dtc_declinaison_appliquer_regle_multiple")
  88.      */
  89.     public function appliquerRegleDeclinaisonMultipleAction(Request $requestEntityManagerInterface $emArticleService $articleServiceTranslatorInterface $translator)
  90.     {
  91.         $url            "";
  92.         $repo_article   $em->getRepository(Article::class);
  93.         $data           $request->get('dataTables');
  94.         $ids            $data['actions'];
  95.         $article_parent null;
  96.         //print_r($ids);
  97.         if (count($ids) > 0) {
  98.             foreach ($ids as $id) {
  99.                 if ( ! is_object($article_parent)) {
  100.                     $article_obj $repo_article->find($id);
  101.                     if (is_object($article_obj) && is_object($article_obj->getArticleDeclinaisonParent())) {
  102.                         $article_parent $article_obj->getArticleDeclinaisonParent();
  103.                     }
  104.                 }
  105.                 if (is_object($article_parent)) {
  106.                     $articleService->majDeclinaison($id$article_parent);
  107.                 }
  108.             }
  109.         }
  110.         $this->addFlash('notice'$translator->trans('Déclinaisons mis à jours avec succès !'));
  111.         return new JsonResponse(['url' => $url'valide' => '1']);
  112.     }
  113.     /**
  114.      * @Route("/article/check/reference", name="dtc_article_reference_libre")
  115.      */
  116.     public function referenceArticleLibreAction(Request $requestArticleService $articleService)
  117.     {
  118.         $get    $request->query->all();
  119.         $retour false;
  120.         if ( ! $articleService->testReferenceArticleExiste($get["reference"])) {
  121.             $retour true;
  122.         }
  123.         return new JsonResponse(['rendu' => '''valide' => $retour]);
  124.     }
  125.     /**
  126.      * @Route("/declinaison/nouveau/{id}/{type}", name="dtc_declinaison_article_ajouter")
  127.      */
  128.     public function ajouterAction(Request $request$id$type ""EntityManagerInterface $emTranslatorInterface $translatorValidatorInterface $validator)
  129.     {
  130.         $titre_modal $translator->trans("Nouvelle déclinaison");
  131.         $repo_objet  $em->getRepository(Article::class);
  132.         $get         $request->query->all();
  133.         $declinaison = new Declinaison();
  134.         $objet $repo_objet->find($id);
  135.         if (is_object($objet)) {
  136.             $declinaison->setArticle($objet);
  137.             //$declinaison->setLibelle($objet->getLibelle());
  138.         }
  139.         $user $this->getUser();
  140.         //$declinaison->setUtilisateur($user);
  141.         $form $this->createForm(DeclinaisonType::class, $declinaison);
  142.         $repo_attribut $em->getRepository(AttributArticle::class);
  143.         $attributs     $repo_attribut->findAll();
  144.         $errors "";
  145.         $form->handleRequest($request);
  146.         if ($form->isSubmitted()) {
  147.             if ($form->isValid()) {
  148.                 $post $request->request->all();
  149.                 if ($type == 'article') {
  150.                     $repo_objet $em->getRepository(Article::class);
  151.                     $objet      $repo_objet->find($id);
  152.                     $url        $this->generateUrl('dtc_article_modifier', ['id' => $objet->getId(), 'tab' => 'condVente']);
  153.                 }
  154.                 if (array_key_exists('attr_val'$post) && $post["attr_val"]) {
  155.                     $valeur_tab explode(","$post["attr_val"]);
  156.                     if (count($valeur_tab) > 0) {
  157.                         $repo_valeur_attribut $em->getRepository(ValeurAttributArticle::class);
  158.                         foreach ($valeur_tab as $vt) {
  159.                             $id_valeur $vt;
  160.                             $id_valeur str_replace("val_"""$id_valeur);
  161.                             $id_valeur str_replace("_val"""$id_valeur);
  162.                             $valeur_obj $repo_valeur_attribut->find($id_valeur);
  163.                             if (is_object($valeur_obj)) {
  164.                                 $declinaisonValeurAttributArticle = new DeclinaisonValeurAttributArticle();
  165.                                 $declinaisonValeurAttributArticle->setDeclinaison($declinaison);
  166.                                 $declinaisonValeurAttributArticle->setValeurAttributArticle($valeur_obj);
  167.                                 $em->persist($declinaisonValeurAttributArticle);
  168.                             }
  169.                         }
  170.                     }
  171.                 }
  172.                 $em->persist($declinaison);
  173.                 $em->persist($objet);
  174.                 $em->flush();
  175.                 if (array_key_exists('table'$get) && $get["table"] != "") {
  176.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url'type' => 'recharger_datatable''id_datatable' => $get["table"]],
  177.                                             200,
  178.                                             ['Content-Type' => 'application/json']);
  179.                 } else {
  180.                     $this->addFlash('notice'$translator->trans('Déclinaison ajoutée avec succès !'));
  181.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url]);
  182.                 }
  183.             } else {
  184.                 $errors $validator->validate($declinaison);
  185.                 $rendu  $this->renderView(
  186.                     'Articles/Declinaison/ajouter.html.twig',
  187.                     ['form' => $form->createView(), 'errors' => $errors'id' => $id'type' => $type'declinaison' => $declinaison'attributs' => $attributs]
  188.                 );
  189.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  190.             }
  191.         }
  192.         $rendu $this->renderView(
  193.             'Articles/Declinaison/ajouter.html.twig',
  194.             ['form' => $form->createView(), 'errors' => $errors'id' => $id'type' => $type'declinaison' => $declinaison'attributs' => $attributs]
  195.         );
  196.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  197.         //return $this->render('Articles/Declinaison/ajouter.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$id,'type'=>$type));
  198.     }
  199.     /**
  200.      * @Route("/declinaison/charger-tableau-image/{id}/{type}", name="dtc_declinaison_article_charger_tableau_image")
  201.      */
  202.     public function chargerTableauImageAction(Request $request$id "0"$type ""EntityManagerInterface $em)
  203.     {
  204.         $repo_objet $em->getRepository(Article::class);
  205.         $article    $repo_objet->find($id);
  206.         $rendu $this->renderView('Articles/Declinaison/charger_tableau_image.html.twig', ["id" => $id"type" => $type"article" => $article,]);
  207.         return new JsonResponse(['rendu' => $rendu]);
  208.     }
  209.     /**
  210.      * @Route("/declinaison/charger-tableau/{id}/{type}", name="dtc_declinaison_article_charger_tableau")
  211.      */
  212.     public function chargerTableauAction(Request $request$id "0"$type ""EntityManagerInterface $em)
  213.     {
  214.         $repo_objet $em->getRepository(Article::class);
  215.         $article    $repo_objet->find($id);
  216.         $rendu $this->renderView('Articles/Declinaison/charger_tableau.html.twig', ["id" => $id"type" => $type"article" => $article,]);
  217.         return new JsonResponse(['rendu' => $rendu]);
  218.     }
  219.     /**
  220.      * @Route("/declinaison", name="dtc_declinaison_article_liste")
  221.      */
  222.     public function listerAction(Request $request$id "0"$type "a"$enfant ""EntityManagerInterface $emTranslatorInterface $translatorDatatable $datatable)
  223.     {
  224.         $tableau_class_cellule = [];
  225.         $modal     $request->query->get('modal');
  226.         $articleId $request->query->get('id');
  227.         $qte       $request->query->get('qte');
  228.         $repo_objet $em->getRepository(Article::class);
  229.         $attributs $em->getRepository(AttributArticle::class)->findAll();
  230.         $objet $repo_objet->find($id);
  231.         if ($articleId != '') {
  232.             $article $repo_objet->find($articleId);
  233.             if ($modal == && is_object($article)) {
  234.                 $titre_modal $translator->trans('Déclinaison');
  235.                 $this->datatableArticle($request$article$type$em$datatable$translator);
  236.                 $rendu $this->renderView('Articles/Declinaison/lister.html.twig', ['tableauClassColonne' => $tableau_class_cellule"id" => $articleId"type" => $type'qte' => $qte]
  237.                 );
  238.                 //$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$id,'type'=>$type,'objet'=>$objet));
  239.                 return new Response(json_encode(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]));
  240.             }
  241.         }
  242.         if (is_object($objet)) {
  243.             $tableau_class_cellule = [];
  244.             $tableau_class_cellule[] = ["searchable" => true"className" => "visible_export colonne_id ""targets" => [0], "visible" => true"orderable" => false];
  245.             $tableau_class_cellule[] = ["searchable" => true"className" => "visible_export colonne_id ""targets" => [1], "visible" => true];
  246.             $tableau_class_cellule[] = ["searchable" => true"className" => "visible_export colonne_id""targets" => [2], "visible" => true];
  247.             $tableau_class_cellule[] = ["orderable" => false"searchable" => true"className" => "visible_export colonne_id text-right""targets" => [3], "visible" => true];
  248.             $tableau_class_cellule[] = ["searchable" => true"className" => "visible_export colonne_id text-right ""targets" => [4], "visible" => true];
  249.             $tableau_class_cellule[] = ["orderable" => false"searchable" => false"className" => "colonne_id text-center""targets" => [5], "visible" => true];
  250.             $tableau_class_cellule[] = ["orderable" => false"searchable" => false"className" => "colonne_id""targets" => [6], "visible" => true];
  251.             $this->datatableArticle$request$objet$type,  $em,  $datatable,  $translator);
  252.             return $this->render(
  253.                 'Articles/Declinaison/lister.html.twig',
  254.                 ['tableauClassColonne' => $tableau_class_cellule"id" => $id"type" => $type"attributs" => $attributs"article" => $objet"enfant" => $enfant]
  255.             );
  256.         }
  257.     }
  258.     /**
  259.      * set datatable configs
  260.      *
  261.      * @return \App\Library\Datatable\Util\Datatable
  262.      */
  263.     private function datatableArticle(Request $request$objet$type ""EntityManagerInterface $emDatatable $datatableTranslatorInterface $translator)
  264.     {
  265.         $param $request->query->all();
  266.         $conn  $em->getConnection();
  267.         $conn->getConfiguration()->setSQLLogger(null);
  268.         $qb $em->createQueryBuilder();
  269.         $qb->select(
  270.             "
  271.                     x.id as x_id,
  272.                     x.archive as x_archive,
  273.                     x.libelle as x_libelle,
  274.                     x.reference as x_reference,
  275.                     x.descriptionCourte as x_descriptionCourte,
  276.                     x.prixVente as x_prixVente,
  277.                     x.tauxMarge as x_tauxMarge,
  278.                     x.cpump as x_cpump,
  279.                     x.stock as x_stock,
  280.                     x.statut as x_statut,
  281.                     m.libelle as m_libelle,
  282.                     m.id as m_id,
  283.                     t.libelle as t_libelle,
  284.                     t.id as t_id,
  285.                     r.id as r_id,
  286.                     r.tauxDefaut as r_tauxDefaut
  287.                     "
  288.         )
  289.            ->orderBy('x.id''DESC')
  290.            ->from(Article::class, "x")
  291.            ->leftJoin('x.marque''m')
  292.            ->leftJoin('x.type''t')
  293.            ->leftJoin('x.regleTaxe''r'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);;
  294.         $where "(x.archive = 0 or x.archive is null)";
  295.         $where "";
  296.         //$qb->where('x.temporaire is null and (x.archive = 0 or x.archive is null)'.$where);
  297.         //$qb->where('x.articleDeclinaisonParent = :articleDeclinaisonParent AND x.temporaire is null AND '.$where);
  298.         $qb->where('x.articleDeclinaisonParent = :articleDeclinaisonParent AND x.temporaire is null');
  299.         $parametres['articleDeclinaisonParent'] = $objet;
  300.         //echo $where;
  301.         if (count($parametres) > 0) {
  302.             $qb->setParameters($parametres);
  303.         }
  304.         //$type_jointure = 'x.'.$type;
  305.         $datatable->setDatatableId('dta-declinaisons')
  306.             //->setEntity("DTCArticlesBundle:Article", "x")
  307.                   ->setFields(
  308.                 [
  309.                     $translator->trans("Référence") => 'x.reference',
  310.                     $translator->trans("Libellé")   => 'x.libelle',
  311.                     $translator->trans("Prix HT")   => 'x.prixVente',
  312.                     $translator->trans("Prix TTC")  => 'x.prixVente',
  313.                     $translator->trans("Stock")     => 'x.stock',
  314.                     $translator->trans("Actions")   => 'x.id',
  315.                     "_identifier_"                  => 'x.id',
  316.                 ]
  317.             )
  318.             //->addJoin('x.pays', 'p', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  319.             //->addJoin('f.devise', 'd', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  320.             //->addJoin('x.uniteMesure', 'u', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  321.             /*->setWhere(
  322.                     $type_jointure.' = :objet',
  323.                     array('objet' => $objet)
  324.                )
  325.               */
  326.                   ->setWhere(
  327.                 'x.articleDeclinaisonParent = :objet',
  328.                 ['objet' => $objet]
  329.             )
  330.                   ->setRenderers(
  331.                       [
  332.                           => [
  333.                               'view'   => 'FO/DataTable/article_id.html.twig',
  334.                               'params' => [
  335.                                   'edit_route' => 'dtc_article_modifier',
  336.                               ],
  337.                           ],
  338.                           => [
  339.                               'view'   => 'FO/DataTable/article_id.html.twig',
  340.                               'params' => [
  341.                                   'edit_route' => 'dtc_article_modifier',
  342.                               ],
  343.                           ],
  344.                           => [
  345.                               'view'   => 'FO/DataTable/article_prixSuivi.html.twig',
  346.                               'params' => [
  347.                                   'surveillance' => false,
  348.                               ],
  349.                           ],
  350.                           => [
  351.                               'view' => 'FO/DataTable/article_prix_article_ttc.html.twig',
  352.                           ],
  353.                           => [
  354.                               'view'   => 'FO/DataTable/article_actions.html.twig',
  355.                               'params' => [
  356.                                   'edit_route'     => 'dtc_article_modifier',
  357.                                   'detacher_route' => 'dtc_declinaison_detacher_article',
  358.                                   'objet'          => Article::class,
  359.                                   'table'          => "dta-declinaisons",
  360.                               ],
  361.                           ],
  362.                       ]
  363.                   )
  364.                   ->setOrder("x.id""desc")
  365.                   ->setSearch(true)
  366.                   ->setMultiple(
  367.                       [
  368.                           'regles' => [
  369.                               'title' => 'Appliquer les régles de propagation',
  370.                               'route' => 'dtc_declinaison_appliquer_regle_multiple' // path to multiple delete route
  371.                           ],
  372.                       ]
  373.                   );//->setSearchFields(array(1,2))
  374.         ;
  375.         $datatable->getQueryBuilder()->setDoctrineQueryBuilder($qb);
  376.         return $datatable;
  377.     }
  378.     /**
  379.      * Grid action
  380.      * @return Response
  381.      */
  382.     /**
  383.      * @Route("/declinaison/grid/{id}/{type}", name="dtc_declinaison_article_liste_grid")
  384.      */
  385.     public function gridAction($id ""$type ""Request $requestEntityManagerInterface $emDatatable $datatableTranslatorInterface $translator)
  386.     {
  387.         $repo_objet $em->getRepository(Article::class);
  388.         $objet $repo_objet->find($id);
  389.         if (is_object($objet)) {
  390.             return $this->datatableArticle$request$objet$type ,  $em,  $datatable,  $translator)->execute();
  391.         }
  392.     }
  393.     /**
  394.      * @Route("/declinaison/defaut/{id}", name="dtc_declinaison_article_statut")
  395.      */
  396.     public function changeDefautAction(Declinaison $declinaisonEntityManagerInterface $em)
  397.     {
  398.         if ($declinaison->getDefaut() == 1) {
  399.             $declinaison->setDefaut(0);
  400.         } else {
  401.             $declinaison->setDefaut(1);
  402.         }
  403.         $em->persist($declinaison);
  404.         $em->flush();
  405.         $em->refresh($declinaison);
  406.         $headers = ['Content-Type' => 'application/json''Access-Control-Allow-Origin' => '*''Access-Control-Allow-Methods' => 'POST'];
  407.         return new JsonResponse(['data' => '1'], 200$headers);
  408.     }
  409.     /**
  410.      * @Route("/declinaison/attribut/supprimer/{id}/{article}", name="dtc_declinaison_supprimer_attribut_article")
  411.      */
  412.     public function supprimerAttributArticleAction(AttributArticle $attributArticleArticle $articleEntityManagerInterface $em)
  413.     {
  414.         $valide 1;
  415.         $repo_declinaison $em->getRepository(Declinaison::class);
  416.         $valeurs          $repo_declinaison->findBy(["article" => $article"attributArticle" => $attributArticle]);
  417.         if (count($valeurs) > 0) {
  418.             foreach ($valeurs as $v) {
  419.                 $em->remove($v);
  420.             }
  421.             $em->flush();
  422.         }
  423.         $headers = ['Content-Type' => 'application/json''Access-Control-Allow-Origin' => '*''Access-Control-Allow-Methods' => 'POST'];
  424.         return new JsonResponse(['valide' => $valide], 200$headers);
  425.     }
  426.     /**
  427.      * @Route("/declinaison/rattacher/{id}", name="dtc_declinaison_rattacher_article")
  428.      */
  429.     public function rattacherArticleAction(Request $requestArticle $articleEntityManagerInterface $emTranslatorInterface $translatorValidatorInterface $validator)
  430.     {
  431.         $get         $request->query->all();
  432.         $titre_modal $translator->trans("Rattacher un article existant");
  433.         $user        $this->getUser();
  434.         $form        $this->createForm(RattacherArticleDeclinaisonType::class, $article);
  435.         $errors      "";
  436.         $form->handleRequest($request);
  437.         if ($form->isSubmitted()) {
  438.             if ($form->isValid()) {
  439.                 $url    "";
  440.                 $entity $form->getData();
  441.                 $enfant $form->get('enfant')->getData();
  442.                 if (is_object($enfant)) {
  443.                     $enfant->setArticleDeclinaisonParent($article);
  444.                     $em->persist($enfant);
  445.                     $em->flush();
  446.                 }
  447.                 $rendu '';
  448.                 if ( ! empty($get["table"])) {
  449.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url'type' => 'recharger_datatable''id_datatable' => $get["table"]],
  450.                                             200,
  451.                                             ['Content-Type' => 'application/json']);
  452.                 } else {
  453.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url]);
  454.                 }
  455.             } else {
  456.                 $errors $validator->validate($article);
  457.                 $rendu  $this->renderView('Articles/Declinaison/rattacher.html.twig', ['form' => $form->createView(), 'errors' => $errors'article' => $article]);
  458.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  459.             }
  460.         }
  461.         $rendu $this->renderView('Articles/Declinaison/rattacher.html.twig', ['form' => $form->createView(), 'errors' => $errors'article' => $article]);
  462.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  463.     }
  464.     /**
  465.      * @Route("/declinaison/valeur/ajouter/{id}/{article}", name="dtc_declinaison_ajouter_valeur_article")
  466.      */
  467.     public function ajouterValeursArticleAction(Request $requestAttributArticle $attributArticleArticle $articleEntityManagerInterface $em)
  468.     {
  469.         $valide 0;
  470.         $get    $request->query->all();
  471.         if (array_key_exists('valeur'$get) && $get["valeur"] != "" && array_key_exists('nouveau'$get) && $get["nouveau"] != "") {
  472.             $repo_declinaison     $em->getRepository(Declinaison::class);
  473.             $repo_valeur_attribut $em->getRepository(ValeurAttributArticle::class);
  474.             if (is_object($article->getarticleDeclinaisonParent())) {
  475.                 $caracteritiques_article $repo_declinaison->findBy(["article" => $article"attributArticle" => $attributArticle]);
  476.                 if (count($caracteritiques_article) > 0) {
  477.                     foreach ($caracteritiques_article as $v) {
  478.                         $em->remove($v);
  479.                     }
  480.                 }
  481.             }
  482.             if ($get["nouveau"] == "false") {
  483.                 $valeur_obj $repo_valeur_attribut->find($get["valeur"]);
  484.                 $declinaison_obj $repo_declinaison->findOneBy(["article" => $article"attributArticle" => $attributArticle"valeurAttributArticle" => $valeur_obj]);
  485.                 if ( ! is_object($declinaison_obj)) {
  486.                     $declinaison = new Declinaison;
  487.                     $declinaison->setArticle($article);
  488.                     $declinaison->setAttributArticle($attributArticle);
  489.                     $declinaison->setValeurAttributArticle($valeur_obj);
  490.                     $em->persist($declinaison);
  491.                     $em->flush();
  492.                 } else {
  493.                     $em->remove($declinaison_obj);
  494.                     $em->flush();
  495.                 }
  496.             } else {
  497.                 $valeur_obj $repo_valeur_attribut->findOneBy(["libelle" => $get["valeur"], "attributArticle" => $attributArticle]);
  498.                 if ( ! is_object($valeur_obj)) {
  499.                     $valeurAttributArticle = new ValeurAttributArticle;
  500.                     $valeurAttributArticle->setLibelle($get["valeur"]);
  501.                     $valeurAttributArticle->setAttributArticle($attributArticle);
  502.                     $em->persist($valeurAttributArticle);
  503.                     $em->flush();
  504.                     $em->refresh($valeurAttributArticle);
  505.                     $declinaison = new Declinaison;
  506.                     $declinaison->setArticle($article);
  507.                     $declinaison->setAttributArticle($attributArticle);
  508.                     $declinaison->setValeurAttributArticle($valeurAttributArticle);
  509.                     $em->persist($declinaison);
  510.                     $em->flush();
  511.                 } else {
  512.                     $declinaison_obj $repo_declinaison->findOneBy(["article" => $article"attributArticle" => $attributArticle"valeurAttributArticle" => $valeur_obj]);
  513.                     if ( ! is_object($declinaison_obj)) {
  514.                         $declinaison = new Declinaison;
  515.                         $declinaison->setArticle($article);
  516.                         $declinaison->setAttributArticle($attributArticle);
  517.                         $declinaison->setValeurAttributArticle($valeur_obj);
  518.                         $em->persist($declinaison);
  519.                         $em->flush();
  520.                     } else {
  521.                         $em->remove($declinaison_obj);
  522.                         $em->flush();
  523.                     }
  524.                 }
  525.             }
  526.         }
  527.         $headers = [
  528.             'Content-Type'                 => 'application/json',
  529.             'Access-Control-Allow-Origin'  => '*',
  530.             'Access-Control-Allow-Methods' => 'POST',
  531.         ];
  532.         return new JsonResponse(['valide' => $valide], 200$headers);
  533.     }
  534.     /**
  535.      * @Route("/declinaison/valeur/charger/{id}/{article}", name="dtc_declinaison_charger_valeurs")
  536.      */
  537.     public function chargerValeursAction(AttributArticle $attributArticle $articleEntityManagerInterface $em)
  538.     {
  539.         $repo_valeurs $em->getRepository(ValeurAttributArticle::class);
  540.         $valeurs      $repo_valeurs->findBy(["attributArticle" => $attribut]);
  541.         $options_valeurs "";
  542.         if (is_object($article->getarticleDeclinaisonParent())) {
  543.             $rendu $this->renderView('Articles/Declinaison/ajouter_caracteristique.html.twig', ['attribut' => $attribut'valeurs' => $valeurs'article' => $article]);
  544.         } else {
  545.             $rendu $this->renderView('Articles/Declinaison/ajouter_variante.html.twig', ['attribut' => $attribut'valeurs' => $valeurs'article' => $article]);
  546.         }
  547.         if (count($valeurs) > 0) {
  548.             foreach ($valeurs as $v) {
  549.                 $options_valeurs .= "<option data-attribut='".$attribut->getId()."' value='".$v->getId()."' >".$v->getLibelle()."</option>";
  550.             }
  551.         }
  552.         $headers = [
  553.             'Content-Type'                 => 'application/json',
  554.             'Access-Control-Allow-Origin'  => '*',
  555.             'Access-Control-Allow-Methods' => 'POST',
  556.         ];
  557.         //return new JsonResponse(array('valeurs' => $options_valeurs), 200, $headers);
  558.         return new JsonResponse(['rendu' => $rendu], 200$headers);
  559.     }
  560.     /**
  561.      * @Route("/declinaison/detacher/{id}", name="dtc_declinaison_detacher_article")
  562.      */
  563.     public function detacherArticleAction(Request $requestArticle $articleEntityManagerInterface $emTranslatorInterface $translatorValidatorInterface $validator)
  564.     {
  565.         $titre_modal $translator->trans("Demande de confirmation");
  566.         $get         $request->query->all();
  567.         $form        $this->createForm(DetacherArticleDeclinaisonType::class, $article);
  568.         $errors      "";
  569.         $form->handleRequest($request);
  570.         if ($form->isSubmitted()) {
  571.             if ($form->isValid()) {
  572.                 $article->setArticleDeclinaisonParent(null);
  573.                 $em->persist($article);
  574.                 $em->flush();
  575.                 $url "";
  576.                 if (array_key_exists('table'$get) && $get["table"] != "") {
  577.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url'type' => 'recharger_datatable''id_datatable' => $get["table"]],
  578.                                             200,
  579.                                             ['Content-Type' => 'application/json']);
  580.                 } else {
  581.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url]);
  582.                 }
  583.             } else {
  584.                 $errors $validator->validate($article);
  585.                 $rendu  $this->renderView('Articles/Declinaison/detacher.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
  586.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  587.             }
  588.         }
  589.         $rendu $this->renderView('Articles/Declinaison/detacher.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
  590.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  591.     }
  592.     public function get_combinations($arrays)
  593.     {
  594.         $result = [[]];
  595.         foreach ($arrays as $property => $property_values) {
  596.             $tmp = [];
  597.             foreach ($result as $result_item) {
  598.                 foreach ($property_values as $property_value) {
  599.                     $tmp[] = array_merge($result_item, [$property => $property_value]);
  600.                 }
  601.             }
  602.             $result $tmp;
  603.         }
  604.         return $result;
  605.     }
  606.     public function declinaisonExiste($parent$caracteristiques = [], EntityManagerInterface $em)
  607.     {
  608.         $repo_articles     $em->getRepository(Article::class);
  609.         $repo_declinaisons $em->getRepository(Declinaison::class);
  610.         $totalCarac        count($caracteristiques);
  611.         $tab_carac_test    = [];
  612.         if (count($caracteristiques) > 0) {
  613.             $tab_carac_test = [];
  614.             foreach ($caracteristiques as $valeur) {
  615.                 $tab_carac_test[] = $valeur["id"];
  616.             }
  617.             if (count($tab_carac_test) > 0) {
  618.                 $articles_enfants $repo_articles->findBy(["articleDeclinaisonParent" => $parent]);
  619.                 if (count($articles_enfants) > 0) {
  620.                     foreach ($articles_enfants as $ae) {
  621.                         $tab_carac_test = [];
  622.                         foreach ($caracteristiques as $valeur) {
  623.                             $tab_carac_test[] = $valeur["id"];
  624.                         }
  625.                         $declinaisons $repo_declinaisons->findBy(["article" => $ae]);
  626.                         if (count($declinaisons) == $totalCarac) {
  627.                             foreach ($declinaisons as $d) {
  628.                                 if (is_object($d->getValeurAttributArticle()) && in_array($d->getValeurAttributArticle()->getId(), $tab_carac_test)) {
  629.                                     if (($key array_search($d->getValeurAttributArticle()->getId(), $tab_carac_test)) !== false) {
  630.                                         unset($tab_carac_test[$key]);
  631.                                     }
  632.                                 }
  633.                             }
  634.                         }
  635.                         if (count($tab_carac_test) == 0) {
  636.                             return true;
  637.                         }
  638.                     }
  639.                 }
  640.             }
  641.         }
  642.         return false;
  643.     }
  644.     /**
  645.      * @Route("/declinaison/generer/{id}", name="dtc_declinaison_article_generer")
  646.      */
  647.     public function genererArticleAction(Request            $requestArticle $articleEntityManagerInterface $emArticleService $articleServiceTranslatorInterface $translator,
  648.                                          ValidatorInterface $validator
  649.     ) {
  650.         $get                   $request->query->all();
  651.         $titre_modal           $translator->trans("Générer les déclinaisons");
  652.         $user                  $this->getUser();
  653.         $form                  $this->createForm(RattacherArticleDeclinaisonType::class, $article);
  654.         $errors                "";
  655.         $articles_declinaisons = [];
  656.         $repo_parametrage $em->getRepository(Parametrage::class);
  657.         $parametrage      $repo_parametrage->find(1);
  658.         $repo_declinaisons $em->getRepository(Declinaison::class);
  659.         $declinaisons      $repo_declinaisons->findBy(["article" => $article]);
  660.         $tabTemp = [];
  661.         $tabCle  = [];
  662.         $tableau_valeurs                 = [];
  663.         $tableau_valeurs_id              = [];
  664.         $tableau_caracteritiques         = [];
  665.         $tableau_caracteritiques_libelle = [];
  666.         //echo count($declinaisons)."<br/>";
  667.         if (count($declinaisons) > 0) {
  668.             foreach ($declinaisons as $d) {
  669.                 $tableau_caracteritiques[$d->getattributArticle()->getId()]  = $d->getattributArticle()->getLibelle();
  670.                 $tableau_valeurs_id[$d->getValeurAttributArticle()->getId()] = $d->getValeurAttributArticle()->getLibelle();
  671.                 if ( ! array_key_exists($d->getattributArticle()->getId(), $tableau_valeurs)) {
  672.                     $tableau_valeurs[$d->getattributArticle()->getId()] = [$d->getValeurAttributArticle()->getId()];
  673.                 } else {
  674.                     $tableau_valeurs[$d->getattributArticle()->getId()][] = $d->getValeurAttributArticle()->getId();
  675.                 }
  676.                 if ( ! array_key_exists($d->getattributArticle()->getId(), $tableau_caracteritiques_libelle)) {
  677.                     $tableau_caracteritiques_libelle[$d->getattributArticle()->getId()] = [
  678.                         "libelle" => $d->getattributArticle()->getLibelle(),
  679.                         "valeurs" => [$d->getValeurAttributArticle()->getId()],
  680.                     ];
  681.                 } else {
  682.                     //$tableau_caracteritiques_libelle[$d->getattributArticle()->getId()][]=$d->getattributArticle()->getLibelle();
  683.                     $tableau_caracteritiques_libelle[$d->getattributArticle()->getId()]["valeurs"][] = $d->getValeurAttributArticle()->getId();
  684.                 }
  685.             }
  686.         }
  687.         //print_r($tableau_valeurs);
  688.         //echo "<hr/><br/>";
  689.         $combinations = [];
  690.         $combinations $this->get_combinations($tableau_valeurs);
  691.         //print_r($combinations);
  692.         //exit;
  693.         $regles        = [];
  694.         $regle_libelle "";
  695.         if (is_object($parametrage)) {
  696.             $regles $parametrage->getReglesDeclinaisonUnserialize();
  697.             if (is_array($regles)) {
  698.                 if (array_key_exists('diffusion_libelle'$regles) && $regles["diffusion_libelle"] != "") {
  699.                     $regle_libelle $regles["diffusion_libelle"];
  700.                 }
  701.             }
  702.         }
  703.         $compteur_libelle   1;
  704.         $compteur_reference 1;
  705.         $combinations_final = [];
  706.         if (count($combinations) > 0) {
  707.             for ($i 0$i count($combinations); $i++) {
  708.                 $libelle                $article->getLibelle();
  709.                 $libelle_valeur         "";
  710.                 $libelle_libelle_valeur "";
  711.                 $caracteritiques        = [];
  712.                 $temp                   = ["reference" => """libelle" => """caracteristiques" => []];
  713.                 foreach ($combinations[$i] as $v) {
  714.                     //print_r($combinations[$i]);
  715.                     //print_r($tableau_caracteritiques);
  716.                     $libelle_valeur .= $tableau_valeurs_id[$v]." ";
  717.                     if (count($tableau_caracteritiques_libelle) > 0) {
  718.                         foreach ($tableau_caracteritiques_libelle as $key => $valeur) {
  719.                             //print_r($valeur);
  720.                             //echo "<br/>";
  721.                             if (in_array(trim($v), $valeur["valeurs"])) {
  722.                                 //echo "<div><b>".$valeur["libelle"]."</b></div>";
  723.                                 $chaine                 $valeur["libelle"];
  724.                                 $libelle_libelle_valeur .= $valeur["libelle"]." ";
  725.                             }
  726.                         }
  727.                     }
  728.                     $libelle_libelle_valeur .= $tableau_valeurs_id[$v]." ";
  729.                     $caracteritiques[] = ["id" => $v"libelle" => $tableau_valeurs_id[$v]];
  730.                     //echo "<br/>".$tableau_valeurs_id[$v]." (".$v.")<br/><br/>";
  731.                 }
  732.                 //echo "<br/>libelle(".$libelle_libelle_valeur.")<br/><br/>";
  733.                 switch ($regle_libelle) {
  734.                     case 1:
  735.                         //Copier le libellé de l'article principal du groupe
  736.                         $libelle $article->getLibelle();
  737.                         break;
  738.                     case 2:
  739.                         //Ajout de la valeur des critères de déclinaison
  740.                         $libelle $article->getLibelle()." ".$libelle_valeur;
  741.                         break;
  742.                     case 3:
  743.                         //Ajout du libellé et de la valeur des critères de déclinaison
  744.                         $libelle $article->getLibelle()." ".$libelle_libelle_valeur;
  745.                         break;
  746.                     case 4:
  747.                         //Libellé de l'article parent puis nombre incrémenté
  748.                         $libelle $article->getLibelle()."-".$compteur_libelle;
  749.                         break;
  750.                 }
  751.                 $compteur_libelle++;
  752.                 $reference_libre false;
  753.                 while ( ! $reference_libre) {
  754.                     $reference_construit $article->getReference()."-".$compteur_reference;
  755.                     if ( ! $articleService->testReferenceArticleExiste($reference_construit)) {
  756.                         $reference_libre true;
  757.                         $compteur_reference++;
  758.                     } else {
  759.                         $compteur_reference++;
  760.                     }
  761.                 }
  762.                 $temp["libelle"]          = trim($libelle);
  763.                 $temp["reference"]        = trim($reference_construit);
  764.                 $temp["caracteristiques"] = $caracteritiques;
  765.                 if ( ! $this->declinaisonExiste($article$caracteritiques$em)) {
  766.                     $combinations_final[] = $temp;
  767.                 }
  768.                 //echo "<hr/>";
  769.             }
  770.         }
  771.         //exit;
  772.         $form->handleRequest($request);
  773.         if ($form->isSubmitted()) {
  774.             $auMoinsUnArticle false;
  775.             $post             $request->request->all();
  776.             //print_r($post);
  777.             //exit;
  778.             if (array_key_exists('choix'$post) && count($post["choix"]) > 0) {
  779.                 $auMoinsUnArticle true;
  780.             }
  781.             if ($form->isValid() and $auMoinsUnArticle) {
  782.                 $url "";
  783.                 if (array_key_exists('choix'$post) && count($post["choix"]) > 0) {
  784.                     for ($i 0$i count($post["choix"]); $i++) {
  785.                         $carac_declinaison = [];
  786.                         $cle               $post["choix"][$i];
  787.                         if (count($post["caracteritiques"][$cle]) > 0) {
  788.                             foreach ($post["caracteritiques"][$cle] as $valeur) {
  789.                                 $carac_declinaison[] = $valeur;
  790.                             }
  791.                         }
  792.                         $tab_declinaison                    = [];
  793.                         $tab_declinaison["libelle"]         = $post["libelle"][$cle];
  794.                         $tab_declinaison["reference"]       = $post["reference"][$cle];
  795.                         $tab_declinaison["caracteritiques"] = $carac_declinaison;
  796.                         $articleService->creerDeclinaison($tab_declinaison$post$article);
  797.                     }
  798.                 }
  799.                 $rendu '';
  800.                 if ( ! empty($get["table"])) {
  801.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url'type' => 'recharger_datatable''id_datatable' => $get["table"]],
  802.                                             200,
  803.                                             ['Content-Type' => 'application/json']);
  804.                 } else {
  805.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url]);
  806.                 }
  807.             } else {
  808.                 if ( ! $auMoinsUnArticle) {
  809.                     $errorsSup[] = 'Merci de cocher au moins une ligne';
  810.                 }
  811.                 $errors $validator->validate($article);
  812.                 $rendu  $this->renderView(
  813.                     'Articles/Declinaison/generer.html.twig',
  814.                     [
  815.                         'form'               => $form->createView(),
  816.                         'errors'             => $errors,
  817.                         'article'            => $article,
  818.                         'errorsSup'          => $errorsSup,
  819.                         'combinations_final' => $combinations_final,
  820.                         'carac'              => $tableau_caracteritiques,
  821.                     ]
  822.                 );
  823.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  824.             }
  825.         }
  826.         $rendu $this->renderView(
  827.             'Articles/Declinaison/generer.html.twig',
  828.             [
  829.                 'form'               => $form->createView(),
  830.                 'errors'             => $errors,
  831.                 'article'            => $article,
  832.                 'combinations_final' => $combinations_final,
  833.                 'carac'              => $tableau_caracteritiques,
  834.             ]
  835.         );
  836.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  837.     }
  838.     /**
  839.      * @Route("", name="")
  840.      */
  841.     public function listerImageAction(Request $request$id "0"$type "a"$enfant ""EntityManagerInterface $emDatatable $datatableTranslatorInterface $translator)
  842.     {
  843.         $tableau_class_cellule = [];
  844.         $modal     $request->query->get('modal');
  845.         $articleId $request->query->get('id');
  846.         $qte       $request->query->get('qte');
  847.         $repo_objet $em->getRepository(Article::class);
  848.         $attributs $em->getRepository(AttributArticle::class)->findAll();
  849.         $objet $repo_objet->find($id);
  850.         if ($articleId != '') {
  851.             $article $repo_objet->find($articleId);
  852.             if ($modal == && is_object($article)) {
  853.                 $titre_modal $translator->trans('Déclinaison');
  854.                 $this->datatableArticleImages($article$type$request$datatable$em$translator);
  855.                 $rendu $this->renderView('Articles/Declinaison/lister.html.twig', ['tableauClassColonne' => $tableau_class_cellule"id" => $articleId"type" => $type'qte' => $qte]
  856.                 );
  857.                 //$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$id,'type'=>$type,'objet'=>$objet));
  858.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  859.             }
  860.         }
  861.         if (is_object($objet)) {
  862.             $tableau_class_cellule   = [];
  863.             $tableau_class_cellule[] = ["searchable" => true"className" => "visible_export colonne_id ""targets" => [0], "visible" => true"orderable" => false];
  864.             $this->datatableArticleImages($objet$type$request$datatable$em$translator);
  865.             return $this->render(
  866.                 'Articles/Declinaison/lister_images.html.twig',
  867.                 ['tableauClassColonne' => $tableau_class_cellule"id" => $id"type" => $type"attributs" => $attributs"article" => $objet"enfant" => $enfant]
  868.             );
  869.         }
  870.     }
  871.     /**
  872.      * set datatable configs
  873.      *
  874.      * @return \App\Library\Datatable\Util\Datatable
  875.      */
  876.     private function datatableArticleImages($objet$type ""Request $requestDatatable $datatableEntityManagerInterface $emTranslatorInterface $translator)
  877.     {
  878.         $param $request->query->all();
  879.         $conn  $em->getConnection();
  880.         $conn->getConfiguration()->setSQLLogger(null);
  881.         $qb $em->createQueryBuilder();
  882.         $qb->select(
  883.             "
  884.                     x.id as x_id,
  885.                     x.archive as x_archive,
  886.                     x.libelle as x_libelle,
  887.                     x.reference as x_reference,
  888.                     x.descriptionCourte as x_descriptionCourte,
  889.                     x.prixVente as x_prixVente,
  890.                     x.tauxMarge as x_tauxMarge,
  891.                     x.cpump as x_cpump,
  892.                     x.stock as x_stock,
  893.                     x.statut as x_statut,
  894.                     m.libelle as m_libelle,
  895.                     m.id as m_id,
  896.                     t.libelle as t_libelle,
  897.                     t.id as t_id,
  898.                     r.id as r_id,
  899.                     r.tauxDefaut as r_tauxDefaut
  900.                     "
  901.         )
  902.            ->orderBy('x.id''DESC')
  903.            ->from(Article::class, "x")
  904.            ->leftJoin('x.marque''m')
  905.            ->leftJoin('x.type''t')
  906.            ->leftJoin('x.regleTaxe''r'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);;
  907.         $where "(x.archive = 0 or x.archive is null)";
  908.         $where "";
  909.         //$qb->where('x.temporaire is null and (x.archive = 0 or x.archive is null)'.$where);
  910.         //$qb->where('x.articleDeclinaisonParent = :articleDeclinaisonParent AND x.temporaire is null AND '.$where);
  911.         $qb->where('x.articleDeclinaisonParent = :articleDeclinaisonParent AND x.temporaire is null');
  912.         $parametres['articleDeclinaisonParent'] = $objet;
  913.         //echo $where;
  914.         if (count($parametres) > 0) {
  915.             $qb->setParameters($parametres);
  916.         }
  917.         //$type_jointure = 'x.'.$type;
  918.         $datatable->setDatatableId('dta-declinaisons-images')
  919.             //->setEntity("DTCArticlesBundle:Article", "x")
  920.                   ->setFields(
  921.                 [
  922.                     $translator->trans("Référence") => 'x.reference',
  923.                     $translator->trans("Libellé")   => 'x.libelle',
  924.                     $translator->trans("Images")    => 'x.id',
  925.                     $translator->trans("Actions")   => 'x.id',
  926.                     "_identifier_"                  => 'x.id',
  927.                 ]
  928.             )
  929.             //->addJoin('x.pays', 'p', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  930.             //->addJoin('f.devise', 'd', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  931.             //->addJoin('x.uniteMesure', 'u', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  932.             /*->setWhere(
  933.                     $type_jointure.' = :objet',
  934.                     array('objet' => $objet)
  935.                )
  936.               */
  937.                   ->setWhere(
  938.                 'x.articleDeclinaisonParent = :objet',
  939.                 ['objet' => $objet]
  940.             )
  941.                   ->setRenderers(
  942.                       [
  943.                           => [
  944.                               'view'   => 'FO/DataTable/article_id.html.twig',
  945.                               'params' => [
  946.                                   'edit_route' => 'dtc_article_modifier',
  947.                               ],
  948.                           ],
  949.                           => [
  950.                               'view'   => 'FO/DataTable/article_id.html.twig',
  951.                               'params' => [
  952.                                   'edit_route' => 'dtc_article_modifier',
  953.                               ],
  954.                           ],
  955.                           => [
  956.                               'view'   => 'FO/DataTable/images_declinaisons.html.twig',
  957.                               'params' => [
  958.                                   'edit_route' => 'dtc_article_modifier',
  959.                               ],
  960.                           ],
  961.                           => [
  962.                               'view'   => 'FO/DataTable/article_actions.html.twig',
  963.                               'params' => [
  964.                                   'edit_route' => 'dtc_article_modifier',
  965.                                   'objet'      => Article::class,
  966.                                   'table'      => "dta-declinaisons-images",
  967.                               ],
  968.                           ],
  969.                       ]
  970.                   )
  971.                   ->setOrder("x.id""desc")
  972.                   ->setSearch(true)
  973.                   ->setMultiple(
  974.                       [
  975.                           'regles' => [
  976.                               'title' => 'Ajouter une image',
  977.                               'route' => 'dtc_declinaison_ajouter_image_multiple' // path to multiple delete route
  978.                           ],
  979.                       ]
  980.                   );//->setSearchFields(array(1,2))
  981.         ;
  982.         $datatable->getQueryBuilder()->setDoctrineQueryBuilder($qb);
  983.         return $datatable;
  984.     }
  985.     /**
  986.      * @Route("/declinaison/grid-images/{id}/{type}", name="dtc_declinaison_article_liste_image_grid")
  987.      */
  988.     public function gridImagesAction($id ""$type ""Request $requestDatatable $datatableEntityManagerInterface $emTranslatorInterface $translator)
  989.     {
  990.         $repo_objet $em->getRepository(Article::class);
  991.         $objet $repo_objet->find($id);
  992.         if (is_object($objet)) {
  993.             return $this->datatableArticleImages($objet$type,  $request,  $datatable,  $em,  $translator)->execute();
  994.         }
  995.     }
  996. }