|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace A17\Twill\Repositories\Behaviors; |
|
4
|
|
|
|
|
5
|
|
|
use A17\Twill\Models\Media; |
|
6
|
|
|
use Illuminate\Support\Arr; |
|
7
|
|
|
use Illuminate\Support\Collection; |
|
8
|
|
|
use Illuminate\Support\Str; |
|
9
|
|
|
|
|
10
|
|
|
trait HandleMedias |
|
11
|
|
|
{ |
|
12
|
|
|
/** |
|
13
|
|
|
* @param \A17\Twill\Models\Model $object |
|
14
|
|
|
* @param array $fields |
|
15
|
|
|
* @return \A17\Twill\Models\Model |
|
16
|
|
|
*/ |
|
17
|
3 |
|
public function hydrateHandleMedias($object, $fields) |
|
18
|
|
|
{ |
|
19
|
3 |
|
if ($this->shouldIgnoreFieldBeforeSave('medias')) { |
|
|
|
|
|
|
20
|
|
|
return $object; |
|
21
|
|
|
} |
|
22
|
|
|
|
|
23
|
3 |
|
$mediasCollection = Collection::make(); |
|
24
|
3 |
|
$mediasFromFields = $this->getMedias($fields); |
|
25
|
|
|
|
|
26
|
3 |
|
$mediasFromFields->each(function ($media) use ($object, $mediasCollection) { |
|
27
|
|
|
$newMedia = Media::withTrashed()->find(is_array($media['id']) ? Arr::first($media['id']) : $media['id']); |
|
28
|
|
|
$pivot = $newMedia->newPivot($object, Arr::except($media, ['id']), config('twill.mediables_table', 'twill_mediables'), true); |
|
29
|
|
|
$newMedia->setRelation('pivot', $pivot); |
|
30
|
|
|
$mediasCollection->push($newMedia); |
|
31
|
3 |
|
}); |
|
32
|
|
|
|
|
33
|
3 |
|
$object->setRelation('medias', $mediasCollection); |
|
34
|
|
|
|
|
35
|
3 |
|
return $object; |
|
36
|
|
|
} |
|
37
|
|
|
|
|
38
|
|
|
/** |
|
39
|
|
|
* @param \A17\Twill\Models\Model $object |
|
40
|
|
|
* @param array $fields |
|
41
|
|
|
* @return void |
|
42
|
|
|
*/ |
|
43
|
21 |
|
public function afterSaveHandleMedias($object, $fields) |
|
44
|
|
|
{ |
|
45
|
21 |
|
if ($this->shouldIgnoreFieldBeforeSave('medias')) { |
|
46
|
|
|
return; |
|
47
|
|
|
} |
|
48
|
|
|
|
|
49
|
21 |
|
$object->medias()->sync([]); |
|
50
|
|
|
|
|
51
|
21 |
|
$this->getMedias($fields)->each(function ($media) use ($object) { |
|
52
|
|
|
$object->medias()->attach($media['id'], Arr::except($media, ['id'])); |
|
53
|
21 |
|
}); |
|
54
|
21 |
|
} |
|
55
|
|
|
|
|
56
|
|
|
/** |
|
57
|
|
|
* @param array $fields |
|
58
|
|
|
* @return \Illuminate\Support\Collection |
|
59
|
|
|
*/ |
|
60
|
22 |
|
private function getMedias($fields) |
|
61
|
|
|
{ |
|
62
|
22 |
|
$medias = Collection::make(); |
|
63
|
|
|
|
|
64
|
22 |
|
if (isset($fields['medias'])) { |
|
65
|
|
|
foreach ($fields['medias'] as $role => $mediasForRole) { |
|
66
|
|
|
if (config('twill.media_library.translated_form_fields', false)) { |
|
67
|
|
|
if (Str::contains($role, ['[', ']'])) { |
|
68
|
|
|
$start = strpos($role, '[') + 1; |
|
69
|
|
|
$finish = strpos($role, ']', $start); |
|
70
|
|
|
$locale = substr($role, $start, $finish - $start); |
|
71
|
|
|
$role = strtok($role, '['); |
|
72
|
|
|
} |
|
73
|
|
|
} |
|
74
|
|
|
|
|
75
|
|
|
$locale = $locale ?? config('app.locale'); |
|
76
|
|
|
|
|
77
|
|
|
if (in_array($role, array_keys($this->model->mediasParams ?? [])) |
|
78
|
|
|
|| in_array($role, array_keys(config('twill.block_editor.crops', []))) |
|
79
|
|
|
|| in_array($role, array_keys(config('twill.settings.crops', [])))) { |
|
80
|
|
|
Collection::make($mediasForRole)->each(function ($media) use (&$medias, $role, $locale) { |
|
81
|
|
|
$customMetadatas = $media['metadatas']['custom'] ?? []; |
|
82
|
|
|
if (isset($media['crops']) && !empty($media['crops'])) { |
|
83
|
|
|
foreach ($media['crops'] as $cropName => $cropData) { |
|
84
|
|
|
$medias->push([ |
|
85
|
|
|
'id' => $media['id'], |
|
86
|
|
|
'crop' => $cropName, |
|
87
|
|
|
'role' => $role, |
|
88
|
|
|
'locale' => $locale, |
|
89
|
|
|
'ratio' => $cropData['name'], |
|
90
|
|
|
'crop_w' => $cropData['width'], |
|
91
|
|
|
'crop_h' => $cropData['height'], |
|
92
|
|
|
'crop_x' => $cropData['x'], |
|
93
|
|
|
'crop_y' => $cropData['y'], |
|
94
|
|
|
'metadatas' => json_encode($customMetadatas), |
|
95
|
|
|
]); |
|
96
|
|
|
} |
|
97
|
|
|
} else { |
|
98
|
|
|
foreach ($this->getCrops($role) as $cropName => $cropDefinitions) { |
|
99
|
|
|
$medias->push([ |
|
100
|
|
|
'id' => $media['id'], |
|
101
|
|
|
'crop' => $cropName, |
|
102
|
|
|
'role' => $role, |
|
103
|
|
|
'locale' => $locale, |
|
104
|
|
|
'ratio' => Arr::first($cropDefinitions)['name'], |
|
105
|
|
|
'crop_w' => null, |
|
106
|
|
|
'crop_h' => null, |
|
107
|
|
|
'crop_x' => null, |
|
108
|
|
|
'crop_y' => null, |
|
109
|
|
|
'metadatas' => json_encode($customMetadatas), |
|
110
|
|
|
]); |
|
111
|
|
|
} |
|
112
|
|
|
} |
|
113
|
|
|
}); |
|
114
|
|
|
} |
|
115
|
|
|
} |
|
116
|
|
|
} |
|
117
|
|
|
|
|
118
|
22 |
|
return $medias; |
|
119
|
|
|
} |
|
120
|
|
|
|
|
121
|
|
|
/** |
|
122
|
|
|
* @param \A17\Twill\Models\Model $object |
|
123
|
|
|
* @param array $fields |
|
124
|
|
|
* @return array |
|
125
|
|
|
*/ |
|
126
|
6 |
|
public function getFormFieldsHandleMedias($object, $fields) |
|
127
|
|
|
{ |
|
128
|
6 |
|
$fields['medias'] = null; |
|
129
|
|
|
|
|
130
|
6 |
|
if ($object->has('medias')) { |
|
131
|
6 |
|
foreach ($object->medias->groupBy('pivot.role') as $role => $mediasByRole) { |
|
|
|
|
|
|
132
|
|
|
if (config('twill.media_library.translated_form_fields', false)) { |
|
133
|
|
|
foreach ($mediasByRole->groupBy('pivot.locale') as $locale => $mediasByLocale) { |
|
134
|
|
|
foreach ($this->getMediaFormItems($mediasByLocale) as $item) { |
|
135
|
|
|
$fields['medias'][$locale][$role][] = $item; |
|
136
|
|
|
} |
|
137
|
|
|
} |
|
138
|
|
|
} else { |
|
139
|
|
|
foreach ($this->getMediaFormItems($mediasByRole) as $item) { |
|
140
|
|
|
$fields['medias'][$role][] = $item; |
|
141
|
|
|
} |
|
142
|
|
|
} |
|
143
|
|
|
} |
|
144
|
|
|
} |
|
145
|
|
|
|
|
146
|
6 |
|
return $fields; |
|
147
|
|
|
} |
|
148
|
|
|
|
|
149
|
|
|
/** |
|
150
|
|
|
* @param \Illuminate\Database\Eloquent\Collection $medias |
|
151
|
|
|
* @return array |
|
152
|
|
|
*/ |
|
153
|
|
|
private function getMediaFormItems($medias) |
|
154
|
|
|
{ |
|
155
|
|
|
$itemsForForm = []; |
|
156
|
|
|
|
|
157
|
|
|
foreach ($medias->groupBy('id') as $id => $mediasById) { |
|
158
|
|
|
$item = $mediasById->first(); |
|
159
|
|
|
|
|
160
|
|
|
$itemForForm = $item->toCmsArray(); |
|
161
|
|
|
|
|
162
|
|
|
$itemForForm['metadatas']['custom'] = json_decode($item->pivot->metadatas, true); |
|
163
|
|
|
|
|
164
|
|
|
foreach ($mediasById->groupBy('pivot.crop') as $crop => $mediaByCrop) { |
|
165
|
|
|
$media = $mediaByCrop->first(); |
|
166
|
|
|
$itemForForm['crops'][$crop] = [ |
|
167
|
|
|
'name' => $media->pivot->ratio, |
|
168
|
|
|
'width' => $media->pivot->crop_w, |
|
169
|
|
|
'height' => $media->pivot->crop_h, |
|
170
|
|
|
'x' => $media->pivot->crop_x, |
|
171
|
|
|
'y' => $media->pivot->crop_y, |
|
172
|
|
|
]; |
|
173
|
|
|
} |
|
174
|
|
|
|
|
175
|
|
|
$itemsForForm[] = $itemForForm; |
|
176
|
|
|
} |
|
177
|
|
|
|
|
178
|
|
|
return $itemsForForm; |
|
179
|
|
|
} |
|
180
|
|
|
|
|
181
|
|
|
/** |
|
182
|
|
|
* @param string $role |
|
183
|
|
|
* @return array |
|
184
|
|
|
*/ |
|
185
|
|
|
public function getCrops($role) |
|
186
|
|
|
{ |
|
187
|
|
|
return $this->model->mediasParams[$role]; |
|
188
|
|
|
} |
|
189
|
|
|
} |
|
190
|
|
|
|