2019-04-02 11:26:41 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Cadoles\CoreBundle\Controller;
|
|
|
|
|
|
|
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
|
|
|
use Symfony\Component\HttpFoundation\Session\Session;
|
|
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
|
|
|
use Symfony\Component\Form\FormError;
|
|
|
|
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
|
|
|
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
|
|
|
|
use Symfony\Component\Finder\Finder;
|
|
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
|
|
use Symfony\Component\HttpFoundation\File\File;
|
|
|
|
|
2020-09-15 16:44:59 +02:00
|
|
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
|
|
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
|
|
|
|
2019-04-02 11:26:41 +02:00
|
|
|
class FileController extends Controller
|
|
|
|
{
|
2020-09-11 17:02:46 +02:00
|
|
|
|
|
|
|
public function listAction($directory,Request $request,$access="config") {
|
|
|
|
$canupdate= $this->getPermission($access,$directory);
|
|
|
|
$subdirectory=$request->get("subdirectory");
|
2020-09-15 16:44:59 +02:00
|
|
|
$clear=$request->get("clear");
|
|
|
|
$view=$request->get("view");
|
2020-09-16 09:33:46 +02:00
|
|
|
$defaultview=$request->get("defaultview");
|
2020-09-15 16:44:59 +02:00
|
|
|
|
|
|
|
// Récupérer en session le dernier subdirectory visité
|
|
|
|
$sessionsubdirectory = $this->get('session')->get('sessionsubdirectory');
|
|
|
|
if(!is_array($sessionsubdirectory)) $sessionsubdirectory=[];
|
|
|
|
|
|
|
|
if($clear) {
|
|
|
|
if(array_key_exists($directory,$sessionsubdirectory)) unset($sessionsubdirectory[$directory]);
|
|
|
|
$this->get('session')->set('sessionsubdirectory',$sessionsubdirectory);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if(!$subdirectory) {
|
|
|
|
if(array_key_exists($directory,$sessionsubdirectory)) $subdirectory=$sessionsubdirectory[$directory];
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$sessionsubdirectory[$directory] = $subdirectory;
|
|
|
|
$this->get('session')->set('sessionsubdirectory',$sessionsubdirectory);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Récupérer en session le mode de visualisation
|
|
|
|
$sessionviewdirectory = $this->get('session')->get('sessionviewdirectory');
|
2020-09-16 09:33:46 +02:00
|
|
|
if(!is_array($sessionviewdirectory)) $sessionviewdirectory=[$directory=>$defaultview];
|
2020-09-18 15:09:03 +02:00
|
|
|
if(!array_key_exists($directory,$sessionviewdirectory)) $sessionviewdirectory[$directory]=$defaultview;
|
2020-09-16 09:46:48 +02:00
|
|
|
if($view)
|
2020-09-15 16:44:59 +02:00
|
|
|
$sessionviewdirectory[$directory] = $view;
|
2020-09-16 09:46:48 +02:00
|
|
|
$this->get('session')->set('sessionviewdirectory',$sessionviewdirectory);
|
2020-09-11 17:02:46 +02:00
|
|
|
|
2020-09-15 16:44:59 +02:00
|
|
|
|
|
|
|
// Construire le chemin réel
|
2020-09-11 17:02:46 +02:00
|
|
|
$iddirectory=explode("-",$directory)[1];
|
|
|
|
$fulldirectory=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory."/".$subdirectory;
|
|
|
|
|
|
|
|
$parents=null;
|
|
|
|
$dirname="Home";
|
|
|
|
if($subdirectory) {
|
|
|
|
$parents=explode("/",$subdirectory);
|
|
|
|
$dirname=end($parents);
|
|
|
|
array_pop($parents);
|
|
|
|
}
|
2020-09-15 16:44:59 +02:00
|
|
|
|
|
|
|
// Générer le tableau de fichiers
|
2020-09-11 17:02:46 +02:00
|
|
|
$files=[];
|
|
|
|
$dirs=[];
|
|
|
|
$fs = new Filesystem();
|
|
|
|
|
|
|
|
if($fs->exists($fulldirectory)) {
|
|
|
|
$finder = new Finder();
|
|
|
|
$finder->depth('== 0')->sortByName()->in($fulldirectory)->exclude('thumb')->exclude('thumbmini');
|
|
|
|
|
|
|
|
foreach ($finder as $file) {
|
|
|
|
if(is_dir($file)) {
|
|
|
|
$tmp=[];
|
|
|
|
$tmp["name"]=$file->getRelativePathname();
|
|
|
|
array_push($dirs,$tmp);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$tmp=[];
|
|
|
|
$tmp["name"]=$file->getRelativePathname();
|
|
|
|
$tmp["extension"]=strtolower($file->getExtension());
|
|
|
|
$fileinfo = new file($file->getPathname());
|
|
|
|
$tmp["minetype"]=$fileinfo->getMimeType();
|
|
|
|
$tmp["minefamily"]=explode("/",$tmp["minetype"])[0];
|
|
|
|
|
|
|
|
$tmp["thumb"]="";
|
|
|
|
if($tmp["extension"]=="pdf") {
|
|
|
|
$tmp["thumb"]="/".$this->getParameter('alias')."/bundles/cadolescore/images/files/".$tmp["extension"].".png";
|
|
|
|
}
|
|
|
|
elseif($fs->exists($fulldirectory."/thumbmini/".$tmp["name"])) {
|
|
|
|
$data = file_get_contents($fulldirectory."/thumbmini/".$tmp["name"]);
|
|
|
|
$tmp["thumb"]="data:image/" . $tmp["extension"] . ";base64," . base64_encode($data);
|
|
|
|
}
|
|
|
|
elseif($fs->exists($fulldirectory."/thumb/".$tmp["name"])) {
|
|
|
|
$data = file_get_contents($fulldirectory."/thumb/".$tmp["name"]);
|
|
|
|
$tmp["thumb"]="data:image/" . $tmp["extension"] . ";base64," . base64_encode($data);
|
|
|
|
}
|
|
|
|
elseif($fs->exists($this->get('kernel')->getRootDir()."/../web/bundles/cadolescore/images/files/".$tmp["extension"].".png")) {
|
|
|
|
$tmp["thumb"]="/".$this->getParameter('alias')."/bundles/cadolescore/images/files/".$tmp["extension"].".png";
|
|
|
|
}
|
|
|
|
|
|
|
|
array_push($files,$tmp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->render('CadolesCoreBundle:File:list.html.twig',[
|
2020-09-15 16:44:59 +02:00
|
|
|
'useheader' => false,
|
2020-09-11 17:02:46 +02:00
|
|
|
'usemenu' => false,
|
|
|
|
'usesidebar' => false,
|
|
|
|
'access' => $access,
|
|
|
|
'iddirectory' => $iddirectory,
|
|
|
|
'directory' => $directory,
|
|
|
|
'parents' => $parents,
|
|
|
|
'subdirectory' => $subdirectory,
|
|
|
|
'dirname' => $dirname,
|
|
|
|
'dirs' => $dirs,
|
|
|
|
'files' => $files,
|
|
|
|
'canupdate' => $canupdate,
|
|
|
|
'canadd' => $canupdate,
|
2020-09-15 16:44:59 +02:00
|
|
|
'view' => $sessionviewdirectory[$directory],
|
2020-09-11 17:02:46 +02:00
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2020-09-15 16:44:59 +02:00
|
|
|
public function uploadAction($id,$type,Request $request,$access="config")
|
2019-04-02 11:26:41 +02:00
|
|
|
{
|
2020-09-15 16:44:59 +02:00
|
|
|
$subdirectory=$request->get("subdirectory");
|
2020-09-17 14:51:15 +02:00
|
|
|
$forcereload=(is_null($request->get("forcereload"))?true:$request->get("forcereload"));
|
2020-09-15 16:44:59 +02:00
|
|
|
|
2019-04-02 11:26:41 +02:00
|
|
|
return $this->render('CadolesCoreBundle:File:upload.html.twig',[
|
|
|
|
'useheader' => false,
|
|
|
|
'usemenu' => false,
|
|
|
|
'usesidebar' => false,
|
|
|
|
'access' => $access,
|
|
|
|
'id' => $id,
|
|
|
|
'type' => $type,
|
2020-09-15 16:44:59 +02:00
|
|
|
'subdirectory' => $subdirectory,
|
2020-09-17 14:51:15 +02:00
|
|
|
'forcereload' => $forcereload,
|
2020-09-15 16:44:59 +02:00
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function subdirectoryAction($id,$type,Request $request,$access="config")
|
|
|
|
{
|
|
|
|
$subdirectory=$request->get("subdirectory");
|
|
|
|
|
|
|
|
$defaultData = [];
|
|
|
|
$form = $this->createFormBuilder()
|
|
|
|
->add('subdirectory', TextType::class,["label"=>"Répertoire"])
|
|
|
|
->add('submit', SubmitType::class,["label"=>"Valider"])
|
|
|
|
->getForm();
|
|
|
|
|
|
|
|
$form->handleRequest($request);
|
|
|
|
$toclose=false;
|
|
|
|
|
|
|
|
if ($form->isSubmitted() && $form->isValid()) {
|
|
|
|
$data = $form->getData();
|
|
|
|
if($data["subdirectory"]=="thumb"||$data["subdirectory"]=="thumbmini") {
|
|
|
|
$form->addError(new FormError('Nom de répertoire réservé, merci de choisir un autre nom de répertoire'));
|
|
|
|
$this->get('session')->getFlashBag()->clear();
|
|
|
|
$request->getSession()->getFlashBag()->add("error", 'Nom de répertoire réservé, merci de choisir un autre nom de répertoire');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$filesystem = new Filesystem();
|
|
|
|
$fulldirectory=$this->get('kernel')->getRootDir()."/../uploads/file/".$id;
|
|
|
|
if($subdirectory) $fulldirectory.="/".$subdirectory."/".$data["subdirectory"];
|
|
|
|
else $fulldirectory.="/".$data["subdirectory"];
|
|
|
|
$filesystem->mkdir($fulldirectory);
|
|
|
|
$toclose=true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->render('CadolesCoreBundle:File:subdirectory.html.twig',[
|
|
|
|
'useheader' => false,
|
|
|
|
'usemenu' => false,
|
|
|
|
'usesidebar' => false,
|
|
|
|
'access' => $access,
|
|
|
|
'id' => $id,
|
|
|
|
'type' => $type,
|
|
|
|
'subdirectory' => $subdirectory,
|
|
|
|
'form' => $form->createView(),
|
|
|
|
'toclose' => $toclose,
|
2019-04-02 11:26:41 +02:00
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function deleteAction(Request $request,$access="config")
|
|
|
|
{
|
|
|
|
// S'assurer que c'est un appel ajax
|
|
|
|
if (!$request->isXmlHttpRequest()) {
|
|
|
|
return new JsonResponse(array('message' => 'Interdit'), 400);
|
|
|
|
}
|
|
|
|
|
|
|
|
$output=array();
|
|
|
|
$directory=$request->request->get('directory');
|
2020-09-15 16:44:59 +02:00
|
|
|
$subdirectory=$request->request->get('subdirectory');
|
2019-04-02 11:26:41 +02:00
|
|
|
$filename=$request->request->get('filename');
|
2020-09-15 16:44:59 +02:00
|
|
|
if($subdirectory) $directory.="/".$subdirectory;
|
2019-04-02 11:26:41 +02:00
|
|
|
|
|
|
|
$this->getPermission($access,$directory);
|
|
|
|
$fs = new Filesystem();
|
|
|
|
$url=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory."/".$filename;
|
|
|
|
if($fs->exists($url)) {
|
|
|
|
$fs->remove($url);
|
|
|
|
}
|
|
|
|
|
|
|
|
$response = new Response(json_encode($output));
|
|
|
|
$response->headers->set('Content-Type', 'application/json');
|
|
|
|
return $response;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function viewAction($directory,$filename,Request $request,$access="config")
|
|
|
|
{
|
|
|
|
$this->getPermission($access,$directory);
|
2020-09-15 16:44:59 +02:00
|
|
|
$subdirectory=$request->query->get('subdirectory');
|
2019-04-02 11:26:41 +02:00
|
|
|
|
|
|
|
$navigation = $request->query->get('navigation');
|
|
|
|
$tbprev=[];
|
|
|
|
$tbnext=[];
|
|
|
|
|
2020-09-15 16:44:59 +02:00
|
|
|
$url=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory;
|
|
|
|
if($subdirectory) $url.="/".$subdirectory;
|
|
|
|
|
|
|
|
$url.="/".$filename;
|
2019-04-02 11:26:41 +02:00
|
|
|
$file = new file($url);
|
2020-09-15 16:44:59 +02:00
|
|
|
|
2019-04-02 11:26:41 +02:00
|
|
|
|
|
|
|
|
|
|
|
$minetype=$file->getMimeType();
|
|
|
|
$minefamily=explode("/",$minetype)[0];
|
|
|
|
|
|
|
|
if($minefamily=="text" || $minefamily=="image" || $minetype == "application/pdf") {
|
|
|
|
$image="";
|
|
|
|
if($minefamily=="image") {
|
|
|
|
$image = "data:image/" . $file->getExtension() . ";base64," . base64_encode(file_get_contents($url));
|
|
|
|
|
|
|
|
if($navigation) {
|
|
|
|
$dir=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory;
|
|
|
|
$files=[];
|
|
|
|
$fs = new Filesystem();
|
|
|
|
|
|
|
|
if($fs->exists($dir)) {
|
|
|
|
$finder = new Finder();
|
2020-04-15 10:43:15 +02:00
|
|
|
$finder->sortByName()->in($dir)->exclude('thumb')->exclude("thumbmini");
|
2019-04-02 11:26:41 +02:00
|
|
|
|
|
|
|
$i=-1;
|
|
|
|
|
|
|
|
|
|
|
|
foreach ($finder as $key => $file) {
|
|
|
|
$i++;
|
|
|
|
|
|
|
|
if($file->getRelativePathname()==$filename) {
|
|
|
|
$keyprev=$i-1;
|
|
|
|
$keynext=$i+1;
|
|
|
|
}
|
|
|
|
|
|
|
|
$tmp=[];
|
|
|
|
$tmp["name"]=$file->getRelativePathname();
|
|
|
|
$tmp["extension"]=$file->getExtension();
|
|
|
|
$fileinfo = new file($file->getPathname());
|
|
|
|
$tmp["minetype"]=$fileinfo->getMimeType();
|
|
|
|
$tmp["minefamily"]=explode("/",$tmp["minetype"])[0];
|
|
|
|
|
|
|
|
$tmp["thumb"]="";
|
|
|
|
if($fs->exists($dir."/thumb/".$tmp["name"])) {
|
|
|
|
$data = file_get_contents($dir."/thumb/".$tmp["name"]);
|
|
|
|
$tmp["thumb"]="data:image/" . $tmp["extension"] . ";base64," . base64_encode($data);
|
|
|
|
}
|
|
|
|
|
|
|
|
array_push($files,$tmp);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(array_key_exists($keyprev,$files))
|
|
|
|
$tbprev=$files[$keyprev];
|
|
|
|
if(array_key_exists($keynext,$files))
|
|
|
|
$tbnext=$files[$keynext];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->render('CadolesCoreBundle:File:view.html.twig',[
|
|
|
|
'useheader' => false,
|
|
|
|
'usemenu' => false,
|
|
|
|
'usesidebar' => false,
|
|
|
|
'access' => $access,
|
|
|
|
'directory' => $directory,
|
2020-09-15 16:44:59 +02:00
|
|
|
'subdirectory' => $subdirectory,
|
2019-04-02 11:26:41 +02:00
|
|
|
'minefamily' => $minefamily,
|
|
|
|
'minetype' => $minetype,
|
|
|
|
'filename' => $filename,
|
|
|
|
'image' => $image,
|
|
|
|
'prev' => $tbprev,
|
|
|
|
'next' => $tbnext
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// normalement le widget ne fait jamais passer par là
|
|
|
|
$response = new BinaryFileResponse($file);
|
|
|
|
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE);
|
|
|
|
|
|
|
|
return $response;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-15 16:44:59 +02:00
|
|
|
public function showAction($directory,$filename,Request $request,$access="config")
|
2019-04-02 11:26:41 +02:00
|
|
|
{
|
|
|
|
$this->getPermission($access,$directory);
|
2020-09-15 16:44:59 +02:00
|
|
|
$subdirectory=$request->query->get('subdirectory');
|
2019-04-02 11:26:41 +02:00
|
|
|
|
2020-09-15 16:44:59 +02:00
|
|
|
$file=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory;
|
|
|
|
if($subdirectory) $file.="/".$subdirectory;
|
|
|
|
$file.="/".$filename;
|
2019-04-02 11:26:41 +02:00
|
|
|
|
|
|
|
$response = new BinaryFileResponse($file);
|
|
|
|
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE);
|
|
|
|
|
|
|
|
return $response;
|
|
|
|
}
|
|
|
|
|
2020-09-15 16:44:59 +02:00
|
|
|
public function downloadAction($directory,$filename,Request $request,$access="config")
|
2019-04-02 11:26:41 +02:00
|
|
|
{
|
|
|
|
$this->getPermission($access,$directory);
|
2020-09-15 16:44:59 +02:00
|
|
|
$subdirectory=$request->query->get('subdirectory');
|
2019-04-02 11:26:41 +02:00
|
|
|
|
2020-09-15 16:44:59 +02:00
|
|
|
$file=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory;
|
|
|
|
if($subdirectory) $file.="/".$subdirectory;
|
|
|
|
$file.="/".$filename;
|
2019-04-02 11:26:41 +02:00
|
|
|
|
|
|
|
$response = new BinaryFileResponse($file);
|
|
|
|
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
|
|
|
|
|
|
|
|
return $response;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getPermission($access, $directory) {
|
|
|
|
if($access=="user") {
|
|
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
|
|
|
|
$type=explode("-",$directory)[0];
|
|
|
|
$id=explode("-",$directory)[1];
|
|
|
|
|
|
|
|
switch($type) {
|
|
|
|
case "widget":
|
|
|
|
// Récupération du widget
|
|
|
|
$widget=$em->getRepository("CadolesPortalBundle:Pagewidget")->find($id);
|
|
|
|
if (!$widget) throw $this->createNotFoundException('Unable to find entity.');
|
|
|
|
|
|
|
|
// On s'assure que l'utilisateur à la permission de voir
|
|
|
|
$page=$widget->getPage();
|
|
|
|
$em->getRepository("CadolesPortalBundle:Page")->getPermission($this->getUser(),$page,$cansee,$canupdate);
|
|
|
|
if(!$cansee) throw $this->createNotFoundException('Permission denied');
|
|
|
|
break;
|
2020-04-16 10:10:11 +02:00
|
|
|
|
2020-04-16 11:51:48 +02:00
|
|
|
case "projecttask":
|
2020-04-16 10:10:11 +02:00
|
|
|
// Récupération de la tache
|
|
|
|
$projecttask=$em->getRepository("CadolesPortalBundle:Projecttask")->find($id);
|
|
|
|
if (!$projecttask) throw $this->createNotFoundException('Unable to find entity.');
|
|
|
|
|
|
|
|
// On s'assure que l'utilisateur à la permission de voir
|
|
|
|
$project=$projecttask->getProject();
|
|
|
|
$user=$this->getUser();
|
|
|
|
$em->getRepository("CadolesPortalBundle:Project")->getPermission($user,$project,$cansee,$canupdate,$canadd);
|
|
|
|
if(!$cansee) throw $this->createNotFoundException('Permission denied');
|
|
|
|
break;
|
2020-09-17 14:51:15 +02:00
|
|
|
|
|
|
|
case "calendarevent":
|
|
|
|
// Récupération de l'event'
|
|
|
|
$calendarevent=$em->getRepository("CadolesPortalBundle:Calendarevent")->find($id);
|
|
|
|
if (!$calendarevent) throw $this->createNotFoundException('Unable to find entity.');
|
|
|
|
|
|
|
|
// On s'assure que l'utilisateur à la permission de voir
|
|
|
|
$calendar=$calendarevent->getCalendar();
|
|
|
|
$user=$this->getUser();
|
|
|
|
$em->getRepository("CadolesPortalBundle:Calendar")->getPermission($user,$calendar,$cansee,$canupdate);
|
|
|
|
if(!$cansee) throw $this->createNotFoundException('Permission denied');
|
|
|
|
break;
|
2019-04-02 11:26:41 +02:00
|
|
|
}
|
|
|
|
}
|
2020-09-11 17:02:46 +02:00
|
|
|
else $canupdate=true;
|
|
|
|
|
|
|
|
return $canupdate;
|
2019-04-02 11:26:41 +02:00
|
|
|
}
|
|
|
|
}
|