<?php
namespace App\Controller;
use App\ClassTheatre\TheatreController;
use App\ClassTheatre\Xhr\qqFileUploader;
use App\Service\Functions;
use App\Service\UploadUtils;
use Doctrine\ORM\EntityManagerInterface;
use Proxies\__CG__\TheatreCore\Entity\Files;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use TheatreCore\Classes\Images\Images;
use TheatreCore\Entity\Bannieres;
use TheatreCore\Entity\Extranetusers;
class UtilitairesController extends TheatreController
{
public function __construct(
EntityManagerInterface $em,
ParameterBagInterface $parameterBag,
TranslatorInterface $translator,
TokenStorageInterface $tokenStorage,
Functions $func
)
{
parent::__construct($translator, $tokenStorage);
$this->em = $em;
$this->parameterBag = $parameterBag;
$this->func = $func;
}
/**
* @Route("/utilitaires/upload", name="utilitaires_upload")
*/
public function upload(Images $images)
{
// dossier preview de l'image uploiadée
$abs_directory = $_ENV['PATH_DIRECTORYUPLOAD'].'preview/';
// on doit-être authentifié
if(!$this->getUser() instanceof Extranetusers) {
echo json_encode(array('error' => 'Vous n\'êtes pas connecté'));
exit;
}
// liste des extensions autorisées
$allowedExtensions = array('jpg','gif','tif','jpeg','png');
// taille maximale du fichier
$sizeLimit = 6 * 1024 * 1024;
// on upload dans un répertoire temporaire genre preview
$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
$result = $uploader->handleUpload($abs_directory);
if(!empty($result['success'])) {
// tester la taille
if(!empty($_GET['minsize']) && is_array($_GET['minsize'])) {
$minsize_width = (int)$_GET['minsize'][0];
$minsize_height = (int)$_GET['minsize'][1];
} else {
echo json_encode(array('error' => 'La taille minimale du fichier n\'est pas précisée'));
exit;
}
$result['data']['fichier_upload'] = $uploader->getFileName();
// tester la taille
$imginfos = @getimagesize($abs_directory.$result['data']['fichier_upload']);
if(!empty($imginfos[0]) && !empty($imginfos[1])) {
$width = (int)$imginfos[0];
$height = (int)$imginfos[1];
if($width<$minsize_width || $height<$minsize_height) {
echo json_encode(array('error' => 'Votre image est trop petite par rapport aux dimensions souhaitées'));
exit;
} else {
// on réduira sur le côté le plus petit
if($minsize_width>$minsize_height) {
$normal_size = $minsize_height;
} else {
$normal_size = $minsize_width;
}
}
} else {
echo json_encode(array('error' => 'Impossible de récupérer taille fichier chargé'));
exit;
}
/*echo 'Largeur '.$width.' / Hauteur '.$height;
echo '/ Souhaité Largeur '.$minsize_width.' / Hauteur '.$minsize_height;
echo '/ resize : '.$normal_size;
exit;*/
// trouver les infos sur le nom du fichier
$pathinfo = pathinfo($result['data']['fichier_upload']);
$result['data']['fichier_id'] = uniqid();
$result['data']['fichier_extension'] = $pathinfo['extension'];
$result['data']['fichier_src'] = $result['data']['fichier_id'].'_src.'.$pathinfo['extension'];
// déplacer le fichier uploadé
rename($abs_directory.$result['data']['fichier_upload'],$abs_directory.$result['data']['fichier_src']);
// la vignette
$result['data']['fichier_thumb'] = str_replace('_src','_thumb',$result['data']['fichier_src']);
if($images->setThumbnail($abs_directory.$result['data']['fichier_src'],$abs_directory.$result['data']['fichier_thumb'],100,'thumb')) {
$result['data']['thumb'] = $_ENV['URL_DIRECTORYUPLOAD'].'preview/'.$result['data']['fichier_thumb'];
$result['data']['image'] = true;
} else {
echo json_encode(array('error' => 'Il y a eu un problème pendant la création de la vignette de votre image'));
exit;
}
// le fichier classique
$result['data']['fichier_normal'] = str_replace('_src','_normal',$result['data']['fichier_src']);
if($images->setThumbnail($abs_directory.$result['data']['fichier_src'],$abs_directory.$result['data']['fichier_normal'],array($minsize_width,$minsize_height),'fill')) {
// le fichier classique réduit
$result['data']['normal'] = $_ENV['URL_DIRECTORYUPLOAD'].'preview/'.$result['data']['fichier_normal'];
// récupérer la taille de l'image réduite
$imginfos = @getimagesize($abs_directory.$result['data']['fichier_normal']);
if(!empty($imginfos[0]) && !empty($imginfos[1])) {
$width = (int)$imginfos[0];
$height = (int)$imginfos[1];
if($width<$minsize_width || $height<$minsize_height) {
/*echo 'Largeur '.$width.' / Hauteur '.$height;
echo '/ Souhaité Largeur '.$minsize_width.' / Hauteur '.$minsize_height;
echo '/ resize : '.$normal_size;
exit;*/
echo json_encode(array('error' => 'Votre image est trop petite'));
exit;
}
// le format souhaité pour l'image
if(!empty($_GET['format'])) {
// calcul du carré en fonction du côté le plus petit
if($_GET['format']=='square') {
if($width>$height) {
$carre_size = $height;
} else {
$carre_size = $width;
}
$result['data']['select_width'] = $carre_size;
$result['data']['select_height'] = $carre_size;
} elseif(is_array($_GET['format'])) {
$result['data']['select_width'] = 980;
$result['data']['select_height'] = 150;
}
} else {
$result['data']['select_width'] = $minsize_width;
$result['data']['select_height'] = $minsize_height;
}
}
$result['data']['image'] = true;
} else {
echo json_encode(array('error' => 'Il y a eu un problème pendant la récupération de votre image'));
exit;
}
}
// encoder le HTML dans la réponse JSON
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
$ajaxreponse = true;
return $this->render('utilitaires/upload.html.twig');
}
/**
*
* uploader d'un fichier en attente dans le dossier preview
*
* @Route("/utilitaires/chargement-objet/object/{p_object}/idobject/{p_idobject}/idclassification/{p_idclassifcation}/", name="utilitaires_chargement_object_idobject_idclassification")
*
*/
public function action_chargement_objet($p_object = null, $p_idobject = null, $p_idclassifcation = null, UploadUtils $edit_utils, Images $images)
{
$params['object'] = $p_object;
$params['idobject'] = $p_idobject;
$params['idclassification'] = $p_idclassifcation;
// dossier preview
$abs_directory = $_ENV['PATH_DIRECTORYUPLOAD'].'preview/';
// on doit-être authentifié
if(!$this->getUser() instanceof Extranetusers) {
echo json_encode(array('error' => 'Vous n\'êtes pas connecté'));
exit;
}
// image ?
if(empty($_GET['img'])) {
echo json_encode(array('error' => 'L\identifiant de l\'image est introuvable'));
exit;
} else {
$img = filter_var($_GET['img'], FILTER_SANITIZE_STRING);
}
// checker si le fichier existe
if(!file_exists($abs_directory.$img)) {
echo json_encode(array('error' => 'L\'image est introuvable'));
exit;
}
// paramètres obligatoire : object, idobject, classification
if(empty($params['object'])
|| empty($params['idobject']) || !$this->func->my_is_int($params['idobject'])
|| empty($params['idclassification']) || !$this->func->my_is_int($params['idclassification'])) {
echo json_encode(array('error' => 'Mauvais paramètres'));
exit;
}
// voir si le contenu associé existe
$obj = $this->em->getRepository('TheatreCore\Entity\\'.ucfirst($params['object']));
$infos_object = $obj->getInfosObject($params['idobject']);
if(empty($infos_object)) {
echo json_encode(array('error' => 'Mauvais objet'));
exit;
}
// on vérifie les droits d'uploader de la personne
$params_edit = array(
'idobject' => $params['idobject'],
'object' => $params['object'],
);
$edit_utils->load($this->context,$params_edit);
// les droits
$object_rights = $edit_utils->checkObjectRights();
// checker si la personne connectée à les droits sur cette fiche
if(empty($object_rights['update'])) {
echo json_encode(array('error' => 'Vous n\'avez pas accès à cette fonctionnalité'));
exit;
}
// champs pour fichier
$possible_fields = array(
'title',
'description',
'copyright',
'language',
'publish',
'valid',
);
foreach($possible_fields as $f) {
if(!empty($_GET[$f])) {
$filedata[$f] = filter_var($_GET[$f], FILTER_SANITIZE_STRING);
}
}
// language fr par défaut
if(empty($filedata['language'])) {
$filedata['language'] = 'fr';
}
// data pour le fichier
$filedata['range'] = 'NULL';
$filedata['publish'] = 1;
$filedata['idextranetuser'] = $this->getUser();
// si on a des coordonnées, il faut découper l'image
if(!empty($_GET['imgcoord'])) {
$imgcoord = $_GET['imgcoord'];
$crop_values = array(
'width' => $imgcoord['w'],
'height' => $imgcoord['h'],
'x' => $imgcoord['x'],
'y' => $imgcoord['y'],
'strict' => true,
);
if($images->setThumbnail($abs_directory.$img, // source
$abs_directory.$img, // destination
$imgcoord['w'], // taille
'crop', // découpage
null, // largeur du crop
null, // hauteur du crop
85, // qualité
null, // composition avec une autre image
$crop_values // valeur du crop
)) {
}
}
// on redimensionne le fichier puis on l'enregistre
$files = $this->em->getRepository(Files::class);
$idfile = $files->uploadObjectFile(array('file' => $abs_directory.$img), $params['idclassification'], $params['object'], $params['idobject'], $filedata);
// on renvoi l'infos sur le nouveau fichier et une vignette
if(!empty($idfile) && $idfile) {
// si la classification est unique, mettre hors ligne ou supprimer l'existant TODO delete
if(!empty($_GET['unique'])) {
// on vérifie s'il existe un fichier
$actual_files = $files->getObjectFiles($params['idobject'],$params['object'],$params['idclassification']);
// s'il existe on ligne et validé, on le supprime ou on le mets hors ligne
if(!empty($actual_files)) {
foreach($actual_files as $actual) {
if($actual['idfile']!=$idfile) {
$files->setUpdateFields(array('publish' => 0));
$files->setData($actual['idfile']);
}
}
$files->deleteVignettesObject($params['object'],$params['idobject'],'class_pp');
}
}
// récupérer les infos
$infos = $files->getInfosFile($idfile);
$result['data'] = $infos;
}
// encoder le HTML dans la réponse JSON
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
exit;
}
/**
* @Route("/utilitaires/banniere", name="utilitaires_banniere")
*/
public function banniere()
{
$repo = $this->em->getRepository(Bannieres::class);
$banniere = $repo->getCurrentBanniere();
if(
! empty($banniere)
&& file_exists($this->parameterBag->get('app.dir.pathImg') . 'bannieres/' . $banniere['imgfile'])
) {
$banniere['img'] = $this->parameterBag->get('app.dir.urlImg') . 'bannieres/' . $banniere['imgfile'];
} else {
$banniere = false;
}
$this->view->banniere = $banniere;
return $this->view('utilitaires/banniere.html.twig', [
'banniereTop' => $banniere
]);
}
/**
* @Route("/utilitaires/recherche-ajax/object/{object}", name="utilitaires_recherche_ajax_object")
*/
public function action_recherche_ajax($object = null)
{
if(!empty($object)) {
$object = filter_var($object, FILTER_SANITIZE_STRING);
} else {
echo json_encode(array('Pas d\'objet précisé'));
exit;
}
// pas de tidy
$ajaxreponse = true;
$obj = $this->em->getRepository('TheatreCore\Entity\\'.$object);
$keywords = filter_var($_GET['term'], FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
if(strlen($keywords)<4) {
exit;
}
$results = $obj->getListSearch(null,null,$keywords);
if(!empty($results)) {
foreach($results as $k=>$v) {
$r[] = array(
'id' => $k,
'label' => $v,
'value' => $v,
);
}
echo json_encode($r);
exit;
}
return $this->render('utilitaires/recherche-ajax.html.twig');
}
}