|
@@ -5,6 +5,7 @@ namespace Longyi\Core\Http\Controllers\Admin;
|
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\JsonResponse;
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Request;
|
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Routing\Controller;
|
|
|
|
|
+use Illuminate\Support\Collection;
|
|
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
use Longyi\Core\Helpers\FlexibleVariantOption;
|
|
use Longyi\Core\Helpers\FlexibleVariantOption;
|
|
@@ -667,32 +668,42 @@ class FlexibleVariantController extends Controller
|
|
|
* 2. All resulting Media IDs (new + existing) are synced into
|
|
* 2. All resulting Media IDs (new + existing) are synced into
|
|
|
* the product_variant_images pivot table with position order.
|
|
* the product_variant_images pivot table with position order.
|
|
|
*/
|
|
*/
|
|
|
- public function syncVariantImages( Request $request): JsonResponse
|
|
|
|
|
|
|
+ public function syncVariantImages(Request $request): JsonResponse
|
|
|
{
|
|
{
|
|
|
$this->validate($request, [
|
|
$this->validate($request, [
|
|
|
- 'variant_ids' => 'array',
|
|
|
|
|
|
|
+ 'variant_ids' => 'required|array',
|
|
|
'variant_ids.*' => 'required|exists:product_variants,id',
|
|
'variant_ids.*' => 'required|exists:product_variants,id',
|
|
|
- 'media_id' => 'integer|exists:media,id',
|
|
|
|
|
- 'file' => 'image|max:5120',
|
|
|
|
|
|
|
+ 'file' => 'sometimes|image|max:5120',
|
|
|
|
|
+ 'media_ids' => 'sometimes|array',
|
|
|
|
|
+ 'media_ids.*' => 'integer|exists:media,id',
|
|
|
]);
|
|
]);
|
|
|
|
|
|
|
|
- $variant = ProductVariant::findOrFail($request->variant_ids);
|
|
|
|
|
|
|
+ $variants = ProductVariant::findMany($request->input('variant_ids'));
|
|
|
|
|
|
|
|
- $mediaIds = collect($request->input('media_ids', []));
|
|
|
|
|
|
|
+ $uploadedMedia = null;
|
|
|
|
|
|
|
|
- if ($request->hasFile('uploads')) {
|
|
|
|
|
- foreach ($request->file('uploads') as $file) {
|
|
|
|
|
- $media = $variant->addMedia($file)->toMediaCollection(ProductVariant::IMAGES_COLLECTION);
|
|
|
|
|
- $variant->variantImages()->attach($media->id, ['position' => 0]);
|
|
|
|
|
|
|
+ if ($request->hasFile('file')) {
|
|
|
|
|
+ $uploadedMedia = $variants->first()
|
|
|
|
|
+ ->addMedia($request->file('file'))
|
|
|
|
|
+ ->toMediaCollection(ProductVariant::IMAGES_COLLECTION);
|
|
|
|
|
+
|
|
|
|
|
+ foreach ($variants as $variant) {
|
|
|
|
|
+ $position = $variant->variantImages()->count();
|
|
|
|
|
+ $variant->variantImages()->attach($uploadedMedia->id, ['position' => $position]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- $variant->variantImages()->sync($mediaIds->toArray());
|
|
|
|
|
|
|
+ // Only sync explicit media_ids when the caller provides them (e.g. for reordering).
|
|
|
|
|
+ // Never sync an empty array implicitly — that would wipe all variant images.
|
|
|
|
|
+ if ($request->has('media_ids')) {
|
|
|
|
|
+ $mediaIds = collect($request->input('media_ids'));
|
|
|
|
|
+ $variants->each(fn ($variant) => $variant->variantImages()->sync($mediaIds->toArray()));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return response()->json([
|
|
return response()->json([
|
|
|
'success' => true,
|
|
'success' => true,
|
|
|
- 'data' => $this->formatVariantImages($variant),
|
|
|
|
|
- ]);
|
|
|
|
|
|
|
+ 'data' => $uploadedMedia ? $this->formatMediaItem($uploadedMedia) : null,
|
|
|
|
|
+ ], 201);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -749,12 +760,9 @@ class FlexibleVariantController extends Controller
|
|
|
/**
|
|
/**
|
|
|
* Format a variant's images for API response.
|
|
* Format a variant's images for API response.
|
|
|
*/
|
|
*/
|
|
|
- protected function formatVariantImages(ProductVariant $variant): array
|
|
|
|
|
|
|
+ protected function formatVariantImages($variants): Collection
|
|
|
{
|
|
{
|
|
|
- return $variant->variantImages()
|
|
|
|
|
- ->get()
|
|
|
|
|
- ->map(fn ($media) => $this->formatMediaItem($media))
|
|
|
|
|
- ->all();
|
|
|
|
|
|
|
+ return $variants->map(fn ($variant) => $variant->variantImages()->orderBy('position')->get()->map(fn ($media) => $this->formatMediaItem($media))->all());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|