Completed
Push — master ( 40658a...92c813 )
by Julito
12:23
created

ResourceController::diskSpaceAction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 13
nc 1
nop 1
dl 0
loc 23
rs 9.8333
c 0
b 0
f 0
1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\CoreBundle\Controller;
5
6
use APY\DataGridBundle\Grid\Action\MassAction;
7
use APY\DataGridBundle\Grid\Action\RowAction;
8
use APY\DataGridBundle\Grid\Column\Column;
9
use APY\DataGridBundle\Grid\Export\CSVExport;
10
use APY\DataGridBundle\Grid\Export\ExcelExport;
11
use APY\DataGridBundle\Grid\Grid;
12
use APY\DataGridBundle\Grid\Row;
13
use APY\DataGridBundle\Grid\Source\Entity;
14
use Chamilo\CoreBundle\Component\Utils\Glide;
15
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
16
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
17
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
18
use Chamilo\CoreBundle\Repository\IllustrationRepository;
19
use Chamilo\CoreBundle\Repository\ResourceRepository;
20
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
21
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
22
use Chamilo\CourseBundle\Controller\CourseControllerTrait;
23
use Chamilo\UserBundle\Entity\User;
24
use Doctrine\Common\Collections\ArrayCollection;
25
use Doctrine\Common\Collections\Criteria;
26
use Doctrine\ORM\QueryBuilder;
27
use FOS\CKEditorBundle\Form\Type\CKEditorType;
28
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
29
use Symfony\Component\HttpFoundation\File\UploadedFile;
30
use Symfony\Component\HttpFoundation\JsonResponse;
31
use Symfony\Component\HttpFoundation\RedirectResponse;
32
use Symfony\Component\HttpFoundation\Request;
33
use Symfony\Component\HttpFoundation\Response;
34
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
35
use Symfony\Component\HttpFoundation\StreamedResponse;
36
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
37
use Symfony\Component\Routing\Annotation\Route;
38
use Symfony\Component\Routing\Router;
39
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
40
use Vich\UploaderBundle\Util\Transliterator;
41
use ZipStream\Option\Archive;
42
use ZipStream\ZipStream;
43
44
/**
45
 * Class ResourceController.
46
 *
47
 * @todo improve/refactor $this->denyAccessUnlessGranted
48
 * @Route("/resources")
49
 *
50
 * @author Julio Montoya <[email protected]>.
51
 */
52
class ResourceController extends AbstractResourceController implements CourseControllerInterface
53
{
54
    use CourseControllerTrait;
55
56
    /**
57
     * @Route("/{tool}/{type}", name="chamilo_core_resource_index")
58
     *
59
     * Example: /document/files (See the 'tool' and the 'resource_type' DB tables.)
60
     * For the tool value check the Tool entity.
61
     * For the type value check the ResourceType entity.
62
     */
63
    public function indexAction(Request $request, Grid $grid): Response
64
    {
65
        $tool = $request->get('tool');
66
        $type = $request->get('type');
67
68
        $parentResourceNode = $this->getParentResourceNode($request);
69
        $repository = $this->getRepositoryFromRequest($request);
70
        $settings = $repository->getResourceSettings();
71
72
        $grid = $this->getGrid($request, $repository, $grid, $parentResourceNode->getId());
73
74
        $breadcrumb = $this->getBreadCrumb();
75
        $breadcrumb->addChild(
76
            $this->trans($tool),
77
            [
78
                'uri' => '#',
79
            ]
80
        );
81
82
        // The base resource node is the course.
83
        $id = $parentResourceNode->getId();
84
85
        return $grid->getGridResponse(
86
            '@ChamiloTheme/Resource/index.html.twig',
87
            [
88
                'tool' => $tool,
89
                'type' => $type,
90
                'id' => $id,
91
                'parent_resource_node' => $parentResourceNode,
92
                'resource_settings' => $settings,
93
            ]
94
        );
95
    }
96
97
    /**
98
     * @Route("/{tool}/{type}/{id}/list", name="chamilo_core_resource_list")
99
     *
100
     * If node has children show it
101
     */
102
    public function listAction(Request $request, Grid $grid): Response
103
    {
104
        $tool = $request->get('tool');
105
        $type = $request->get('type');
106
        $resourceNodeId = $request->get('id');
107
108
        $repository = $this->getRepositoryFromRequest($request);
109
        $settings = $repository->getResourceSettings();
110
111
        $grid = $this->getGrid($request, $repository, $grid, $resourceNodeId);
112
113
        $this->setBreadCrumb($request);
114
        $parentResourceNode = $this->getParentResourceNode($request);
115
116
        return $grid->getGridResponse(
117
            '@ChamiloTheme/Resource/index.html.twig',
118
            [
119
                'parent_id' => $resourceNodeId,
120
                'tool' => $tool,
121
                'type' => $type,
122
                'id' => $resourceNodeId,
123
                'parent_resource_node' => $parentResourceNode,
124
                'resource_settings' => $settings,
125
            ]
126
        );
127
    }
128
129
    public function getGrid(Request $request, ResourceRepository $repository, Grid $grid, $resourceNodeId): Grid
130
    {
131
        $class = $repository->getRepository()->getClassName();
132
133
        // The group 'resource' is set in the @GRID\Source annotation in the entity.
134
        $source = new Entity($class, 'resource');
135
        /** @var ResourceNode $parentNode */
136
        $parentNode = $repository->getResourceNodeRepository()->find($resourceNodeId);
137
138
        $this->denyAccessUnlessGranted(
139
            ResourceNodeVoter::VIEW,
140
            $parentNode,
141
            $this->trans('Unauthorised access to resource')
142
        );
143
144
        $settings = $repository->getResourceSettings();
145
146
        $course = $this->getCourse();
147
        $session = $this->getSession();
148
149
        $qb = $repository->getResources($this->getUser(), $parentNode, $course, $session, null);
150
151
        // 3. Set QueryBuilder to the source.
152
        $source->initQueryBuilder($qb);
153
        $grid->setSource($source);
154
155
        $resourceParams = $this->getResourceParams($request);
156
157
        $grid->setRouteUrl($this->generateUrl('chamilo_core_resource_list', $resourceParams));
158
159
        //$grid->hideFilters();
160
        //$grid->setLimits(20);
161
        //$grid->isReadyForRedirect();
162
        //$grid->setMaxResults(1);
163
        //$grid->setLimits(2);
164
        //$grid->setColumns($columns);
165
        $routeParams = $resourceParams;
166
        $routeParams['id'] = null;
167
168
        /** @var Column $titleColumn */
169
        $titleColumn = $repository->getTitleColumn($grid);
170
        $titleColumn->setSafe(false); // allows links in the title
171
172
        // Title link.
173
        $titleColumn->setTitle($this->trans('Name'));
174
175
        //$repository->formatGrid();
176
        /*if ($grid->hasColumn('filetype')) {
177
            $grid->getColumn('filetype')->setTitle($this->trans('Type'));
178
        }*/
179
180
        $titleColumn->manipulateRenderCell(
181
            function ($value, Row $row, $router) use ($routeParams) {
182
                /** @var Router $router */
183
                /** @var AbstractResource $entity */
184
                $entity = $row->getEntity();
185
                $resourceNode = $entity->getResourceNode();
186
                $id = $resourceNode->getId();
187
188
                $myParams = $routeParams;
189
                $myParams['id'] = $id;
190
                unset($myParams[0]);
191
192
                $icon = $resourceNode->getIcon().' &nbsp;';
193
                if ($resourceNode->hasResourceFile()) {
194
                    if ($resourceNode->isResourceFileAnImage()) {
195
                        $url = $router->generate(
196
                            'chamilo_core_resource_view',
197
                            $myParams
198
                        );
199
200
                        return $icon.'<a data-fancybox="gallery" href="'.$url.'">'.$value.'</a>';
201
                    }
202
203
                    if ($resourceNode->isResourceFileAVideo()) {
204
                        $url = $router->generate(
205
                            'chamilo_core_resource_view',
206
                            $myParams
207
                        );
208
209
                        return '
210
                        <video width="640" height="320" controls id="video'.$id.'" controls preload="metadata" style="display:none;">
211
                            <source src="'.$url.'" type="video/mp4">
212
                            Your browser doesn\'t support HTML5 video tag.
213
                        </video>
214
                        '.$icon.' <a data-fancybox="gallery"  data-width="640" data-height="360" href="#video'.$id.'">'.$value.'</a>';
215
                    }
216
217
                    $url = $router->generate(
218
                        'chamilo_core_resource_preview',
219
                        $myParams
220
                    );
221
222
                    return $icon.'<a data-fancybox="gallery" data-type="iframe" data-src="'.$url.'" href="javascript:;" >'.$value.'</a>';
223
                } else {
224
                    $url = $router->generate(
225
                        'chamilo_core_resource_list',
226
                        $myParams
227
                    );
228
229
                    return $icon.'<a href="'.$url.'">'.$value.'</a>';
230
                }
231
            }
232
        );
233
234
        if ($grid->hasColumn('filetype')) {
235
            $grid->getColumn('filetype')->manipulateRenderCell(
236
                function ($value, Row $row, $router) use ($routeParams) {
0 ignored issues
show
Unused Code introduced by
The import $routeParams is not used and could be removed.

This check looks for imports that have been defined, but are not used in the scope.

Loading history...
Unused Code introduced by
The parameter $router is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

236
                function ($value, Row $row, /** @scrutinizer ignore-unused */ $router) use ($routeParams) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
237
                    /** @var AbstractResource $entity */
238
                    $entity = $row->getEntity();
239
                    $resourceNode = $entity->getResourceNode();
240
241
                    if ($resourceNode->hasResourceFile()) {
242
                        $file = $resourceNode->getResourceFile();
243
244
                        return $file->getMimeType();
245
                    }
246
247
                    return $this->trans('Folder');
248
                }
249
            );
250
        }
251
252
        if ($grid->hasColumn('iid')) {
253
            $grid->setHiddenColumns(['iid']);
254
        }
255
256
        // Delete mass action.
257
        if ($this->isGranted(ResourceNodeVoter::DELETE, $parentNode)) {
258
            $deleteMassAction = new MassAction(
259
                'Delete',
260
                'ChamiloCoreBundle:Resource:deleteMass',
261
                true,
262
                $routeParams
263
            );
264
            $grid->addMassAction($deleteMassAction);
265
        }
266
267
        // Info action.
268
        $myRowAction = new RowAction(
269
            $this->trans('Info'),
270
            'chamilo_core_resource_info',
271
            false,
272
            '_self',
273
            [
274
                'class' => 'btn btn-secondary info_action',
275
                'icon' => 'fa-info-circle',
276
                'iframe' => false,
277
            ]
278
        );
279
280
        $setNodeParameters = function (RowAction $action, Row $row) use ($routeParams) {
281
            $id = $row->getEntity()->getResourceNode()->getId();
282
            $routeParams['id'] = $id;
283
            $action->setRouteParameters($routeParams);
284
            $attributes = $action->getAttributes();
285
            $attributes['data-action'] = $action->getRoute();
286
            $attributes['data-action-id'] = $action->getRoute().'_'.$id;
287
            $attributes['data-node-id'] = $id;
288
289
            $action->setAttributes($attributes);
290
291
            return $action;
292
        };
293
294
        $myRowAction->addManipulateRender($setNodeParameters);
295
        $grid->addRowAction($myRowAction);
296
297
        // Download action
298
        $myRowAction = new RowAction(
299
            $this->trans('Download'),
300
            'chamilo_core_resource_download',
301
            false,
302
            '_self',
303
            [
304
                'class' => 'btn btn-secondary download_action',
305
                'icon' => 'fa-download',
306
            ]
307
        );
308
309
        $setNodeDownloadParameters = function (RowAction $action, Row $row) use ($routeParams) {
310
            $id = $row->getEntity()->getResourceNode()->getId();
311
            $routeParams['id'] = $id;
312
            $action->setRouteParameters($routeParams);
313
            $attributes = $action->getAttributes();
314
            $action->setAttributes($attributes);
315
316
            return $action;
317
        };
318
        $myRowAction->addManipulateRender($setNodeDownloadParameters);
319
        $grid->addRowAction($myRowAction);
320
321
        // Set EDIT/DELETE
322
        $setNodeParameters = function (RowAction $action, Row $row) use ($routeParams) {
323
            $id = $row->getEntity()->getResourceNode()->getId();
324
325
            $allowedEdit = $this->isGranted(ResourceNodeVoter::EDIT, $row->getEntity()->getResourceNode());
326
327
            if ($allowedEdit === false) {
328
                return null;
329
            }
330
331
            $routeParams['id'] = $id;
332
333
            $action->setRouteParameters($routeParams);
334
            $attributes = $action->getAttributes();
335
            //$attributes['data-action'] = $action->getRoute();
336
            //$attributes['data-action-id'] = $action->getRoute().'_'.$id;
337
            //$attributes['data-node-id'] = $id;
338
            $action->setAttributes($attributes);
339
340
            return $action;
341
        };
342
343
        if ($this->isGranted(ResourceNodeVoter::EDIT, $parentNode)) {
344
            // Enable/Disable
345
            $myRowAction = new RowAction(
346
                '',
347
                'chamilo_core_resource_change_visibility',
348
                false,
349
                '_self'
350
            );
351
352
            $setVisibleParameters = function (RowAction $action, Row $row) use ($routeParams) {
353
                /** @var AbstractResource $resource */
354
                $resource = $row->getEntity();
355
                $allowedEdit = $this->isGranted(ResourceNodeVoter::EDIT, $resource->getResourceNode());
356
357
                if ($allowedEdit === false) {
358
                    return null;
359
                }
360
361
                $id = $resource->getResourceNode()->getId();
362
363
                $icon = 'fa-eye-slash';
364
                if ($this->hasCourse()) {
365
                    $link = $resource->getCourseSessionResourceLink($this->getCourse(), $this->getSession());
366
                } else {
367
                    $link = $resource->getFirstResourceLink();
368
                }
369
370
                if ($link === null) {
371
                    return null;
372
                }
373
                if ($link->getVisibility() === ResourceLink::VISIBILITY_PUBLISHED) {
374
                    $icon = 'fa-eye';
375
                }
376
                $routeParams['id'] = $id;
377
                $action->setRouteParameters($routeParams);
378
                $attributes = [
379
                    'class' => 'btn btn-secondary change_visibility',
380
                    'data-id' => $id,
381
                    'icon' => $icon,
382
                ];
383
                $action->setAttributes($attributes);
384
385
                return $action;
386
            };
387
388
            $myRowAction->addManipulateRender($setVisibleParameters);
389
            $grid->addRowAction($myRowAction);
390
391
            if ($settings->isAllowResourceEdit()) {
392
                // Edit action.
393
                $myRowAction = new RowAction(
394
                    $this->trans('Edit'),
395
                    'chamilo_core_resource_edit',
396
                    false,
397
                    '_self',
398
                    ['class' => 'btn btn-secondary', 'icon' => 'fa fa-pen']
399
                );
400
                $myRowAction->addManipulateRender($setNodeParameters);
401
                $grid->addRowAction($myRowAction);
402
            }
403
404
            // More action.
405
            /*$myRowAction = new RowAction(
406
                $this->trans('More'),
407
                'chamilo_core_resource_preview',
408
                false,
409
                '_self',
410
                ['class' => 'btn btn-secondary edit_resource', 'icon' => 'fa fa-ellipsis-h']
411
            );
412
413
            $myRowAction->addManipulateRender($setNodeParameters);
414
            $grid->addRowAction($myRowAction);*/
415
416
            // Delete action.
417
            $myRowAction = new RowAction(
418
                $this->trans('Delete'),
419
                'chamilo_core_resource_delete',
420
                true,
421
                '_self',
422
                [
423
                    'class' => 'btn btn-danger',
424
                    //'data_hidden' => true,
425
                ]
426
            );
427
            $myRowAction->addManipulateRender($setNodeParameters);
428
            $grid->addRowAction($myRowAction);
429
        }
430
431
        /*$grid->addExport(new CSVExport($this->trans('CSV export'), 'export', ['course' => $courseIdentifier]));
432
        $grid->addExport(
433
            new ExcelExport(
434
                $this->trans('Excel export'),
435
                'export',
436
                ['course' => $courseIdentifier]
437
            )
438
        );*/
439
440
        return $grid;
441
    }
442
443
    /**
444
     * @Route("/{tool}/{type}/{id}/new_folder", methods={"GET", "POST"}, name="chamilo_core_resource_new_folder")
445
     */
446
    public function newFolderAction(Request $request): Response
447
    {
448
        $this->setBreadCrumb($request);
449
450
        return $this->createResource($request, 'folder');
451
    }
452
453
    /**
454
     * @Route("/{tool}/{type}/{id}/new", methods={"GET", "POST"}, name="chamilo_core_resource_new")
455
     */
456
    public function newAction(Request $request): Response
457
    {
458
        $this->setBreadCrumb($request);
459
460
        return $this->createResource($request, 'file');
461
    }
462
463
    /**
464
     * @Route("/{tool}/{type}/{id}/disk_space", methods={"GET", "POST"}, name="chamilo_core_resource_disk_space")
465
     */
466
    public function diskSpaceAction(Request $request): Response
467
    {
468
        $this->setBreadCrumb($request);
469
470
        $nodeId = $request->get('id');
471
472
        $repository = $this->getRepositoryFromRequest($request);
473
474
        /** @var ResourceNode $resourceNode */
475
        $resourceNode = $repository->getResourceNodeRepository()->find($nodeId);
476
        $size = $repository->getResourceNodeRepository()->getSize($resourceNode, $repository->getResourceType());
477
478
        $this->denyAccessUnlessGranted(
479
            ResourceNodeVoter::VIEW,
480
            $resourceNode,
481
            $this->trans('Unauthorised access to resource')
482
        );
483
484
        return $this->render(
485
            '@ChamiloTheme/Resource/disk_space.html.twig',
486
            [
487
                'resourceNode' => $resourceNode,
488
                'size' => $size,
489
            ]
490
        );
491
    }
492
493
    /**
494
     * @Route("/{tool}/{type}/{id}/edit", methods={"GET", "POST"})
495
     */
496
    public function editAction(Request $request, IllustrationRepository $illustrationRepository): Response
497
    {
498
        $resourceNodeId = $request->get('id');
499
500
        $this->setBreadCrumb($request);
501
        $repository = $this->getRepositoryFromRequest($request);
502
        /** @var AbstractResource $resource */
503
        $resource = $repository->getRepository()->findOneBy(['resourceNode' => $resourceNodeId]);
504
        $resourceNode = $resource->getResourceNode();
505
506
        $this->denyAccessUnlessGranted(
507
            ResourceNodeVoter::EDIT,
508
            $resourceNode,
509
            $this->trans('Unauthorised access to resource')
510
        );
511
512
        $resourceNodeParentId = $resourceNode->getId();
513
514
        $routeParams = $this->getResourceParams($request);
515
        $routeParams['id'] = $resourceNodeParentId;
516
517
        $form = $repository->getForm($this->container->get('form.factory'), $resource);
518
519
        if ($resourceNode->hasEditableContent()) {
520
            $form->add(
521
                'content',
522
                CKEditorType::class,
523
                [
524
                    'mapped' => false,
525
                    'config' => [
526
                        'filebrowserImageBrowseRoute' => 'resources_filemanager',
527
                        'filebrowserImageBrowseRouteParameters' => $routeParams,
528
                    ],
529
                ]
530
            );
531
            $content = $repository->getResourceNodeFileContent($resourceNode);
532
            $form->get('content')->setData($content);
533
        }
534
535
        $form->handleRequest($request);
536
537
        if ($form->isSubmitted() && $form->isValid()) {
538
            /** @var AbstractResource $newResource */
539
            $newResource = $form->getData();
540
541
            if ($form->has('content')) {
542
                $data = $form->get('content')->getData();
543
                $repository->updateResourceFileContent($newResource, $data);
544
            }
545
546
            //$newResource->setTitle($form->get('title')->getData()); // already set in $form->getData()
547
            $repository->updateNodeForResource($newResource);
548
549
            if ($form->has('illustration')) {
550
                $illustration = $form->get('illustration')->getData();
551
                if ($illustration) {
552
                    $file = $illustrationRepository->addIllustration($newResource, $this->getUser(), $illustration);
553
                    $em = $illustrationRepository->getEntityManager();
554
                    $em->persist($file);
555
                    $em->flush();
556
                }
557
            }
558
559
            $this->addFlash('success', $this->trans('Updated'));
560
561
            //if ($newResource->getResourceNode()->hasResourceFile()) {
562
            $resourceNodeParentId = $newResource->getResourceNode()->getParent()->getId();
563
            //}
564
            $routeParams['id'] = $resourceNodeParentId;
565
566
            return $this->redirectToRoute('chamilo_core_resource_list', $routeParams);
567
        }
568
569
        return $this->render(
570
            '@ChamiloTheme/Resource/edit.html.twig',
571
            [
572
                'form' => $form->createView(),
573
                'parent' => $resourceNodeParentId,
574
            ]
575
        );
576
    }
577
578
    /**
579
     * Shows a resource information.
580
     *
581
     * @Route("/{tool}/{type}/{id}/info", methods={"GET"}, name="chamilo_core_resource_info")
582
     */
583
    public function infoAction(Request $request, IllustrationRepository $illustrationRepository): Response
584
    {
585
        $this->setBreadCrumb($request);
586
        $nodeId = $request->get('id');
587
588
        $repository = $this->getRepositoryFromRequest($request);
589
590
        /** @var AbstractResource $resource */
591
        $resource = $repository->getRepository()->findOneBy(['resourceNode' => $nodeId]);
592
593
        if (null === $resource) {
594
            throw new NotFoundHttpException();
595
        }
596
597
        $resourceNode = $resource->getResourceNode();
598
599
        if (null === $resourceNode) {
600
            throw new NotFoundHttpException();
601
        }
602
603
        $this->denyAccessUnlessGranted(
604
            ResourceNodeVoter::VIEW,
605
            $resourceNode,
606
            $this->trans('Unauthorised access to resource')
607
        );
608
609
        $tool = $request->get('tool');
610
        $type = $request->get('type');
611
612
        $illustration = $illustrationRepository->getIllustrationUrlFromNode($resource->getResourceNode());
613
614
        $params = [
615
            'resource' => $resource,
616
            'illustration' => $illustration,
617
            'tool' => $tool,
618
            'type' => $type,
619
        ];
620
621
        return $this->render('@ChamiloTheme/Resource/info.html.twig', $params);
622
    }
623
624
    /**
625
     * Preview a file. Mostly used when using a modal.
626
     *
627
     * @Route("/{tool}/{type}/{id}/preview", methods={"GET"}, name="chamilo_core_resource_preview")
628
     */
629
    public function previewAction(Request $request): Response
630
    {
631
        $this->setBreadCrumb($request);
632
        $nodeId = $request->get('id');
633
634
        $repository = $this->getRepositoryFromRequest($request);
635
636
        /** @var AbstractResource $resource */
637
        $resource = $repository->getRepository()->findOneBy(['resourceNode' => $nodeId]);
638
639
        if (null === $resource) {
640
            throw new NotFoundHttpException();
641
        }
642
643
        $resourceNode = $resource->getResourceNode();
644
645
        if (null === $resourceNode) {
646
            throw new NotFoundHttpException();
647
        }
648
649
        $this->denyAccessUnlessGranted(
650
            ResourceNodeVoter::VIEW,
651
            $resourceNode,
652
            $this->trans('Unauthorised access to resource')
653
        );
654
655
        $tool = $request->get('tool');
656
        $type = $request->get('type');
657
658
        $params = [
659
            'resource' => $resource,
660
            'tool' => $tool,
661
            'type' => $type,
662
        ];
663
664
        return $this->render('@ChamiloTheme/Resource/preview.html.twig', $params);
665
    }
666
667
    /**
668
     * @Route("/{tool}/{type}/{id}/change_visibility", name="chamilo_core_resource_change_visibility")
669
     */
670
    public function changeVisibilityAction(Request $request): Response
671
    {
672
        $id = $request->get('id');
673
674
        $repository = $this->getRepositoryFromRequest($request);
675
676
        /** @var AbstractResource $resource */
677
        $resource = $repository->getRepository()->findOneBy(['resourceNode' => $id]);
678
679
        if (null === $resource) {
680
            throw new NotFoundHttpException();
681
        }
682
683
        $resourceNode = $resource->getResourceNode();
684
685
        $this->denyAccessUnlessGranted(
686
            ResourceNodeVoter::EDIT,
687
            $resourceNode,
688
            $this->trans('Unauthorised access to resource')
689
        );
690
691
        /** @var ResourceLink $link */
692
        if ($this->hasCourse()) {
693
            $link = $resource->getCourseSessionResourceLink($this->getCourse(), $this->getSession());
694
        } else {
695
            $link = $resource->getFirstResourceLink();
696
        }
697
698
        $icon = 'fa-eye';
699
        // Use repository to change settings easily.
700
        if ($link && $link->getVisibility() === ResourceLink::VISIBILITY_PUBLISHED) {
701
            $repository->setVisibilityDraft($resource);
702
            $icon = 'fa-eye-slash';
703
        } else {
704
            $repository->setVisibilityPublished($resource);
705
        }
706
707
        $result = ['icon' => $icon];
708
709
        return new JsonResponse($result);
710
    }
711
712
    /**
713
     * @Route("/{tool}/{type}/{id}", name="chamilo_core_resource_delete")
714
     */
715
    public function deleteAction(Request $request): Response
716
    {
717
        $em = $this->getDoctrine()->getManager();
718
719
        $id = $request->get('id');
720
        $resourceNode = $this->getDoctrine()->getRepository('ChamiloCoreBundle:Resource\ResourceNode')->find($id);
721
        $parentId = $resourceNode->getParent()->getId();
722
723
        if (null === $resourceNode) {
724
            throw new NotFoundHttpException();
725
        }
726
727
        $this->denyAccessUnlessGranted(
728
            ResourceNodeVoter::DELETE,
729
            $resourceNode,
730
            $this->trans('Unauthorised access to resource')
731
        );
732
733
        $em->remove($resourceNode);
734
        $this->addFlash('success', $this->trans('Deleted'));
735
        $em->flush();
736
737
        $routeParams = $this->getResourceParams($request);
738
        $routeParams['id'] = $parentId;
739
740
        return $this->redirectToRoute(
741
            'chamilo_core_resource_list',
742
            $routeParams
743
        );
744
    }
745
746
    /**
747
     * @Route("/{tool}/{type}/{id}", methods={"DELETE"}, name="chamilo_core_resource_delete_mass")
748
     */
749
    public function deleteMassAction($primaryKeys, $allPrimaryKeys, Request $request): Response
750
    {
751
        $em = $this->getDoctrine()->getManager();
752
        $repo = $this->getRepositoryFromRequest($request);
753
754
        $parentId = 0;
755
        foreach ($primaryKeys as $id) {
756
            $resource = $repo->find($id);
757
            $resourceNode = $resource->getResourceNode();
758
759
            if (null === $resourceNode) {
760
                continue;
761
            }
762
763
            $this->denyAccessUnlessGranted(
764
                ResourceNodeVoter::DELETE,
765
                $resourceNode,
766
                $this->trans('Unauthorised access to resource')
767
            );
768
769
            $parentId = $resourceNode->getParent()->getId();
770
            $em->remove($resource);
771
        }
772
773
        $this->addFlash('success', $this->trans('Deleted'));
774
        $em->flush();
775
776
        $routeParams = $this->getResourceParams($request);
777
        $routeParams['id'] = $parentId;
778
779
        return $this->redirectToRoute('chamilo_core_resource_list', $routeParams);
780
    }
781
782
    /**
783
     * Shows the associated resource file.
784
     *
785
     * @Route("/{tool}/{type}/{id}/view", methods={"GET"}, name="chamilo_core_resource_view")
786
     */
787
    public function viewAction(Request $request, Glide $glide): Response
788
    {
789
        $id = $request->get('id');
790
        $filter = $request->get('filter');
791
        $mode = $request->get('mode');
792
        $em = $this->getDoctrine();
793
        $resourceNode = $em->getRepository('ChamiloCoreBundle:Resource\ResourceNode')->find($id);
794
795
        if ($resourceNode === null) {
796
            throw new FileNotFoundException('Resource not found');
797
        }
798
799
        return $this->showFile($request, $resourceNode, $mode, $glide, $filter);
800
    }
801
802
    /**
803
     * Gets a document when calling route resources_document_get_file.
804
1     *
805
     * @deprecated
806
     *
807
     * @throws \League\Flysystem\FileNotFoundException
808
     */
809
    public function getDocumentAction(Request $request, Glide $glide): Response
810
    {
811
        /*$file = $request->get('file');
812
        $mode = $request->get('mode');
813
814
        // see list of filters in config/services.yaml
815
        $filter = $request->get('filter');
816
        $mode = !empty($mode) ? $mode : 'show';
817
818
        $repository = $this->getRepository('document', 'files');
819
        $nodeRepository = $repository->getResourceNodeRepository();
820
821
        $title = basename($file);
822
        // @todo improve criteria to avoid giving the wrong file.
823
        $criteria = ['slug' => $title];
824
825
        $resourceNode = $nodeRepository->findOneBy($criteria);
826
827
        if (null === $resourceNode) {
828
            throw new NotFoundHttpException();
829
        }
830
831
        return $this->showFile($request, $resourceNode, $mode, $glide,$filter);*/
832
    }
0 ignored issues
show
Bug Best Practice introduced by
In this branch, the function will implicitly return null which is incompatible with the type-hinted return Symfony\Component\HttpFoundation\Response. Consider adding a return statement or allowing null as return value.

For hinted functions/methods where all return statements with the correct type are only reachable via conditions, ?null? gets implicitly returned which may be incompatible with the hinted type. Let?s take a look at an example:

interface ReturnsInt {
    public function returnsIntHinted(): int;
}

class MyClass implements ReturnsInt {
    public function returnsIntHinted(): int
    {
        if (foo()) {
            return 123;
        }
        // here: null is implicitly returned
    }
}
Loading history...
833
834
    /**
835
     * @Route("/{tool}/{type}/{id}/download", methods={"GET"}, name="chamilo_core_resource_download")
836
     */
837
    public function downloadAction(Request $request)
838
    {
839
        $resourceNodeId = (int) $request->get('id');
840
        $courseNode = $this->getCourse()->getResourceNode();
841
842
        $repo = $this->getRepositoryFromRequest($request);
843
844
        if (empty($resourceNodeId)) {
845
            $resourceNode = $courseNode;
846
        } else {
847
            $resourceNode = $repo->getResourceNodeRepository()->find($resourceNodeId);
848
        }
849
850
        $type = $repo->getResourceType();
851
852
        if (null === $resourceNode) {
853
            throw new NotFoundHttpException();
854
        }
855
856
        $this->denyAccessUnlessGranted(
857
            ResourceNodeVoter::VIEW,
858
            $resourceNode,
859
            $this->trans('Unauthorised access to resource')
860
        );
861
862
        // If resource node has a file just download it. Don't download the children.
863
        if ($resourceNode->hasResourceFile()) {
864
            // Redirect to download single file.
865
            return $this->showFile($request, $resourceNode, 'download');
866
        }
867
868
        $zipName = $resourceNode->getSlug().'.zip';
869
        $rootNodePath = $resourceNode->getPathForDisplay();
870
871
        $resourceNodeRepo = $repo->getResourceNodeRepository();
872
873
        $criteria = Criteria::create()
874
            ->where(Criteria::expr()->neq('resourceFile', null)) // must have a file
875
           // ->andWhere(Criteria::expr()->eq('resourceType', $type))
876
        ;
877
878
        /** @var ArrayCollection|ResourceNode[] $children */
879
        /** @var QueryBuilder $children */
880
        $qb = $resourceNodeRepo->getChildrenQueryBuilder($resourceNode);
881
        $qb->addCriteria($criteria);
882
        $children = $qb->getQuery()->getResult();
883
884
        $response = new StreamedResponse(function () use ($rootNodePath, $zipName, $children, $repo) {
885
            // Define suitable options for ZipStream Archive.
886
            $options = new Archive();
887
            $options->setContentType('application/octet-stream');
888
            //initialise zipstream with output zip filename and options.
889
            $zip = new ZipStream($zipName, $options);
890
891
            /** @var ResourceNode $node */
892
            foreach ($children as $node) {
893
                $resourceFile = $node->getResourceFile();
894
                $systemName = $resourceFile->getFile()->getPathname();
895
                $stream = $repo->getResourceNodeFileStream($node);
896
                //error_log($node->getPathForDisplay());
897
                $fileToDisplay = str_replace($rootNodePath, '', $node->getPathForDisplay());
898
                $zip->addFileFromStream($fileToDisplay, $stream);
899
            }
900
            $zip->finish();
901
        });
902
903
        $disposition = $response->headers->makeDisposition(
904
            ResponseHeaderBag::DISPOSITION_ATTACHMENT,
905
            Transliterator::transliterate($zipName)
906
        );
907
        $response->headers->set('Content-Disposition', $disposition);
908
        $response->headers->set('Content-Type', 'application/octet-stream');
909
910
        return $response;
911
    }
912
913
    /**
914
     * Upload form.
915
     *
916
     * @Route("/{tool}/{type}/{id}/upload", name="chamilo_core_resource_upload", methods={"GET", "POST"},
917
     *                                      options={"expose"=true})
918
     */
919
    public function uploadAction(Request $request, $tool, $type, $id): Response
920
    {
921
        $repository = $this->getRepositoryFromRequest($request);
922
        $resourceNode = $repository->getResourceNodeRepository()->find($id);
923
924
        $this->denyAccessUnlessGranted(
925
            ResourceNodeVoter::EDIT,
926
            $resourceNode,
927
            $this->trans('Unauthorised access to resource')
928
        );
929
930
        $this->setBreadCrumb($request);
931
932
        $routeParams = $this->getResourceParams($request);
933
        $routeParams['tool'] = $tool;
934
        $routeParams['type'] = $type;
935
        $routeParams['id'] = $id;
936
937
        return $this->render(
938
            '@ChamiloTheme/Resource/upload.html.twig',
939
            $routeParams
940
        );
941
    }
942
943
    public function setBreadCrumb(Request $request)
944
    {
945
        $tool = $request->get('tool');
946
        $type = $request->get('type');
947
        $resourceNodeId = $request->get('id');
948
949
        $routeParams = $this->getResourceParams($request);
950
951
        if (!empty($resourceNodeId)) {
952
            $breadcrumb = $this->getBreadCrumb();
953
            $toolParams = $routeParams;
954
            $toolParams['id'] = null;
955
956
            // Root tool link
957
            $breadcrumb->addChild(
958
                $this->trans($tool),
959
                [
960
                    'uri' => $this->generateUrl(
961
                        'chamilo_core_resource_index',
962
                        $toolParams
963
                    ),
964
                ]
965
            );
966
967
            $repo = $this->getRepositoryFromRequest($request);
968
969
            /** @var AbstractResource $parent */
970
            $originalResource = $repo->findOneBy(['resourceNode' => $resourceNodeId]);
971
            if ($originalResource === null) {
972
                return;
973
            }
974
            $parent = $originalParent = $originalResource->getResourceNode();
975
976
            $parentList = [];
977
            while ($parent !== null) {
978
                if ($type !== $parent->getResourceType()->getName()) {
979
                    break;
980
                }
981
                $parent = $parent->getParent();
982
                if ($parent) {
983
                    $resource = $repo->findOneBy(['resourceNode' => $parent->getId()]);
984
                    if ($resource) {
985
                        $parentList[] = $resource;
986
                    }
987
                }
988
            }
989
990
            $parentList = array_reverse($parentList);
991
            /** @var AbstractResource $item */
992
            foreach ($parentList as $item) {
993
                $params = $routeParams;
994
                $params['id'] = $item->getResourceNode()->getId();
995
                $breadcrumb->addChild(
996
                    $item->getResourceName(),
997
                    [
998
                        'uri' => $this->generateUrl(
999
                            'chamilo_core_resource_list',
1000
                            $params
1001
                        ),
1002
                    ]
1003
                );
1004
            }
1005
1006
            $params = $routeParams;
1007
            $params['id'] = $originalParent->getId();
1008
1009
            $breadcrumb->addChild(
1010
                $originalResource->getResourceName(),
0 ignored issues
show
Bug introduced by
The method getResourceName() does not exist on Chamilo\CoreBundle\Entit...source\AbstractResource. Did you maybe mean getResourceNode()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

1010
                $originalResource->/** @scrutinizer ignore-call */ 
1011
                                   getResourceName(),

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
1011
                [
1012
                    'uri' => $this->generateUrl(
1013
                        'chamilo_core_resource_list',
1014
                        $params
1015
                    ),
1016
                ]
1017
            );
1018
        }
1019
    }
1020
1021
    private function getParentResourceNode(Request $request): ResourceNode
1022
    {
1023
        $parentNodeId = $request->get('id');
1024
1025
        $parentResourceNode = null;
1026
1027
        if (empty($parentNodeId)) {
1028
            if ($this->hasCourse()) {
1029
                $parentResourceNode = $this->getCourse()->getResourceNode();
1030
            } else {
1031
                if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
1032
                    /** @var User $user */
1033
                    $parentResourceNode = $this->getUser()->getResourceNode();
1034
                }
1035
            }
1036
        } else {
1037
            $repo = $this->getDoctrine()->getRepository('ChamiloCoreBundle:Resource\ResourceNode');
1038
            $parentResourceNode = $repo->find($parentNodeId);
1039
        }
1040
1041
        if (null === $parentResourceNode) {
1042
            throw new AccessDeniedException();
1043
        }
1044
1045
        return $parentResourceNode;
1046
    }
1047
1048
    /**
1049
     * @param string $mode
1050
     * @param string $filter
1051
     *
1052
     * @return mixed|StreamedResponse
1053
     */
1054
    private function showFile(Request $request, ResourceNode $resourceNode, $mode = 'show', Glide $glide = null, $filter = '')
1055
    {
1056
        $this->denyAccessUnlessGranted(
1057
            ResourceNodeVoter::VIEW,
1058
            $resourceNode,
1059
            $this->trans('Unauthorised access to resource')
1060
        );
1061
1062
        $repo = $this->getRepositoryFromRequest($request);
1063
        $resourceFile = $resourceNode->getResourceFile();
1064
1065
        if (!$resourceFile) {
0 ignored issues
show
introduced by
$resourceFile is of type Chamilo\CoreBundle\Entity\Resource\ResourceFile, thus it always evaluated to true.
Loading history...
1066
            throw new NotFoundHttpException($this->trans('File not found for resource'));
1067
        }
1068
1069
        //$fileName = $resourceFile->getOriginalName();
1070
        $fileName = $resourceNode->getSlug();
1071
        $filePath = $resourceFile->getFile()->getPathname();
1072
        $mimeType = $resourceFile->getMimeType();
1073
1074
        switch ($mode) {
1075
            case 'download':
1076
                $forceDownload = true;
1077
                break;
1078
            case 'show':
1079
            default:
1080
                $forceDownload = false;
1081
                // If it's an image then send it to Glide.
1082
                if (strpos($mimeType, 'image') !== false) {
1083
                    $server = $glide->getServer();
0 ignored issues
show
Bug introduced by
The method getServer() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

1083
                    /** @scrutinizer ignore-call */ 
1084
                    $server = $glide->getServer();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
1084
                    $params = $request->query->all();
1085
1086
                    // The filter overwrites the params from get
1087
                    if (!empty($filter)) {
1088
                        $params = $glide->getFilters()[$filter] ?? [];
1089
                    }
1090
1091
                    // The image was cropped manually by the user, so we force to render this version,
1092
                    // no matter other crop parameters.
1093
                    $crop = $resourceFile->getCrop();
1094
                    if (!empty($crop)) {
1095
                        $params['crop'] = $crop;
1096
                    }
1097
1098
                    return $server->getImageResponse($filePath, $params);
1099
                }
1100
                break;
1101
        }
1102
1103
        $stream = $repo->getResourceNodeFileStream($resourceNode);
1104
1105
        //$stream = $this->fs->readStream($resourceNode);
1106
        $response = new StreamedResponse(function () use ($stream): void {
1107
            stream_copy_to_stream($stream, fopen('php://output', 'wb'));
0 ignored issues
show
Bug introduced by
It seems like fopen('php://output', 'wb') can also be of type false; however, parameter $dest of stream_copy_to_stream() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1107
            stream_copy_to_stream($stream, /** @scrutinizer ignore-type */ fopen('php://output', 'wb'));
Loading history...
Bug introduced by
It seems like $stream can also be of type string; however, parameter $source of stream_copy_to_stream() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1107
            stream_copy_to_stream(/** @scrutinizer ignore-type */ $stream, fopen('php://output', 'wb'));
Loading history...
1108
        });
1109
        $disposition = $response->headers->makeDisposition(
1110
            $forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
1111
            $fileName
1112
            //Transliterator::transliterate($fileName)
1113
        );
1114
        $response->headers->set('Content-Disposition', $disposition);
1115
        $response->headers->set('Content-Type', $mimeType ?: 'application/octet-stream');
1116
1117
        return $response;
1118
    }
1119
1120
    /**
1121
     * @param string $fileType
1122
     *
1123
     * @return RedirectResponse|Response
1124
     */
1125
    private function createResource(Request $request, $fileType = 'file')
1126
    {
1127
        $resourceNodeParentId = $request->get('id');
1128
1129
        $repository = $this->getRepositoryFromRequest($request);
1130
1131
        // Default parent node is course.
1132
        $parentNode = $this->getParentResourceNode($request);
1133
        //var_dump($parentNode->getPath());
1134
1135
        $this->denyAccessUnlessGranted(
1136
            ResourceNodeVoter::CREATE,
1137
            $parentNode,
1138
            $this->trans('Unauthorised access to resource')
1139
        );
1140
1141
        $form = $repository->getForm($this->container->get('form.factory'), null);
1142
1143
        if ($fileType === 'file') {
1144
            $resourceParams = $this->getResourceParams($request);
1145
            $form->add(
1146
                'content',
1147
                CKEditorType::class,
1148
                [
1149
                    'mapped' => false,
1150
                    'config' => [
1151
                        'filebrowserImageBrowseRoute' => 'resources_filemanager',
1152
                        'filebrowserImageBrowseRouteParameters' => $resourceParams,
1153
                        'fullPage' => true,
1154
                    ],
1155
                ]
1156
            );
1157
        }
1158
1159
        $form->handleRequest($request);
1160
        if ($form->isSubmitted() && $form->isValid()) {
1161
            $em = $this->getDoctrine()->getManager();
1162
1163
            $course = $this->getCourse();
1164
            $session = $this->getSession();
1165
1166
            /** @var AbstractResource $newResource */
1167
            $newResource = $repository->saveResource($form, $course, $session, $fileType);
1168
1169
            $file = null;
1170
            if ($fileType === 'file') {
1171
                $content = $form->get('content')->getViewData();
1172
                $newResource->setTitle($newResource->getTitle().'.html');
0 ignored issues
show
Bug introduced by
The method getTitle() does not exist on Chamilo\CoreBundle\Entit...source\AbstractResource. It seems like you code against a sub-type of Chamilo\CoreBundle\Entit...source\AbstractResource such as Chamilo\CoreBundle\Entity\Course or Chamilo\CourseBundle\Entity\CLink or Chamilo\CourseBundle\Entity\CAnnouncement or Chamilo\CourseBundle\Entity\CQuiz or Chamilo\CourseBundle\Entity\CDocument or Chamilo\CourseBundle\Entity\CQuizQuestionCategory. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

1172
                $newResource->setTitle($newResource->/** @scrutinizer ignore-call */ getTitle().'.html');
Loading history...
Bug introduced by
The method setTitle() does not exist on Chamilo\CoreBundle\Entit...source\AbstractResource. It seems like you code against a sub-type of Chamilo\CoreBundle\Entit...source\AbstractResource such as Chamilo\CoreBundle\Entity\Course or Chamilo\CourseBundle\Entity\CLink or Chamilo\CourseBundle\Entity\CAnnouncement or Chamilo\CourseBundle\Entity\CQuiz or Chamilo\CourseBundle\Entity\CDocument or Chamilo\CourseBundle\Entity\CQuizQuestionCategory. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

1172
                $newResource->/** @scrutinizer ignore-call */ 
1173
                              setTitle($newResource->getTitle().'.html');
Loading history...
1173
                $fileName = $newResource->getTitle();
1174
1175
                $handle = tmpfile();
1176
                fwrite($handle, $content);
0 ignored issues
show
Bug introduced by
It seems like $handle can also be of type false; however, parameter $handle of fwrite() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1176
                fwrite(/** @scrutinizer ignore-type */ $handle, $content);
Loading history...
1177
                $meta = stream_get_meta_data($handle);
0 ignored issues
show
Bug introduced by
It seems like $handle can also be of type false; however, parameter $stream of stream_get_meta_data() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

1177
                $meta = stream_get_meta_data(/** @scrutinizer ignore-type */ $handle);
Loading history...
1178
                $file = new UploadedFile($meta['uri'], $fileName, 'text/html', null, true);
1179
                $em->persist($newResource);
1180
            }
1181
1182
            $resourceNode = $repository->createNodeForResource($newResource, $this->getUser(), $parentNode, $file);
1183
            $em->persist($resourceNode);
1184
1185
            $repository->addResourceNodeToCourse(
1186
                $resourceNode,
1187
                ResourceLink::VISIBILITY_PUBLISHED,
1188
                $course,
1189
                $session,
1190
                null
1191
            );
1192
1193
            $em->flush();
1194
1195
            // Loops all sharing options
1196
            /*foreach ($shareList as $share) {
1197
                $idList = [];
1198
                if (isset($share['search'])) {
1199
                    $idList = explode(',', $share['search']);
1200
                }
1201
1202
                $resourceRight = null;
1203
                if (isset($share['mask'])) {
1204
                    $resourceRight = new ResourceRight();
1205
                    $resourceRight
1206
                        ->setMask($share['mask'])
1207
                        ->setRole($share['role'])
1208
                    ;
1209
                }
1210
1211
                // Build links
1212
                switch ($share['sharing']) {
1213
                    case 'everyone':
1214
                        $repository->addResourceToEveryone(
1215
                            $resourceNode,
1216
                            $resourceRight
1217
                        );
1218
                        break;
1219
                    case 'course':
1220
                        $repository->addResourceToCourse(
1221
                            $resourceNode,
1222
                            $course,
1223
                            $resourceRight
1224
                        );
1225
                        break;
1226
                    case 'session':
1227
                        $repository->addResourceToSession(
1228
                            $resourceNode,
1229
                            $course,
1230
                            $session,
1231
                            $resourceRight
1232
                        );
1233
                        break;
1234
                    case 'user':
1235
                        // Only for me
1236
                        if (isset($share['only_me'])) {
1237
                            $repository->addResourceOnlyToMe($resourceNode);
1238
                        } else {
1239
                            // To other users
1240
                            $repository->addResourceToUserList($resourceNode, $idList);
1241
                        }
1242
                        break;
1243
                    case 'group':
1244
                        // @todo
1245
                        break;
1246
                }*/
1247
            //}
1248
            $em->flush();
1249
            $this->addFlash('success', $this->trans('Saved'));
1250
1251
            $params = $this->getResourceParams($request);
1252
            $params['id'] = $resourceNodeParentId;
1253
1254
            return $this->redirectToRoute(
1255
                'chamilo_core_resource_list',
1256
                $params
1257
            );
1258
        }
1259
1260
        switch ($fileType) {
1261
            case 'folder':
1262
                $template = '@ChamiloTheme/Resource/new_folder.html.twig';
1263
                break;
1264
            case 'file':
1265
                $template = '@ChamiloTheme/Resource/new.html.twig';
1266
                break;
1267
        }
1268
1269
        return $this->render(
1270
            $template,
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $template does not seem to be defined for all execution paths leading up to this point.
Loading history...
1271
            [
1272
                'form' => $form->createView(),
1273
                'parent' => $resourceNodeParentId,
1274
                'file_type' => $fileType,
1275
            ]
1276
        );
1277
    }
1278
}
1279