Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chamilo-lms/src/CoreBundle/Controller/ResourceController.php

1041 lines
36 KiB

<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Controller;
use APY\DataGridBundle\Grid\Action\MassAction;
use APY\DataGridBundle\Grid\Action\RowAction;
use APY\DataGridBundle\Grid\Export\CSVExport;
use APY\DataGridBundle\Grid\Export\ExcelExport;
use APY\DataGridBundle\Grid\Grid;
use APY\DataGridBundle\Grid\Row;
use APY\DataGridBundle\Grid\Source\Entity;
use Chamilo\CoreBundle\Block\BreadcrumbBlockService;
use Chamilo\CoreBundle\Component\Utils\Glide;
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
use Chamilo\CourseBundle\Controller\CourseControllerTrait;
use Chamilo\CourseBundle\Entity\CDocument;
use Chamilo\CourseBundle\Repository\CDocumentRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\QueryBuilder;
use FOS\RestBundle\View\View;
use League\Flysystem\Filesystem;
use Oneup\UploaderBundle\Uploader\Response\EmptyResponse;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Sylius\Component\Resource\Exception\UpdateHandlingException;
use Sylius\Component\Resource\ResourceActions;
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\Exception\UploadException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Vich\UploaderBundle\Util\Transliterator;
use ZipStream\Option\Archive;
use ZipStream\ZipStream;
/**
* Class ResourceController.
*
* @Route("/resources")
*
* @author Julio Montoya <gugli100@gmail.com>.
*/
class ResourceController extends AbstractResourceController implements CourseControllerInterface
{
use CourseControllerTrait;
/**
* @Route("/{tool}/{type}", name="chamilo_core_resource_index")
*
* Example: /document/files
* For the tool value check the Tool entity.
* For the type value check the ResourceType entity.
*
* @param Request $request
*
* @return Response
*/
public function indexAction(Request $request, Grid $grid): Response
{
$tool = $request->get('tool');
$type = $request->get('type');
$grid = $this->getGrid( $request, $grid);
$breadcrumb = $this->breadcrumbBlockService;
$breadcrumb->addChild(
$this->translator->trans('Documents'),
[
'uri' => '#',
]
);
$id = $this->getCourse()->getResourceNode()->getId();
return $grid->getGridResponse(
'@ChamiloTheme/Resource/index.html.twig',
['tool' => $tool, 'type' => $type, 'id' => $id]
);
}
/**
* @param Request $request
* @param Grid $grid
* @param int $resourceNodeId
*
* @return Grid
*/
public function getGrid(Request $request, Grid $grid, $resourceNodeId = 0)
{
$tool = $request->get('tool');
$type = $request->get('type');
$repository = $this->getRepository($tool, $type);
$class = $repository->getRepository()->getClassName();
$source = new Entity($class);
/*$tableAlias = $source->getTableAlias();
$source->manipulateQuery(function (QueryBuilder $query) use ($tableAlias, $course) {
$query->andWhere($tableAlias . '.cId = '.$course->getId());
//$query->resetDQLPart('orderBy');
}
);*/
$course = $this->getCourse();
$session = $this->getSession();
$parent = $course->getResourceNode();
if (!empty($resourceNodeId)) {
$parent = $repository->getResourceNodeRepository()->find($resourceNodeId);
}
$qb = $repository->getResourcesByCourse($course, $session, null, $parent);
// 3. Set QueryBuilder to the source.
$source->initQueryBuilder($qb);
$grid->setSource($source);
$title = $grid->getColumn('title');
$title->setSafe(false);
//$grid->hideFilters();
$grid->setLimits(20);
//$grid->isReadyForRedirect();
//$grid->setMaxResults(1);
//$grid->setLimits(2);
$translation = $this->translator;
$courseIdentifier = $course->getCode();
$routeParams = ['tool' => $tool, 'type' => $type, 'cidReq' => $courseIdentifier, 'id'];
$grid->getColumn('title')->manipulateRenderCell(
function ($value, Row $row, $router) use ($routeParams) {
/** @var CDocument $entity */
$entity = $row->getEntity();
$resourceNode = $entity->getResourceNode();
$id = $resourceNode->getId();
$myParams = $routeParams;
$myParams['id'] = $id;
unset($myParams[0]);
if ($resourceNode->hasResourceFile()) {
$url = $router->generate(
'chamilo_core_resource_show',
$myParams
);
} else {
$url = $router->generate(
'chamilo_core_resource_list',
$myParams
);
}
return '<a href="'.$url.'">'.$value.'</a>';
}
);
if ($this->isGranted(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)) {
$deleteMassAction = new MassAction(
'Delete',
'chamilo.controller.notebook:deleteMassAction',
true,
['course' => $courseIdentifier]
);
$grid->addMassAction($deleteMassAction);
}
// Show resource data
$myRowAction = new RowAction(
$translation->trans('View'),
'chamilo_core_resource_show',
false,
'_self',
['class' => 'btn btn-secondary']
);
$myRowAction->setRouteParameters($routeParams);
$setNodeParameters = function (RowAction $action, Row $row) use ($routeParams) {
$id = $row->getEntity()->getResourceNode()->getId();
$routeParams['id'] = $id;
$action->setRouteParameters($routeParams);
return $action;
};
$myRowAction->addManipulateRender($setNodeParameters);
$grid->addRowAction($myRowAction);
if ($this->isGranted(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)) {
// Edit
$myRowAction = new RowAction(
$translation->trans('Edit'),
'chamilo_core_resource_edit',
false,
'_self',
['class' => 'btn btn-secondary']
);
$myRowAction->setRouteParameters($routeParams);
$myRowAction->addManipulateRender($setNodeParameters);
$grid->addRowAction($myRowAction);
// Delete
$myRowAction = new RowAction(
$translation->trans('Delete'),
'chamilo_core_resource_delete',
false,
'_self',
['class' => 'btn btn-danger', 'form_delete' => true]
);
$myRowAction->setRouteParameters($routeParams);
$myRowAction->addManipulateRender($setNodeParameters);
$grid->addRowAction($myRowAction);
}
/*$grid->addExport(new CSVExport($translation->trans('CSV export'), 'export', ['course' => $courseIdentifier]));
$grid->addExport(
new ExcelExport(
$translation->trans('Excel export'),
'export',
['course' => $courseIdentifier]
)
);*/
return $grid;
}
/**
* @param Request $request
*/
public function setBreadCrumb(Request $request)
{
$tool = $request->get('tool');
$type = $request->get('type');
$resourceNodeId = $request->get('id');
$courseCode = $request->get('cidReq');
if (!empty($resourceNodeId)) {
$breadcrumb = $this->breadcrumbBlockService;
$breadcrumb->addChild(
$this->translator->trans('Documents'),
[
'uri' => $this->generateUrl(
'chamilo_core_resource_index',
['tool' => $tool, 'type' => $type, 'cidReq' => $courseCode]
),
]
);
/** @var ResourceNode $parent */
$parent = $originalParent = $this->getRepository($tool, $type)->getResourceNodeRepository()->find($resourceNodeId);
$parentList = [];
while ($parent !== null) {
if ($type !== $parent->getResourceType()->getName()){
break;
}
$parent = $parent->getParent();
if ($parent) {
$parent = $this->getRepository($tool, $type)->getResourceNodeRepository()->find($parent->getId());
$parentList[] = $parent;
}
}
$parentList = array_reverse($parentList);
foreach ($parentList as $parent) {
$breadcrumb->addChild(
$parent->getName(),
[
'uri' => $this->generateUrl(
'chamilo_core_resource_list',
['tool' => $tool, 'type' => $type, 'id' => $parent->getId(), 'cidReq' => $courseCode]
),
]
);
}
$breadcrumb->addChild(
$originalParent->getName(),
[
'uri' => $this->generateUrl(
'chamilo_core_resource_list',
['tool' => $tool, 'type' => $type, 'id' => $originalParent->getId(), 'cidReq' => $courseCode]
),
]
);
}
}
/**
* @Route("/{tool}/{type}/{id}/list", name="chamilo_core_resource_list")
*
* If node has children show it
*
* @param Request $request
*
* @return Response
*/
public function listAction(Request $request, Grid $grid): Response
{
$tool = $request->get('tool');
$type = $request->get('type');
$resourceNodeId = $request->get('id');
$grid = $this->getGrid( $request, $grid,$resourceNodeId);
// Set breadcrumb
$this->setBreadCrumb($request);
return $grid->getGridResponse(
'@ChamiloTheme/Resource/index.html.twig',
['parent_id' => $resourceNodeId, 'tool' => $tool, 'type' => $type, 'id' => $resourceNodeId]
);
}
/**
* @Route("/{tool}/{type}/{id}/new_folder", methods={"GET", "POST"}, name="chamilo_core_resource_new_folder")
*
* @param Request $request
*
* @return Response
*/
public function newFolderAction(Request $request): Response
{
$this->setBreadCrumb($request);
return $this->createResource($request, 'folder');
}
/**
* @Route("/{tool}/{type}/{id}/new", methods={"GET", "POST"}, name="chamilo_core_resource_new")
*
* @param Request $request
*
* @return Response
*/
public function newAction(Request $request): Response
{
$this->setBreadCrumb($request);
return $this->createResource($request, 'file');
}
/**
* Shows a resource.
*
* @Route("/{tool}/{type}/{id}/show", methods={"GET"}, name="chamilo_core_resource_show")
*
* @param Request $request
*
* @return Response
*/
public function showAction(Request $request): Response
{
$this->setBreadCrumb($request);
$em = $this->getDoctrine();
$id = $request->get('id');
$resourceNode = $em->getRepository('ChamiloCoreBundle:Resource\ResourceNode')->find($id);
if (null === $resourceNode) {
throw new NotFoundHttpException();
}
$this->denyAccessUnlessGranted(
ResourceNodeVoter::VIEW,
$resourceNode,
'Unauthorised access to resource'
);
$tool = $request->get('tool');
$type = $request->get('type');
$params = [
'resource_node' => $resourceNode,
'tool' => $tool,
'type' => $type,
];
return $this->render('@ChamiloTheme/Resource/show.html.twig', $params);
}
/**
* @Route("/{tool}/{type}/{id}/edit", methods={"GET", "POST"})
*
* @param Request $request
*
* @return Response
*/
public function editAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::UPDATE);
/** @var CDocument $resource */
$resource = $this->findOr404($configuration);
$resourceNode = $resource->getResourceNode();
$this->denyAccessUnlessGranted(
ResourceNodeVoter::EDIT,
$resourceNode,
'Unauthorised access to resource'
);
$form = $this->resourceFormFactory->create($configuration, $resource);
if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true) && $form->handleRequest($request)->isValid()) {
$resource = $form->getData();
/** @var ResourceControllerEvent $event */
$event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource);
if ($event->isStopped() && !$configuration->isHtmlRequest()) {
throw new HttpException($event->getErrorCode(), $event->getMessage());
}
if ($event->isStopped()) {
$this->flashHelper->addFlashFromEvent($configuration, $event);
if ($event->hasResponse()) {
return $event->getResponse();
}
return $this->redirectHandler->redirectToResource($configuration, $resource);
}
try {
$this->resourceUpdateHandler->handle($resource, $configuration, $this->manager);
} catch (UpdateHandlingException $exception) {
if (!$configuration->isHtmlRequest()) {
return $this->viewHandler->handle(
$configuration,
View::create($form, $exception->getApiResponseCode())
);
}
$this->flashHelper->addErrorFlash($configuration, $exception->getFlash());
return $this->redirectHandler->redirectToReferer($configuration);
}
$postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource);
if (!$configuration->isHtmlRequest()) {
$view = $configuration->getParameters()->get('return_content', false) ? View::create(
$resource,
Response::HTTP_OK
) : View::create(null, Response::HTTP_NO_CONTENT);
return $this->viewHandler->handle($configuration, $view);
}
$this->flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource);
if ($postEvent->hasResponse()) {
return $postEvent->getResponse();
}
return $this->redirectHandler->redirectToResource($configuration, $resource);
}
if (!$configuration->isHtmlRequest()) {
return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST));
}
$initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource);
if ($initializeEvent->hasResponse()) {
return $initializeEvent->getResponse();
}
$view = View::create()
->setData([
'configuration' => $configuration,
'metadata' => $this->metadata,
'resource' => $resource,
$this->metadata->getName() => $resource,
'form' => $form->createView(),
])
->setTemplate($configuration->getTemplate(ResourceActions::UPDATE.'.html'))
;
return $this->viewHandler->handle($configuration, $view);
}
/**
* @Route("/{tool}/{type}/{id}", methods={"DELETE"})
*
* @param Request $request
*
* @return Response
*/
public function deleteAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::UPDATE);
/** @var CDocument $resource */
$resource = $this->findOr404($configuration);
$resourceNode = $resource->getResourceNode();
$this->denyAccessUnlessGranted(
ResourceNodeVoter::EDIT,
$resourceNode,
'Unauthorised access to resource'
);
$form = $this->resourceFormFactory->create($configuration, $resource);
if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true) && $form->handleRequest($request)->isValid()) {
$resource = $form->getData();
/** @var ResourceControllerEvent $event */
$event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource);
if ($event->isStopped() && !$configuration->isHtmlRequest()) {
throw new HttpException($event->getErrorCode(), $event->getMessage());
}
if ($event->isStopped()) {
$this->flashHelper->addFlashFromEvent($configuration, $event);
if ($event->hasResponse()) {
return $event->getResponse();
}
return $this->redirectHandler->redirectToResource($configuration, $resource);
}
try {
$this->resourceUpdateHandler->handle($resource, $configuration, $this->manager);
} catch (UpdateHandlingException $exception) {
if (!$configuration->isHtmlRequest()) {
return $this->viewHandler->handle(
$configuration,
View::create($form, $exception->getApiResponseCode())
);
}
$this->flashHelper->addErrorFlash($configuration, $exception->getFlash());
return $this->redirectHandler->redirectToReferer($configuration);
}
$postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource);
if (!$configuration->isHtmlRequest()) {
$view = $configuration->getParameters()->get('return_content', false) ? View::create($resource, Response::HTTP_OK) : View::create(null, Response::HTTP_NO_CONTENT);
return $this->viewHandler->handle($configuration, $view);
}
$this->flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource);
if ($postEvent->hasResponse()) {
return $postEvent->getResponse();
}
return $this->redirectHandler->redirectToResource($configuration, $resource);
}
if (!$configuration->isHtmlRequest()) {
return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST));
}
$initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource);
if ($initializeEvent->hasResponse()) {
return $initializeEvent->getResponse();
}
$view = View::create()
->setData([
'configuration' => $configuration,
'metadata' => $this->metadata,
'resource' => $resource,
$this->metadata->getName() => $resource,
'form' => $form->createView(),
])
->setTemplate($configuration->getTemplate(ResourceActions::UPDATE.'.html'))
;
return $this->viewHandler->handle($configuration, $view);
}
/**
* @Route("/{tool}/{type}/{id}/file", methods={"GET"}, name="chamilo_core_resource_file")
*
* @param Request $request
* @param Glide $glide
*
* @return Response
*/
public function getResourceFileAction(Request $request, Glide $glide): Response
{
$id = $request->get('id');
$filter = $request->get('filter');
$em = $this->getDoctrine();
$resourceNode = $em->getRepository('ChamiloCoreBundle:Resource\ResourceNode')->find($id);
if ($resourceNode === null) {
throw new FileNotFoundException('Not found');
}
return $this->showFile($request, $resourceNode, $glide, 'show', $filter);
}
/**
* Gets a document when calling route resources_document_get_file.
*
* @param Request $request
* @param CDocumentRepository $documentRepo
* @param Glide $glide
*
* @return Response
* @throws \League\Flysystem\FileNotFoundException
*/
public function getDocumentAction(Request $request, CDocumentRepository $documentRepo, Glide $glide): Response
{
$file = $request->get('file');
$type = $request->get('type');
// see list of filters in config/services.yaml
$filter = $request->get('filter');
$type = !empty($type) ? $type : 'show';
$criteria = [
'path' => "/$file",
'course' => $this->getCourse(),
];
$document = $documentRepo->findOneBy($criteria);
if (null === $document) {
throw new NotFoundHttpException();
}
/** @var ResourceNode $resourceNode */
$resourceNode = $document->getResourceNode();
return $this->showFile($request, $resourceNode, $glide, $type, $filter);
}
/**
* Downloads a folder.
*
* @param Request $request
* @param CDocumentRepository $documentRepo
*
* @return Response
*/
public function downloadFolderAction(Request $request, CDocumentRepository $documentRepo)
{
$folderId = (int) $request->get('folderId');
$courseNode = $this->getCourse()->getResourceNode();
if (empty($folderId)) {
$resourceNode = $courseNode;
} else {
$document = $documentRepo->find($folderId);
$resourceNode = $document->getResourceNode();
}
$type = $documentRepo->getResourceType();
if (null === $resourceNode || null === $courseNode) {
throw new NotFoundHttpException();
}
$this->denyAccessUnlessGranted(
ResourceNodeVoter::VIEW,
$resourceNode,
'Unauthorised access to resource'
);
$zipName = $resourceNode->getName().'.zip';
$rootNodePath = $resourceNode->getPathForDisplay();
/** @var Filesystem $fileSystem */
$fileSystem = $this->get('oneup_flysystem.resources_filesystem');
$resourceNodeRepo = $documentRepo->getResourceNodeRepository();
$criteria = Criteria::create()
->where(Criteria::expr()->neq('resourceFile', null))
->andWhere(Criteria::expr()->eq('resourceType', $type))
;
/** @var ArrayCollection|ResourceNode[] $children */
/** @var QueryBuilder $children */
$qb = $resourceNodeRepo->getChildrenQueryBuilder($resourceNode);
$qb->addCriteria($criteria);
$children = $qb->getQuery()->getResult();
/** @var ResourceNode $node */
foreach ($children as $node) {
/*if ($node->hasResourceFile()) {
$resourceFile = $node->getResourceFile();
$systemName = $resourceFile->getFile()->getPathname();
$stream = $fileSystem->readStream($systemName);
//error_log($node->getPathForDisplay());
$fileToDisplay = str_replace($rootNodePath, '', $node->getPathForDisplay());
var_dump($fileToDisplay);
}*/
var_dump($node->getPathForDisplay());
//var_dump($node['path']);
}
exit;
$response = new StreamedResponse(function() use($rootNodePath, $zipName, $children, $fileSystem)
{
// Define suitable options for ZipStream Archive.
$options = new Archive();
$options->setContentType('application/octet-stream');
//initialise zipstream with output zip filename and options.
$zip = new ZipStream($zipName, $options);
/** @var ResourceNode $node */
foreach ($children as $node) {
$resourceFile = $node->getResourceFile();
$systemName = $resourceFile->getFile()->getPathname();
$stream = $fileSystem->readStream($systemName);
//error_log($node->getPathForDisplay());
$fileToDisplay = str_replace($rootNodePath, '', $node->getPathForDisplay());
error_log($fileToDisplay);
$zip->addFileFromStream($fileToDisplay, $stream);
}
//$data = $repo->getDocumentContent($not_deleted_file['id']);
//$zip->addFile($not_deleted_file['path'], $data);
$zip->finish();
});
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
Transliterator::transliterate($zipName)
);
$response->headers->set('Content-Disposition', $disposition);
$response->headers->set('Content-Type', 'application/octet-stream');
return $response;
}
/**
* Upload form.
*
* @Route("/{tool}/{type}/{id}/upload", name="chamilo_core_resource_upload", methods={"GET", "POST"}, options={"expose"=true})
*/
public function uploadAction(Request $request, $tool, $type, $id): Response
{
$this->setBreadCrumb( $request);
//$helper = $this->container->get('oneup_uploader.templating.uploader_helper');
//$endpoint = $helper->endpoint('courses');
$session = $this->getSession();
$sessionId = $session ? $session->getId() : 0;
return $this->render(
'@ChamiloTheme/Resource/upload.html.twig',
[
'id' => $id,
'type' => $type,
'tool' => $tool,
'cidReq' => $this->getCourse()->getCode(),
'id_session' => $sessionId,
]
);
}
/**
* @return JsonResponse
*/
public function upload()
{
error_log('upload!!!');
return;
$request = $this->getRequest();
$response = new EmptyResponse();
$files = $this->getFiles($request->files);
$chunked = null !== $request->headers->get('content-range');
try {
/** @var UploadedFile $file */
foreach ($files as $file) {
try {
$file->getFilename();
$type = $request->get('type');
if ($type === 'course') {
$courseCode = $request->get('identifier');
$this->container->get('');
}
$chunked ?
$this->handleChunkedUpload($file, $response, $request) :
$this->handleUpload($file, $response, $request);
} catch (UploadException $e) {
$this->errorHandler->addException($response, $e);
}
}
} catch (UploadException $e) {
// return nothing
return new JsonResponse([]);
}
return $this->createSupportedJsonResponse($response->assemble());
}
/**
* @param Request $request
* @param ResourceNode $resourceNode
* @param Glide $glide
* @param $type
* @param string $filter
*
* @return mixed|StreamedResponse
*/
private function showFile(Request $request, ResourceNode $resourceNode, Glide $glide, $type, $filter = '')
{
$this->denyAccessUnlessGranted(
ResourceNodeVoter::VIEW,
$resourceNode,
'Unauthorised access to resource'
);
$resourceFile = $resourceNode->getResourceFile();
if (!$resourceFile) {
throw new NotFoundHttpException();
}
$fileName = $resourceNode->getName();
$filePath = $resourceFile->getFile()->getPathname();
$mimeType = $resourceFile->getMimeType();
switch ($type) {
case 'download':
$forceDownload = true;
break;
case 'show':
default:
$forceDownload = false;
// If it's an image then send it to Glide.
if (strpos($mimeType, 'image') !== false) {
$server = $glide->getServer();
$params = $request->query->all();
// The filter overwrites the params from get
if (!empty($filter)) {
$params = $glide->getFilters()[$filter] ?? [];
}
// The image was cropped manually by the user, so we force to render this version,
// no matter other crop parameters.
$crop = $resourceFile->getCrop();
if (!empty($crop)) {
$params['crop'] = $crop;
}
return $server->getImageResponse($filePath, $params);
}
break;
}
$stream = $this->fs->readStream($filePath);
$response = new StreamedResponse(function () use ($stream): void {
stream_copy_to_stream($stream, fopen('php://output', 'wb'));
});
$disposition = $response->headers->makeDisposition(
$forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
Transliterator::transliterate($fileName)
);
$response->headers->set('Content-Disposition', $disposition);
$response->headers->set('Content-Type', $mimeType ?: 'application/octet-stream');
return $response;
}
/**
* @param string $fileType
*
* @return RedirectResponse|Response|null
*/
private function createResource(Request $request, $fileType = 'file')
{
$tool = $request->get('tool');
$type = $request->get('type');
$resourceNodeParentId = $request->get('id');
$repository = $this->getRepositoryFromRequest($request);
/*$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::CREATE);
/** @var CDocument $newResource */
$form = $repository->getForm($this->container->get('form.factory'));
$course = $this->getCourse();
$session = $this->getSession();
$parent = $course;
if (!empty($resourceNodeParentId)) {
$parent = $repository->getRepository()->findOneBy(['resourceNode' => $resourceNodeParentId]);
}
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
/** @var CDocument $newResource */
$newResource = $form->getData();
$path = \URLify::filter($newResource->getTitle());
switch ($fileType) {
case 'folder':
$newResource
->setPath($path)
->setSize(0)
;
break;
case 'file':
$newResource
->setPath($path)
->setSize(0)
;
break;
}
$newResource
->setCourse($course)
->setSession($session)
->setFiletype($fileType)
//->setTitle($title) // already added in $form->getData()
//->setComment($comment)
->setReadonly(false)
;
$em = $this->getDoctrine()->getManager();
$em->persist($newResource);
$newResource->setId($newResource->getIid());
$em->persist($newResource);
$resourceNode = $repository->addResourceNode($newResource, $this->getUser(), $parent);
$repository->addResourceNodeToCourse(
$resourceNode,
ResourceLink::VISIBILITY_PUBLISHED,
$course,
$session,
null
);
// Loops all sharing options
/*foreach ($shareList as $share) {
$idList = [];
if (isset($share['search'])) {
$idList = explode(',', $share['search']);
}
$resourceRight = null;
if (isset($share['mask'])) {
$resourceRight = new ResourceRight();
$resourceRight
->setMask($share['mask'])
->setRole($share['role'])
;
}
// Build links
switch ($share['sharing']) {
case 'everyone':
$repository->addResourceToEveryone(
$resourceNode,
$resourceRight
);
break;
case 'course':
$repository->addResourceToCourse(
$resourceNode,
$course,
$resourceRight
);
break;
case 'session':
$repository->addResourceToSession(
$resourceNode,
$course,
$session,
$resourceRight
);
break;
case 'user':
// Only for me
if (isset($share['only_me'])) {
$repository->addResourceOnlyToMe($resourceNode);
} else {
// To other users
$repository->addResourceToUserList($resourceNode, $idList);
}
break;
case 'group':
// @todo
break;
}*/
//}
$em->flush();
$this->addFlash('success', 'saved');
return $this->redirectToRoute(
'chamilo_core_resource_list',
[
'id' => $resourceNodeParentId,
'tool' => $tool,
'type' => $type,
'cidReq' => $this->getCourse()->getCode()
]
);
}
switch ($fileType) {
case 'folder':
$template = '@ChamiloTheme/Resource/new_folder.html.twig';
break;
case 'file':
$template = '@ChamiloTheme/Resource/new.html.twig';
break;
}
return $this->render(
$template,
[
'form' => $form->createView(),
'parent' => $resourceNodeParentId,
'file_type' => $fileType,
]
);
}
}