Completed
Push — master ( 6c15b7...f5f8be )
by Sander
12:00
created

MediaBundle/Controller/MediaController.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Kunstmaan\MediaBundle\Controller;
4
5
use Exception;
6
use Kunstmaan\AdminBundle\FlashMessages\FlashTypes;
7
use Kunstmaan\MediaBundle\Entity\Folder;
8
use Kunstmaan\MediaBundle\Entity\Media;
9
use Kunstmaan\MediaBundle\Form\BulkMoveMediaType;
10
use Kunstmaan\MediaBundle\Helper\MediaManager;
11
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
12
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
13
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
14
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
15
use Symfony\Component\HttpFoundation\File\File;
16
use Symfony\Component\HttpFoundation\JsonResponse;
17
use Symfony\Component\HttpFoundation\RedirectResponse;
18
use Symfony\Component\HttpFoundation\Request;
19
use Symfony\Component\HttpFoundation\Response;
20
21
/**
22
 * MediaController
23
 */
24
class MediaController extends Controller
25
{
26
    /**
27
     * @param Request $request
28
     * @param int     $mediaId
29
     *
30
     * @Route("/{mediaId}", requirements={"mediaId" = "\d+"}, name="KunstmaanMediaBundle_media_show")
31
     *
32
     * @return Response
33
     */
34
    public function showAction(Request $request, $mediaId)
35
    {
36
        $em = $this->getDoctrine()->getManager();
37
38
        /* @var Media $media */
39
        $media = $em->getRepository('KunstmaanMediaBundle:Media')->getMedia($mediaId);
40
        $folder = $media->getFolder();
41
42
        /* @var MediaManager $mediaManager */
43
        $mediaManager = $this->get('kunstmaan_media.media_manager');
44
        $handler = $mediaManager->getHandler($media);
45
        $helper = $handler->getFormHelper($media);
46
47
        $form = $this->createForm($handler->getFormType(), $helper, $handler->getFormTypeOptions());
48
49
        if ($request->isMethod('POST')) {
50
            $form->handleRequest($request);
51
            if ($form->isSubmitted() && $form->isValid()) {
52
                $media = $helper->getMedia();
53
                $em->getRepository('KunstmaanMediaBundle:Media')->save($media);
54
55
                return new RedirectResponse(
56
                    $this->generateUrl(
57
                        'KunstmaanMediaBundle_media_show',
58
                        ['mediaId' => $media->getId()]
59
                    )
60
                );
61
            }
62
        }
63
        $showTemplate = $mediaManager->getHandler($media)->getShowTemplate($media);
64
65
        return $this->render(
66
            $showTemplate,
67
            [
68
                'handler' => $handler,
69
                'foldermanager' => $this->get('kunstmaan_media.folder_manager'),
70
                'mediamanager' => $this->get('kunstmaan_media.media_manager'),
71
                'editform' => $form->createView(),
72
                'media' => $media,
73
                'helper' => $helper,
74
                'folder' => $folder,
75
            ]
76
        );
77
    }
78
79
    /**
80
     * @param Request $request
81
     * @param int     $mediaId
82
     *
83
     * @Route("/delete/{mediaId}", requirements={"mediaId" = "\d+"}, name="KunstmaanMediaBundle_media_delete")
84
     *
85
     * @return RedirectResponse
86
     */
87
    public function deleteAction(Request $request, $mediaId)
88
    {
89
        $em = $this->getDoctrine()->getManager();
90
91
        /* @var Media $media */
92
        $media = $em->getRepository('KunstmaanMediaBundle:Media')->getMedia($mediaId);
93
        $medianame = $media->getName();
94
        $folder = $media->getFolder();
95
96
        $em->getRepository('KunstmaanMediaBundle:Media')->delete($media);
97
98
        $this->addFlash(
99
            FlashTypes::SUCCESS,
100
            $this->get('translator')->trans(
101
                'kuma_admin.media.flash.deleted_success.%medianame%',
102
                [
103
                    '%medianame%' => $medianame,
104
                ]
105
            )
106
        );
107
108
        // If the redirect url is passed via the url we use it
109
        $redirectUrl = $request->query->get('redirectUrl');
110
        if (empty($redirectUrl) || (\strpos($redirectUrl, $request->getSchemeAndHttpHost()) !== 0 && \strpos($redirectUrl, '/') !== 0)) {
111
            $redirectUrl = $this->generateUrl(
112
                'KunstmaanMediaBundle_folder_show',
113
                ['folderId' => $folder->getId()]
114
            );
115
        }
116
117
        return new RedirectResponse($redirectUrl);
118
    }
119
120
    /**
121
     * @param int $folderId
122
     *
123
     * @Route("bulkupload/{folderId}", requirements={"folderId" = "\d+"}, name="KunstmaanMediaBundle_media_bulk_upload")
124
     * @Template("@KunstmaanMedia/Media/bulkUpload.html.twig")
125
     *
126
     * @return array|RedirectResponse
127
     */
128
    public function bulkUploadAction($folderId)
129
    {
130
        $em = $this->getDoctrine()->getManager();
131
132
        /* @var Folder $folder */
133
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
134
135
        return ['folder' => $folder];
136
    }
137
138
    /**
139
     * @param Request $request
140
     * @param int     $folderId
141
     *
142
     * @Route("bulkuploadsubmit/{folderId}", requirements={"folderId" = "\d+"}, name="KunstmaanMediaBundle_media_bulk_upload_submit")
143
     *
144
     * @return JsonResponse
145
     */
146
    public function bulkUploadSubmitAction(Request $request, $folderId)
147
    {
148
        // Settings
149
        if (\ini_get('upload_tmp_dir')) {
150
            $tempDir = \ini_get('upload_tmp_dir');
151
        } else {
152
            $tempDir = \sys_get_temp_dir();
153
        }
154
        $targetDir = \rtrim($tempDir, '/').DIRECTORY_SEPARATOR.'plupload';
155
        $cleanupTargetDir = true; // Remove old files
156
        $maxFileAge = 5 * 60 * 60; // Temp file age in seconds
157
158
        // Create target dir
159
        if (!\file_exists($targetDir)) {
160
            @\mkdir($targetDir);
161
        }
162
163
        // Get a file name
164
        if ($request->request->has('name')) {
165
            $fileName = $request->request->get('name');
166
        } elseif (0 !== $request->files->count()) {
167
            $fileName = $request->files->get('file')['name'];
168
        } else {
169
            $fileName = \uniqid('file_', false);
170
        }
171
        $filePath = $targetDir.DIRECTORY_SEPARATOR.$fileName;
172
173
        $chunk = 0;
174
        $chunks = 0;
175
        // Chunking might be enabled
176
        if ($request->request->has('chunk')) {
177
            $chunk = $request->request->getInt('chunk');
178
        }
179
        if ($request->request->has('chunks')) {
180
            $chunks = $request->request->getInt('chunks');
181
        }
182
183
        // Remove old temp files
184
        if ($cleanupTargetDir) {
185
            if (!\is_dir($targetDir) || !$dir = \opendir($targetDir)) {
186
                return $this->returnJsonError('100', 'Failed to open temp directory.');
187
            }
188
189
            while (($file = \readdir($dir)) !== false) {
190
                $tmpFilePath = $targetDir.DIRECTORY_SEPARATOR.$file;
191
192
                // If temp file is current file proceed to the next
193
                if ($tmpFilePath === "{$filePath}.part") {
194
                    continue;
195
                }
196
197
                // Remove temp file if it is older than the max age and is not the current file
198
                if (\preg_match('/\.part$/', $file) && (\filemtime($tmpFilePath) < \time() - $maxFileAge)) {
199
                    $success = @\unlink($tmpFilePath);
200
                    if ($success !== true) {
201
                        return $this->returnJsonError('106', 'Could not remove temp file: '.$filePath);
202
                    }
203
                }
204
            }
205
            \closedir($dir);
206
        }
207
208
        // Open temp file
209
        if (!$out = @\fopen("{$filePath}.part", $chunks ? 'ab' : 'wb')) {
210
            return $this->returnJsonError('102', 'Failed to open output stream.');
211
        }
212
213
        if (0 !== $request->files->count()) {
214
            $_file = $request->files->get('file');
215
            if ($_file->getError() > 0 || !\is_uploaded_file($_file->getRealPath())) {
216
                return $this->returnJsonError('103', 'Failed to move uploaded file.');
217
            }
218
219
            // Read binary input stream and append it to temp file
220
            if (!$input = @\fopen($_file->getRealPath(), 'rb')) {
221
                return $this->returnJsonError('101', 'Failed to open input stream.');
222
            }
223
        } else {
224
            if (!$input = @\fopen('php://input', 'rb')) {
225
                return $this->returnJsonError('101', 'Failed to open input stream.');
226
            }
227
        }
228
229
        while ($buff = \fread($input, 4096)) {
230
            \fwrite($out, $buff);
231
        }
232
233
        @\fclose($out);
234
        @\fclose($input);
235
236
        // Check if file has been uploaded
237
        if (!$chunks || $chunk === $chunks - 1) {
238
            // Strip the temp .part suffix off
239
            \rename("{$filePath}.part", $filePath);
240
        }
241
242
        $em = $this->getDoctrine()->getManager();
243
        /* @var Folder $folder */
244
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
245
        $file = new File($filePath);
246
247
        try {
248
            /* @var Media $media */
249
            $media = $this->get('kunstmaan_media.media_manager')->getHandler($file)->createNew($file);
250
            $media->setFolder($folder);
251
            $em->getRepository(Media::class)->save($media);
252
        } catch (Exception $e) {
253
            return $this->returnJsonError('104', 'Failed performing save on media-manager');
254
        }
255
256
        $success = \unlink($filePath);
257
        if ($success !== true) {
258
            return $this->returnJsonError('105', 'Could not remove temp file: '.$filePath);
259
        }
260
261
        // Send headers making sure that the file is not cached (as it happens for example on iOS devices)
262
        $response = new JsonResponse(
263
            [
264
                'jsonrpc' => '2.0',
265
                'result' => '',
266
                'id' => 'id',
267
            ], JsonResponse::HTTP_OK, [
268
                'Expires' => 'Mon, 26 Jul 1997 05:00:00 GMT',
269
                'Last-Modified' => \gmdate('D, d M Y H:i:s').' GMT',
270
                'Cache-Control' => 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
271
                'Pragma' => 'no-cache',
272
            ]
273
        );
274
275
        return $response;
276
    }
277
278
    private function returnJsonError($code, $message)
279
    {
280
        return new JsonResponse(
281
            [
282
                'jsonrpc' => '2.0',
283
                'error ' => [
284
                    'code' => $code,
285
                    'message' => $message,
286
                ],
287
                'id' => 'id',
288
            ]
289
        );
290
    }
291
292
    /**
293
     * @param Request $request
294
     * @param int     $folderId
295
     *
296
     * @Route("drop/{folderId}", requirements={"folderId" = "\d+"}, name="KunstmaanMediaBundle_media_drop_upload")
297
     * @Method({"GET", "POST"})
298
     *
299
     * @return JsonResponse
300
     */
301
    public function dropAction(Request $request, $folderId)
302
    {
303
        $em = $this->getDoctrine()->getManager();
304
305
        /* @var Folder $folder */
306
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
307
308
        $drop = null;
309
310
        if ($request->files->has('files') && $request->files->get('files')['error'] === 0) {
311
            $drop = $request->files->get('files');
312
        } else {
313
            if ($request->files->get('file')) {
314
                $drop = $request->files->get('file');
315
            } else {
316
                $drop = $request->get('text');
317
            }
318
        }
319
        $media = $this->get('kunstmaan_media.media_manager')->createNew($drop);
320
        if ($media) {
321
            $media->setFolder($folder);
322
            $em->getRepository('KunstmaanMediaBundle:Media')->save($media);
323
324
            return new JsonResponse(['status' => $this->get('translator')->trans('kuma_admin.media.flash.drop_success')]);
325
        }
326
327
        $request->getSession()->getFlashBag()->add(
328
            FlashTypes::DANGER,
329
            $this->get('translator')->trans('kuma_admin.media.flash.drop_unrecognized')
330
        );
331
332
        return new JsonResponse(['status' => $this->get('translator')->trans('kuma_admin.media.flash.drop_unrecognized')]);
333
    }
334
335
    /**
336
     * @param Request $request
337
     * @param int     $folderId The folder id
338
     * @param string  $type     The type
339
     *
340
     * @Route("create/{folderId}/{type}", requirements={"folderId" = "\d+", "type" = ".+"}, name="KunstmaanMediaBundle_media_create")
341
     * @Method({"GET", "POST"})
342
     * @Template("@KunstmaanMedia/Media/create.html.twig")
343
     *
344
     * @return array|RedirectResponse
345
     */
346
    public function createAction(Request $request, $folderId, $type)
347
    {
348
        return $this->createAndRedirect($request, $folderId, $type, 'KunstmaanMediaBundle_folder_show');
349
    }
350
351
    /**
352
     * @param Request $request
353
     * @param int     $folderId    The folder Id
354
     * @param string  $type        The type
355
     * @param string  $redirectUrl The url where we want to redirect to on success
356
     * @param array   $extraParams The extra parameters that will be passed wen redirecting
357
     *
358
     * @return array|RedirectResponse
359
     */
360
    private function createAndRedirect(Request $request, $folderId, $type, $redirectUrl, $extraParams = [], $isInModal = false)
361
    {
362
        $em = $this->getDoctrine()->getManager();
363
364
        /* @var Folder $folder */
365
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
366
367
        /* @var MediaManager $mediaManager */
368
        $mediaManager = $this->get('kunstmaan_media.media_manager');
369
        $handler = $mediaManager->getHandlerForType($type);
370
        $media = new Media();
371
        $helper = $handler->getFormHelper($media);
372
373
        $form = $this->createForm($handler->getFormType(), $helper, $handler->getFormTypeOptions());
374
375
        if ($request->isMethod('POST')) {
376
            $params = ['folderId' => $folder->getId()];
377
            $params = \array_merge($params, $extraParams);
378
379
            $form->handleRequest($request);
380
381
            if ($form->isSubmitted() && $form->isValid()) {
382
                $media = $helper->getMedia();
383
                $media->setFolder($folder);
384
                $em->getRepository('KunstmaanMediaBundle:Media')->save($media);
385
386
                $this->addFlash(
387
                    FlashTypes::SUCCESS,
388
                    $this->get('translator')->trans(
389
                        'media.flash.created',
390
                        [
391
                            '%medianame%' => $media->getName(),
392
                        ]
393
                    )
394
                );
395
396
                return new RedirectResponse($this->generateUrl($redirectUrl, $params));
397
            }
398
399
            if ($isInModal) {
400
                $this->addFlash(
401
                    FlashTypes::ERROR,
402
                    $this->get('translator')->trans(
403
                        'media.flash.not_created',
404
                        [
405
                            '%mediaerrors%' => $form->getErrors(true, true),
406
                        ]
407
                    )
408
                );
409
410
                return new RedirectResponse($this->generateUrl($redirectUrl, $params));
411
            }
412
        }
413
414
        return [
415
            'type' => $type,
416
            'form' => $form->createView(),
417
            'folder' => $folder,
418
        ];
419
    }
420
421
    /**
422
     * @param Request $request
423
     * @param int     $folderId The folder id
424
     * @param string  $type     The type
425
     *
426
     * @Route("create/modal/{folderId}/{type}", requirements={"folderId" = "\d+", "type" = ".+"}, name="KunstmaanMediaBundle_media_modal_create")
427
     * @Method({"POST"})
428
     *
429
     * @return array|RedirectResponse
430
     */
431
    public function createModalAction(Request $request, $folderId, $type)
432
    {
433
        $cKEditorFuncNum = $request->get('CKEditorFuncNum');
434
        $linkChooser = $request->get('linkChooser');
435
436
        $extraParams = [];
437
        if (!empty($cKEditorFuncNum)) {
438
            $extraParams['CKEditorFuncNum'] = $cKEditorFuncNum;
439
        }
440
        if (!empty($linkChooser)) {
441
            $extraParams['linkChooser'] = $linkChooser;
442
        }
443
444
        return $this->createAndRedirect(
445
            $request,
446
            $folderId,
447
            $type,
448
            'KunstmaanMediaBundle_chooser_show_folder',
449
            $extraParams,
450
            true
451
        );
452
    }
453
454
    /**
455
     * @param Request $request
456
     *
457
     * @Route("move/", name="KunstmaanMediaBundle_media_move")
458
     * @Method({"POST"})
459
     *
460
     * @return string
0 ignored issues
show
Should the return type not be JsonResponse?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
461
     */
462
    public function moveMedia(Request $request)
463
    {
464
        @trigger_error(sprintf('The "%s" controller action is deprecated in KunstmaanMediaBundle 5.1 and will be removed in KunstmaanMediaBundle 6.0.', __METHOD__), E_USER_DEPRECATED);
465
466
        $mediaId = $request->request->get('mediaId');
467
        $folderId = $request->request->get('folderId');
468
469
        if (empty($mediaId) || empty($folderId)) {
470
            return new JsonResponse(['error' => ['title' => 'Missing media id or folder id']], 400);
471
        }
472
473
        $em = $this->getDoctrine()->getManager();
474
        $mediaRepo = $em->getRepository('KunstmaanMediaBundle:Media');
475
476
        $media = $mediaRepo->getMedia($mediaId);
477
        $folder = $em->getRepository('KunstmaanMediaBundle:Folder')->getFolder($folderId);
478
479
        $media->setFolder($folder);
480
        $mediaRepo->save($media);
481
482
        return new JsonResponse();
483
    }
484
485
    /**
486
     * @Route("/bulk-move", name="KunstmaanMediaBundle_media_bulk_move")
487
     *
488
     * @param Request $request
489
     *
490
     * @return JsonResponse|Response
491
     *
492
     * @throws \Doctrine\DBAL\DBALException
493
     */
494
    public function bulkMoveAction(Request $request)
495
    {
496
        $em = $this->getDoctrine()->getManager();
497
        $mediaRepo = $em->getRepository('KunstmaanMediaBundle:Media');
498
        $form = $this->createForm(BulkMoveMediaType::class);
499
500
        $form->handleRequest($request);
501
502
        if ($form->isSubmitted() && $form->isValid()) {
503
            /** @var Folder $folder */
504
            $folder = $form->getData()['folder'];
505
            $mediaIds = explode(',', $form->getData()['media']);
506
507
            $mediaRepo->createQueryBuilder('m')
508
                ->update()
509
                ->set('m.folder', $folder->getId())
510
                ->where('m.id in (:mediaIds)')
511
                ->setParameter('mediaIds', $mediaIds)
512
                ->getQuery()
513
                ->execute();
514
515
            $this->addFlash(FlashTypes::SUCCESS, $this->get('translator')->trans('media.folder.bulk_move.success.text'));
516
517
            return new JsonResponse(
518
                [
519
                    'Success' => 'The media is moved',
520
                ]
521
            );
522
        }
523
524
        return $this->render(
525
            '@KunstmaanMedia/Folder/bulk-move-modal_form.html.twig',
526
            [
527
                'form' => $form->createView(),
528
            ]
529
        );
530
    }
531
}
532