How to attach different picture for each product type

Viewed 93

I am building an eCommerce website and I want to add different combinations for the same product. I use jQuery to add extra input fields as well. I can successfully insert all data related to product_variation things like color, weight, type, qty but except images. My database tables: products, product_images, product_variations. In product_variations table I have field product_variation_image which I want to use for storing image for specific product type. I just don't know how to insert image there for specific product type, yes I know I need to use foreach loop but the problem is I'm already using foreach loop for product variation data, I tried so many different things nesting foreach into foreach but nothing seems to work. P.S product_images table I'm only use for product basic images also for products which don't have any type. I will leave my code below... with some comments on where the problem might be.

 public function product_store(Request $request)
{
    // PRODUCT TYPE VARIABLES //
    $productTypes = $request->product_type;
    $productColors = $request->product_color;
    $productWeight = $request->product_weight;
    $productQtys = $request->product_qty;
    $productPrices = $request->product_variation_price;
    $productTypeImages = $request->file('product_variation_image');
    // PRODUCT TYPE VARIABLES ENDS //
    
    // PRODUCT COVER IMAGE //
    $productCoverImage = $request->file('product_cover_image');
    $productCoverImageNewName = hexdec(uniqid()).'.'.$productCoverImage->getClientOriginalExtension();
    Image::make($productCoverImage)->resize(917,1000)->save('upload/products/cover-images/'.$productCoverImageNewName);
    $productCoverImageLink = 'upload/products/cover-images/'.$productCoverImageNewName;
    // PRODUCT COVER IMAGE  ENDS //
    
    if(!empty(implode($productTypes))) {
        $productId = Products::insertGetId([
        'category_id' => $request->category_id,
        'sub_category_id' => $request->sub_category_id,
        'sub_sub_category_id' => $request->sub_sub_category_id,
        'product_name' => $request->product_name,
        'product_link' => strtolower(str_replace(' ','-', $request->product_name)),
        'product_desc' => $request->product_desc,
        'product_short_desc' => $request->product_short_desc,
        'product_price' => $request->product_price,
        'product_discount' => $request->product_discount,
        'product_cover_image' => $productCoverImageLink,
        'new_product' => $request->new_product,
        'featured' => $request->featured,
        'special_offer' => $request->special_offer,
        'status' => $request->status,
        ]);
        // PRODUCT TYPE IMAGES //
        foreach ($productTypeImages as $img) {
            $productTypeImagesNewName = hexdec(uniqid()) . '.' . $img->getClientOriginalExtension();
            Image::make($img)->resize(917, 1000)->save('upload/products/product-images/' . $productTypeImagesNewName);
            $productTypesImagesLink = 'upload/products/product-images/' . $productTypeImagesNewName;
        }
        // PRODUCT TYPE IMAGES  ENDS //
        foreach ($productTypes as $id => $key) {
            ProductVariations::insert([
                'product_id' => $productId,
                'product_type' => $productTypes[$id],
                'product_color' => $productColors[$id],
                'product_weight' => $productWeight[$id],
                //'product_variation_image' => $productTypesImagesLink[$id], <--- PROBLEM HERE
                'product_variation_qty' => $productQtys[$id],
                'product_variation_price' => $productPrices[$id],
                'created_at' => Carbon::now()
            ]);
        }
    } else {
        $productId = Products::insertGetId([
            'category_id' => $request->category_id,
            'sub_category_id' => $request->sub_category_id,
            'sub_sub_category_id' => $request->sub_sub_category_id,
            'product_name' => $request->product_name,
            'product_link' => strtolower(str_replace(' ','-', $request->product_name)),
            'product_desc' => $request->product_desc,
            'product_short_desc' => $request->product_short_desc,
            'product_price' => $request->product_price,
            'product_discount' => $request->product_discount,
            'product_cover_image' => $productCoverImageLink,
            'new_product' => $request->new_product,
            'featured' => $request->featured,
            'special_offer' => $request->special_offer,
            'status' => $request->status,
            'created_at' => Carbon::now()
        ]);
    }
    
    
    // PRODUCT MULTIPLE IMAGES //
    $productImages = $request->file('product_image');
    foreach ($productImages as $productImage) {
        $productImagesNewName = hexdec(uniqid()).'.'.$productImage->getClientOriginalExtension();
        Image::make($productImage)->resize(917,1000)->save('upload/products/product-images/'.$productImagesNewName);
        $productImagesLink = 'upload/products/product-images/'.$productImagesNewName;
        ProductImages::insert([
            'product_id' => $productId,
            'product_image' => $productImagesLink,
            'created_at' => Carbon::now()
        ]);
    }
    // PRODUCT MULTIPLE IMAGES ENDS //
    $notification = array(
        'message' => 'Product Inserted!',
        'alert-type' => 'success'
    );
    return redirect()->back()->with($notification);
}
1 Answers

I have come up with different solution.

After inserting product with multiple images and if product has any variations, I redirect user to another page. Where he can select image for each type if he wants to. And I'm inserting only image id from product_images table, to product_variations table field - product_variation_image.

By the way, I use a jQuery plugin called image-picker for that. And now everything works and my client is happy with that.

Product function:

 public function product_store(Request $request)
{
    // PRODUCT TYPE VARIABLES //
    $productTypes = $request->product_type;
    $productColors = $request->product_color;
    $productWeight = $request->product_weight;
    $productQtys = $request->product_qty;
    $productPrices = $request->product_variation_price;
    $productTypeImages = $request->file('product_variation_image');
    // PRODUCT TYPE VARIABLES ENDS //
    // PRODUCT COVER IMAGE //
    $productCoverImage = $request->file('product_cover_image');
    if($productCoverImage) {
        $productCoverImageNewName = hexdec(uniqid()) . '.' . $productCoverImage->getClientOriginalExtension();
        Image::make($productCoverImage)->resize(917, 1000)->save('upload/products/cover-images/' . $productCoverImageNewName);
        $productCoverImageLink = 'upload/products/cover-images/' . $productCoverImageNewName;
    } else {
        $productCoverImageLink = 'upload/no-image/image.png';
    }
    // PRODUCT COVER IMAGE  ENDS //
    if(!empty(implode($productTypes))) {
        $productId = Products::insertGetId([
        'category_id' => $request->category_id,
        'sub_category_id' => $request->sub_category_id,
        'sub_sub_category_id' => $request->sub_sub_category_id,
        'product_name' => $request->product_name,
        'product_link' => strtolower(str_replace(' ','-', $request->product_name)),
        'product_desc' => $request->product_desc,
        'product_short_desc' => $request->product_short_desc,
        'product_price' => $request->product_price,
        'product_discount' => $request->product_discount,
        'product_cover_image' => $productCoverImageLink,
        'new_product' => $request->new_product,
        'featured' => $request->featured,
        'special_offer' => $request->special_offer,
        'status' => $request->status,
        ]);
        foreach ($productTypes as $id => $key) {
            ProductVariations::insert([
                'product_id' => $productId,
                'product_type' => $productTypes[$id],
                'product_color' => $productColors[$id],
                'product_weight' => $productWeight[$id],
                'product_variation_qty' => $productQtys[$id],
                'product_variation_price' => $productPrices[$id],
                'created_at' => Carbon::now()
            ]);
        }
    } else {
        $productId = Products::insertGetId([
            'category_id' => $request->category_id,
            'sub_category_id' => $request->sub_category_id,
            'sub_sub_category_id' => $request->sub_sub_category_id,
            'product_name' => $request->product_name,
            'product_link' => strtolower(str_replace(' ','-', $request->product_name)),
            'product_desc' => $request->product_desc,
            'product_short_desc' => $request->product_short_desc,
            'product_price' => $request->product_price,
            'product_discount' => $request->product_discount,
            'product_cover_image' => $productCoverImageLink,
            'new_product' => $request->new_product,
            'featured' => $request->featured,
            'special_offer' => $request->special_offer,
            'status' => $request->status,
            'created_at' => Carbon::now()
        ]);
    }
    // PRODUCT MULTIPLE IMAGES //
    $productImages = $request->file('product_image');
    if($productImages) {
        foreach ($productImages as $productImage) {
            $productImagesNewName = hexdec(uniqid()) . '.' . $productImage->getClientOriginalExtension();
            Image::make($productImage)->resize(917, 1000)->save('upload/products/product-images/' . $productImagesNewName);
            $productImagesLink = 'upload/products/product-images/' . $productImagesNewName;
            ProductImages::insert([
                'product_id' => $productId,
                'product_image' => $productImagesLink,
                'created_at' => Carbon::now()
            ]);
        }
    }
    // PRODUCT MULTIPLE IMAGES ENDS //
    $notification = array(
        'message' => 'Product Inserted!',
        'alert-type' => 'success'
    );
    if(!empty(implode($productTypes))) {
        return redirect()->route('admin.product-variations-images-settings', ['id' => $productId])->with($notification);
    } else {
        return redirect()->route('admin.products')->with($notification);
    }
}

Functions for image varations:

 public function product_variations_images_settings($id)
{
    $productVariations = ProductVariations::where('product_id', $id)->get();
    $productImages = ProductImages::where('product_id', $id)->get();
    return view('administrator.pages.products.product-variations', compact('productVariations','productImages'));
}
public function product_variations_images_store(Request $request)
{
    $productVariationId = $request->id;
    $productImageId = $request->product_variation_image;
    $array = array_combine($productVariationId, $productImageId);
    foreach ($array as $id => $key){
        //dd($key);
        ProductVariations::findOrFail($id)->update([
            'product_variation_image' => $key,
            'updated_at' => Carbon::now()
        ]);
    }
    $notification = array(
        'message' => 'Images Set!',
        'alert-type' => 'success'
    );
    return redirect()->route('admin.products')->with($notification);

}
Related