src/Controller/UtilitairesController.php line 350

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\ClassTheatre\TheatreController;
  4. use App\ClassTheatre\Xhr\qqFileUploader;
  5. use App\Service\Functions;
  6. use App\Service\UploadUtils;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Proxies\__CG__\TheatreCore\Entity\Files;
  9. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  12. use Symfony\Contracts\Translation\TranslatorInterface;
  13. use TheatreCore\Classes\Images\Images;
  14. use TheatreCore\Entity\Bannieres;
  15. use TheatreCore\Entity\Extranetusers;
  16. class UtilitairesController extends TheatreController
  17. {
  18.     public function __construct(
  19.         EntityManagerInterface $em,
  20.         ParameterBagInterface $parameterBag,
  21.         TranslatorInterface $translator,
  22.         TokenStorageInterface $tokenStorage,
  23.         Functions $func
  24.     )
  25.     {
  26.         parent::__construct($translator$tokenStorage);
  27.         $this->em $em;
  28.         $this->parameterBag $parameterBag;
  29.         $this->func $func;
  30.     }
  31.     /**
  32.      * @Route("/utilitaires/upload", name="utilitaires_upload")
  33.      */
  34.     public function upload(Images $images)
  35.     {
  36.         // dossier preview de l'image uploiadée
  37.         $abs_directory  $_ENV['PATH_DIRECTORYUPLOAD'].'preview/';
  38.         // on doit-être authentifié
  39.         if(!$this->getUser() instanceof Extranetusers) {
  40.             echo json_encode(array('error' => 'Vous n\'êtes pas connecté'));
  41.             exit;
  42.         }
  43.         // liste des extensions autorisées
  44.         $allowedExtensions = array('jpg','gif','tif','jpeg','png');
  45.         // taille maximale du fichier
  46.         $sizeLimit 1024 1024;
  47.         // on upload dans un répertoire temporaire genre preview
  48.         $uploader = new qqFileUploader($allowedExtensions$sizeLimit);
  49.         $result $uploader->handleUpload($abs_directory);
  50.         if(!empty($result['success'])) {
  51.             // tester la taille
  52.             if(!empty($_GET['minsize']) && is_array($_GET['minsize'])) {
  53.                 $minsize_width = (int)$_GET['minsize'][0];
  54.                 $minsize_height = (int)$_GET['minsize'][1];
  55.             } else {
  56.                 echo json_encode(array('error' => 'La taille minimale du fichier n\'est pas précisée'));
  57.                 exit;
  58.             }
  59.             $result['data']['fichier_upload'] = $uploader->getFileName();
  60.             // tester la taille
  61.             $imginfos = @getimagesize($abs_directory.$result['data']['fichier_upload']);
  62.             if(!empty($imginfos[0]) && !empty($imginfos[1])) {
  63.                 $width = (int)$imginfos[0];
  64.                 $height = (int)$imginfos[1];
  65.                 if($width<$minsize_width || $height<$minsize_height) {
  66.                     echo json_encode(array('error' => 'Votre image est trop petite par rapport aux dimensions souhaitées'));
  67.                     exit;
  68.                 } else {
  69.                     // on réduira sur le côté le plus petit
  70.                     if($minsize_width>$minsize_height) {
  71.                         $normal_size $minsize_height;
  72.                     } else {
  73.                         $normal_size $minsize_width;
  74.                     }
  75.                 }
  76.             } else {
  77.                 echo json_encode(array('error' => 'Impossible de récupérer taille fichier chargé'));
  78.                 exit;
  79.             }
  80.             /*echo 'Largeur '.$width.' / Hauteur '.$height;
  81.             echo '/ Souhaité Largeur '.$minsize_width.' / Hauteur '.$minsize_height;
  82.             echo '/ resize : '.$normal_size;
  83.             exit;*/
  84.             // trouver les infos sur le nom du fichier
  85.             $pathinfo pathinfo($result['data']['fichier_upload']);
  86.             $result['data']['fichier_id'] = uniqid();
  87.             $result['data']['fichier_extension'] = $pathinfo['extension'];
  88.             $result['data']['fichier_src'] = $result['data']['fichier_id'].'_src.'.$pathinfo['extension'];
  89.             // déplacer le fichier uploadé
  90.             rename($abs_directory.$result['data']['fichier_upload'],$abs_directory.$result['data']['fichier_src']);
  91.             // la vignette
  92.             $result['data']['fichier_thumb'] = str_replace('_src','_thumb',$result['data']['fichier_src']);
  93.             if($images->setThumbnail($abs_directory.$result['data']['fichier_src'],$abs_directory.$result['data']['fichier_thumb'],100,'thumb')) {
  94.                 $result['data']['thumb'] = $_ENV['URL_DIRECTORYUPLOAD'].'preview/'.$result['data']['fichier_thumb'];
  95.                 $result['data']['image'] = true;
  96.             } else {
  97.                 echo json_encode(array('error' => 'Il y a eu un problème pendant la création de la vignette de votre image'));
  98.                 exit;
  99.             }
  100.             // le fichier classique
  101.             $result['data']['fichier_normal'] = str_replace('_src','_normal',$result['data']['fichier_src']);
  102.             if($images->setThumbnail($abs_directory.$result['data']['fichier_src'],$abs_directory.$result['data']['fichier_normal'],array($minsize_width,$minsize_height),'fill')) {
  103.                 // le fichier classique réduit
  104.                 $result['data']['normal'] = $_ENV['URL_DIRECTORYUPLOAD'].'preview/'.$result['data']['fichier_normal'];
  105.                 // récupérer la taille de l'image réduite
  106.                 $imginfos = @getimagesize($abs_directory.$result['data']['fichier_normal']);
  107.                 if(!empty($imginfos[0]) && !empty($imginfos[1])) {
  108.                     $width = (int)$imginfos[0];
  109.                     $height = (int)$imginfos[1];
  110.                     if($width<$minsize_width || $height<$minsize_height) {
  111.                         /*echo 'Largeur '.$width.' / Hauteur '.$height;
  112.                         echo '/ Souhaité Largeur '.$minsize_width.' / Hauteur '.$minsize_height;
  113.                         echo '/ resize : '.$normal_size;
  114.                         exit;*/
  115.                         echo json_encode(array('error' => 'Votre image est trop petite'));
  116.                         exit;
  117.                     }
  118.                     // le format souhaité pour l'image
  119.                     if(!empty($_GET['format'])) {
  120.                         // calcul du carré en fonction du côté le plus petit
  121.                         if($_GET['format']=='square') {
  122.                             if($width>$height) {
  123.                                 $carre_size $height;
  124.                             } else {
  125.                                 $carre_size $width;
  126.                             }
  127.                             $result['data']['select_width'] = $carre_size;
  128.                             $result['data']['select_height'] = $carre_size;
  129.                         } elseif(is_array($_GET['format'])) {
  130.                             $result['data']['select_width'] = 980;
  131.                             $result['data']['select_height'] = 150;
  132.                         }
  133.                     } else {
  134.                         $result['data']['select_width'] = $minsize_width;
  135.                         $result['data']['select_height'] = $minsize_height;
  136.                     }
  137.                 }
  138.                 $result['data']['image'] = true;
  139.             } else {
  140.                 echo json_encode(array('error' => 'Il y a eu un problème pendant la récupération de votre image'));
  141.                 exit;
  142.             }
  143.         }
  144.         // encoder le HTML dans la réponse JSON
  145.         echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
  146.         $ajaxreponse true;
  147.         return $this->render('utilitaires/upload.html.twig');
  148.     }
  149.     /**
  150.      *
  151.      * uploader d'un fichier en attente dans le dossier preview
  152.      *
  153.      * @Route("/utilitaires/chargement-objet/object/{p_object}/idobject/{p_idobject}/idclassification/{p_idclassifcation}/", name="utilitaires_chargement_object_idobject_idclassification")
  154.      *
  155.      */
  156.     public function action_chargement_objet($p_object null$p_idobject null$p_idclassifcation nullUploadUtils $edit_utilsImages $images)
  157.     {
  158.         $params['object'] = $p_object;
  159.         $params['idobject'] = $p_idobject;
  160.         $params['idclassification'] = $p_idclassifcation;
  161.         // dossier preview
  162.         $abs_directory  $_ENV['PATH_DIRECTORYUPLOAD'].'preview/';
  163.         // on doit-être authentifié
  164.         if(!$this->getUser() instanceof Extranetusers) {
  165.             echo json_encode(array('error' => 'Vous n\'êtes pas connecté'));
  166.             exit;
  167.         }
  168.         // image ?
  169.         if(empty($_GET['img'])) {
  170.             echo json_encode(array('error' => 'L\identifiant de l\'image est introuvable'));
  171.             exit;
  172.         } else {
  173.             $img filter_var($_GET['img'], FILTER_SANITIZE_STRING);
  174.         }
  175.         // checker si le fichier existe
  176.         if(!file_exists($abs_directory.$img)) {
  177.             echo json_encode(array('error' => 'L\'image est introuvable'));
  178.             exit;
  179.         }
  180.         // paramètres obligatoire : object, idobject, classification
  181.         if(empty($params['object'])
  182.             || empty($params['idobject']) || !$this->func->my_is_int($params['idobject'])
  183.             || empty($params['idclassification']) || !$this->func->my_is_int($params['idclassification'])) {
  184.             echo json_encode(array('error' => 'Mauvais paramètres'));
  185.             exit;
  186.         }
  187.         // voir si le contenu associé existe
  188.         $obj $this->em->getRepository('TheatreCore\Entity\\'.ucfirst($params['object']));
  189.         $infos_object $obj->getInfosObject($params['idobject']);
  190.         if(empty($infos_object)) {
  191.             echo json_encode(array('error' => 'Mauvais objet'));
  192.             exit;
  193.         }
  194.         // on vérifie les droits d'uploader de la personne
  195.         $params_edit = array(
  196.             'idobject' => $params['idobject'],
  197.             'object' => $params['object'],
  198.         );
  199.         $edit_utils->load($this->context,$params_edit);
  200.         // les droits
  201.         $object_rights $edit_utils->checkObjectRights();
  202.         // checker si la personne connectée à les droits sur cette fiche
  203.         if(empty($object_rights['update'])) {
  204.             echo json_encode(array('error' => 'Vous n\'avez pas accès à cette fonctionnalité'));
  205.             exit;
  206.         }
  207.         // champs pour fichier
  208.         $possible_fields = array(
  209.             'title',
  210.             'description',
  211.             'copyright',
  212.             'language',
  213.             'publish',
  214.             'valid',
  215.         );
  216.         foreach($possible_fields as $f) {
  217.             if(!empty($_GET[$f])) {
  218.                 $filedata[$f] = filter_var($_GET[$f], FILTER_SANITIZE_STRING);
  219.             }
  220.         }
  221.         // language fr par défaut
  222.         if(empty($filedata['language'])) {
  223.             $filedata['language'] = 'fr';
  224.         }
  225.         // data pour le fichier
  226.         $filedata['range'] = 'NULL';
  227.         $filedata['publish'] = 1;
  228.         $filedata['idextranetuser'] = $this->getUser();
  229.         // si on a des coordonnées, il faut découper l'image
  230.         if(!empty($_GET['imgcoord'])) {
  231.             $imgcoord $_GET['imgcoord'];
  232.             $crop_values = array(
  233.                 'width' => $imgcoord['w'],
  234.                 'height' => $imgcoord['h'],
  235.                 'x' => $imgcoord['x'],
  236.                 'y' => $imgcoord['y'],
  237.                 'strict' => true,
  238.             );
  239.             if($images->setThumbnail($abs_directory.$img// source
  240.                 $abs_directory.$img// destination
  241.                 $imgcoord['w'], // taille
  242.                 'crop'// découpage
  243.                 null// largeur du crop
  244.                 null// hauteur du crop
  245.                 85// qualité
  246.                 null// composition avec une autre image
  247.                 $crop_values // valeur du crop
  248.             )) {
  249.             }
  250.         }
  251.         // on redimensionne le fichier puis on l'enregistre
  252.         $files $this->em->getRepository(Files::class);
  253.         $idfile $files->uploadObjectFile(array('file' => $abs_directory.$img), $params['idclassification'], $params['object'], $params['idobject'], $filedata);
  254.         // on renvoi l'infos sur le nouveau fichier et une vignette
  255.         if(!empty($idfile) && $idfile) {
  256.             // si la classification est unique, mettre hors ligne ou supprimer l'existant TODO delete
  257.             if(!empty($_GET['unique'])) {
  258.                 // on vérifie s'il existe un fichier
  259.                 $actual_files $files->getObjectFiles($params['idobject'],$params['object'],$params['idclassification']);
  260.                 // s'il existe on ligne et validé, on le supprime ou on le mets hors ligne
  261.                 if(!empty($actual_files)) {
  262.                     foreach($actual_files as $actual) {
  263.                         if($actual['idfile']!=$idfile) {
  264.                             $files->setUpdateFields(array('publish' => 0));
  265.                             $files->setData($actual['idfile']);
  266.                         }
  267.                     }
  268.                     $files->deleteVignettesObject($params['object'],$params['idobject'],'class_pp');
  269.                 }
  270.             }
  271.             // récupérer les infos
  272.             $infos $files->getInfosFile($idfile);
  273.             $result['data'] = $infos;
  274.         }
  275.         // encoder le HTML dans la réponse JSON
  276.         echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
  277.         exit;
  278.     }
  279.     /**
  280.      * @Route("/utilitaires/banniere", name="utilitaires_banniere")
  281.      */
  282.     public function banniere()
  283.     {
  284.         $repo $this->em->getRepository(Bannieres::class);
  285.         $banniere $repo->getCurrentBanniere();
  286.         if(
  287.             ! empty($banniere)
  288.             && file_exists($this->parameterBag->get('app.dir.pathImg') . 'bannieres/' $banniere['imgfile'])
  289.         ) {
  290.             $banniere['img'] = $this->parameterBag->get('app.dir.urlImg') . 'bannieres/' $banniere['imgfile'];
  291.         } else {
  292.             $banniere false;
  293.         }
  294.         $this->view->banniere $banniere;
  295.         return $this->view('utilitaires/banniere.html.twig', [
  296.             'banniereTop' => $banniere
  297.         ]);
  298.     }
  299.     /**
  300.      * @Route("/utilitaires/recherche-ajax/object/{object}", name="utilitaires_recherche_ajax_object")
  301.      */
  302.     public function action_recherche_ajax($object null)
  303.     {
  304.         if(!empty($object)) {
  305.             $object filter_var($objectFILTER_SANITIZE_STRING);
  306.         } else {
  307.             echo json_encode(array('Pas d\'objet précisé'));
  308.             exit;
  309.         }
  310.         // pas de tidy
  311.         $ajaxreponse true;
  312.         $obj $this->em->getRepository('TheatreCore\Entity\\'.$object);
  313.         $keywords filter_var($_GET['term'], FILTER_SANITIZE_STRINGFILTER_FLAG_NO_ENCODE_QUOTES);
  314.         if(strlen($keywords)<4) {
  315.             exit;
  316.         }
  317.         $results $obj->getListSearch(null,null,$keywords);
  318.         if(!empty($results)) {
  319.             foreach($results as $k=>$v) {
  320.                 $r[] = array(
  321.                     'id' => $k,
  322.                     'label' => $v,
  323.                     'value' => $v,
  324.                 );
  325.             }
  326.             echo json_encode($r);
  327.             exit;
  328.         }
  329.         return $this->render('utilitaires/recherche-ajax.html.twig');
  330.     }
  331. }