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