Issues (281)

Branch: master

Modules/MediaLibrary/Ajax/MediaItemFindAll.php (1 issue)

1
<?php
2
3
namespace Backend\Modules\MediaLibrary\Ajax;
4
5
use Backend\Core\Engine\Base\AjaxAction as BackendBaseAJAXAction;
6
use Backend\Core\Language\Language;
7
use Backend\Modules\MediaLibrary\Domain\MediaFolder\Exception\MediaFolderNotFound;
8
use Backend\Modules\MediaLibrary\Domain\MediaFolder\MediaFolder;
9
use Backend\Modules\MediaLibrary\Domain\MediaGroup\Exception\MediaGroupNotFound;
10
use Backend\Modules\MediaLibrary\Domain\MediaGroup\MediaGroup;
11
use Backend\Modules\MediaLibrary\Domain\MediaItem\AspectRatio;
12
use Backend\Modules\MediaLibrary\Domain\MediaItem\MediaItem;
13
use Common\Exception\AjaxExitException;
14
use Symfony\Component\HttpFoundation\Response;
15
16
/**
17
 * This AJAX-action will get all media items in a certain folder and from a gallery.
18
 */
19
class MediaItemFindAll extends BackendBaseAJAXAction
20
{
21
    /** @var string */
22
    protected $selectedTab = 'image';
23
24
    public function execute(): void
25
    {
26
        parent::execute();
27
28
        $mediaFolder = $this->getMediaFolderBasedOnMediaGroup();
29
        $aspectRatio = $this->getAspectRatio();
30
        $searchQuery = $this->getSearchQuery();
31
32
        // Output success message with variables
33
        $this->output(
34
            Response::HTTP_OK,
35
            [
36
                'media' => $this->loadMediaItems($mediaFolder, $aspectRatio, $searchQuery),
37
                'folder' => $mediaFolder !== null ? $mediaFolder->getId() : null,
38
                'tab' => $this->selectedTab,
39
            ]
40
        );
41
    }
42
43
    private function getAspectRatio(): ?AspectRatio
44
    {
45
        $aspectRatio = $this->getRequest()->request->get('aspect_ratio');
46
47
        if (empty($aspectRatio) || $aspectRatio === 'false') {
48
            return null;
49
        }
50
51
        return new AspectRatio($aspectRatio);
52
    }
53
54
    private function getSearchQuery(): ?string
55
    {
56
        $query = (string) $this->getRequest()->request->get('query');
57
58
        if (empty($query)) {
59
            return null;
60
        }
61
62
        return $query;
63
    }
64
65
    private function getMediaFolder(): ?MediaFolder
66
    {
67
        /** @var int $id */
68
        $id = $this->getRequest()->request->getInt('folder_id', 0);
69
70
        if ($id === 0) {
71
            return null;
72
        }
73
74
        try {
75
            /** @var MediaFolder */
76
            return $this->get('media_library.repository.folder')->findOneById($id);
77
        } catch (MediaFolderNotFound $mediaFolderNotFound) {
78
            throw new AjaxExitException(Language::err('NonExistingMediaFolder'));
79
        }
80
    }
81
82
    private function getMediaFolderBasedOnMediaGroup(): ?MediaFolder
83
    {
84
        /** @var MediaFolder|null $mediaFolder */
85
        $mediaFolder = $this->getMediaFolder();
86
87
        if ($mediaFolder !== null) {
88
            return $mediaFolder;
89
        }
90
91
        $mediaGroup = $this->getMediaGroup();
92
93
        if ($mediaGroup === null || $mediaGroup->getConnectedItems()->count() === 0) {
94
            if ($mediaFolder === null) {
0 ignored issues
show
The condition $mediaFolder === null is always true.
Loading history...
95
                return $this->get('media_library.repository.folder')->findDefault();
96
            }
97
98
            return $mediaFolder;
99
        }
100
101
        /** @var MediaItem $mediaItem The first item of the gallery MediaGroup */
102
        $mediaItem = $mediaGroup->getConnectedItems()->first()->getItem();
103
104
        // Redefine tab
105
        $this->selectedTab = (string) $mediaItem->getType();
106
107
        // Redefine folder
108
        return $mediaItem->getFolder();
109
    }
110
111
    private function getMediaGroup(): ?MediaGroup
112
    {
113
        /** @var string $id */
114
        $id = $this->getRequest()->request->get('group_id', '');
115
116
        if ($id === '') {
117
            return null;
118
        }
119
120
        try {
121
            /** @var MediaGroup */
122
            return $this->get('media_library.repository.group')->findOneById($id);
123
        } catch (MediaGroupNotFound $mediaGroupNotFound) {
124
            return null;
125
        }
126
    }
127
128
    private function loadMediaItems(?MediaFolder $mediaFolder, ?AspectRatio $aspectRatio, ?string $searchQuery): array
129
    {
130
        if ($mediaFolder === null) {
131
            return [];
132
        }
133
134
        if ($searchQuery) {
135
            return $this->get('media_library.repository.item')->findByFolderAndAspectRatioAndSearchQuery(
136
                $mediaFolder,
137
                $aspectRatio,
138
                $searchQuery
139
            );
140
        }
141
142
        return $this->get('media_library.repository.item')->findByFolderAndAspectRatio($mediaFolder, $aspectRatio);
143
    }
144
}
145