chengwl пре 1 недеља
родитељ
комит
5fe98cbf62
1 измењених фајлова са 26 додато и 18 уклоњено
  1. 26 18
      packages/Longyi/Core/src/Http/Controllers/Admin/FlexibleVariantController.php

+ 26 - 18
packages/Longyi/Core/src/Http/Controllers/Admin/FlexibleVariantController.php

@@ -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());
     }
     }
 
 
     /**
     /**