diff --git a/packages/Webkul/Product/src/Helpers/ConfigurableOption.php b/packages/Webkul/Product/src/Helpers/ConfigurableOption.php index 5b5eae71f..e6e53d8fc 100755 --- a/packages/Webkul/Product/src/Helpers/ConfigurableOption.php +++ b/packages/Webkul/Product/src/Helpers/ConfigurableOption.php @@ -5,6 +5,7 @@ namespace Webkul\Product\Helpers; use Webkul\Product\Models\Product; use Webkul\Product\Models\ProductAttributeValue; use Webkul\Product\Facades\ProductImage; +use Webkul\Product\Facades\ProductVideo; class ConfigurableOption extends AbstractProduct { @@ -50,6 +51,7 @@ class ConfigurableOption extends AbstractProduct ], 'variant_prices' => $this->getVariantPrices($product), 'variant_images' => $this->getVariantImages($product), + 'variant_videos' => $this->getVariantVideos($product), 'chooseText' => trans('shop::app.products.choose-option'), ]; @@ -211,4 +213,27 @@ class ConfigurableOption extends AbstractProduct return $images; } + + /** + * Get product videos for configurable variations + * + * @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product + * @return array + */ + protected function getVariantVideos($product) + { + $videos = []; + + foreach ($this->getAllowedProducts($product) as $variant) { + if ($variant instanceof \Webkul\Product\Models\ProductFlat) { + $variantId = $variant->product_id; + } else { + $variantId = $variant->id; + } + + $videos[$variantId] = ProductVideo::getVideos($variant); + } + + return $videos; + } } \ No newline at end of file diff --git a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php index db994b0a8..796b68f6a 100644 --- a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php +++ b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php @@ -37,43 +37,67 @@ class ProductFlatRepository extends Repository */ public function getCategoryProductAttribute($categoryId) { - $qb = $this->model - ->leftJoin('product_categories', 'product_flat.product_id', 'product_categories.product_id') - ->where('product_categories.category_id', $categoryId) - ->where('product_flat.channel', core()->getCurrentChannelCode()) - ->where('product_flat.locale', app()->getLocale()); + $qb = $this->categoryProductQuerybuilder($categoryId); - $productArrributes = $qb->distinct() - ->leftJoin('product_attribute_values as pa', 'product_flat.product_id', 'pa.product_id') - ->leftJoin('attributes as at', 'pa.attribute_id', 'at.id') - ->where('is_filterable', 1); + $productFlatIds = $qb->pluck('id')->toArray(); + $productIds = $qb->pluck('product_flat.product_id')->toArray(); - $productArrributesIds = $productArrributes->pluck('pa.attribute_id')->toArray(); + $childProductIds = $this->model->distinct() + ->whereIn('parent_id', $productFlatIds) + ->pluck('product_id')->toArray(); - $productSelectArrributes = $productArrributes - ->pluck('integer_value') - ->toArray(); + $productIds = array_merge($productIds, $childProductIds); - $productmultiSelectArrributes = $productArrributes - ->pluck('text_value') - ->toArray(); + $attributeValues = $this->model + ->distinct() + ->leftJoin('product_attribute_values as pa', 'product_flat.product_id', 'pa.product_id') + ->leftJoin('attributes as at', 'pa.attribute_id', 'at.id') + ->leftJoin('product_super_attributes as ps', 'product_flat.product_id', 'ps.product_id') + ->select('pa.integer_value', 'pa.text_value', 'pa.attribute_id', 'ps.attribute_id as attributeId') + ->where('is_filterable', 1) + ->WhereIn('pa.product_id', $productIds) + ->get(); - $multiSelectArrributes = []; - foreach ($productmultiSelectArrributes as $multi) { - if ($multi) { - $multiSelectArrributes = explode(",", $multi); + $attributeInfo['attributeOptions'] = $attributeInfo['attributes'] = []; + + foreach ($attributeValues as $attribute) { + $attributeKeys = array_keys($attribute->toArray()); + + foreach ($attributeKeys as $key) { + if (! is_null($attribute[$key])) { + if ($key == 'integer_value' && ! in_array($attribute[$key], $attributeInfo['attributeOptions'])) { + array_push($attributeInfo['attributeOptions'], $attribute[$key]); + } else if ($key == 'text_value' && ! in_array($attribute[$key], $attributeInfo['attributeOptions'])) { + $multiSelectArrributes = explode(",", $attribute[$key]); + + foreach ($multiSelectArrributes as $multi) { + if (! in_array($multi, $attributeInfo['attributeOptions'])) { + array_push($attributeInfo['attributeOptions'], $multi); + } + } + } else if (($key == 'attribute_id' || $key == 'attributeId') && ! in_array($attribute[$key], $attributeInfo['attributes'])) { + array_push($attributeInfo['attributes'], $attribute[$key]); + } + } } } - $productSuperArrributesIds = $qb->leftJoin('product_super_attributes as ps', 'product_flat.product_id', 'ps.product_id') - ->pluck('ps.attribute_id') - ->toArray(); + return $attributeInfo; + } - $productCategoryArrributes['attributeOptions'] = array_filter(array_unique(array_merge($productSelectArrributes, $multiSelectArrributes))); + /** + * get Category Product Model + * + * @param int $categoryId + * @return \Illuminate\Support\Querybuilder + */ + public function categoryProductQuerybuilder($categoryId) { - $productCategoryArrributes['attributes'] = array_filter(array_unique(array_merge($productArrributesIds, $productSuperArrributesIds))); - - return $productCategoryArrributes; + return $this->model + ->leftJoin('product_categories', 'product_flat.product_id', 'product_categories.product_id') + ->where('product_categories.category_id', $categoryId) + ->where('product_flat.channel', core()->getCurrentChannelCode()) + ->where('product_flat.locale', app()->getLocale()); } /** @@ -84,18 +108,25 @@ class ProductFlatRepository extends Repository */ public function getProductsRelatedFilterableAttributes($category) { - $categoryFilterableAttributes = $category->filterableAttributes->pluck('id')->toArray(); + $productsCount = $this->categoryProductQuerybuilder($category->id)->count(); - $productCategoryArrributes = $this->getCategoryProductAttribute($category->id); + if ($productsCount > 0) { + $categoryFilterableAttributes = $category->filterableAttributes->pluck('id')->toArray(); - $allFilterableAttributes = array_filter(array_unique(array_merge($categoryFilterableAttributes, $productCategoryArrributes['attributes']))); + $productCategoryArrributes = $this->getCategoryProductAttribute($category->id); - $attributes = app('Webkul\Attribute\Repositories\AttributeRepository')->getModel()::with(['options' => function($query) use ($productCategoryArrributes) { - return $query->whereIn('id', $productCategoryArrributes['attributeOptions']); - } - ])->whereIn('id', $allFilterableAttributes)->get(); + $allFilterableAttributes = array_filter(array_unique(array_intersect($categoryFilterableAttributes, $productCategoryArrributes['attributes']))); - return $attributes; + $attributes = app('Webkul\Attribute\Repositories\AttributeRepository')->getModel()::with(['options' => function($query) use ($productCategoryArrributes) { + return $query->whereIn('id', $productCategoryArrributes['attributeOptions']); + } + ])->whereIn('id', $allFilterableAttributes)->get(); + + return $attributes; + } else { + + return $category->filterableAttributes; + } } /** diff --git a/packages/Webkul/Product/src/Type/Configurable.php b/packages/Webkul/Product/src/Type/Configurable.php index e6a1d43d0..18fc830d6 100644 --- a/packages/Webkul/Product/src/Type/Configurable.php +++ b/packages/Webkul/Product/src/Type/Configurable.php @@ -6,10 +6,10 @@ use Webkul\Customer\Contracts\CartItem; use Webkul\Product\Datatypes\CartItemValidationResult; use Webkul\Product\Models\ProductAttributeValue; use Webkul\Product\Models\ProductFlat; +use Webkul\Product\Facades\ProductImage; use Illuminate\Support\Str; use Webkul\Checkout\Models\CartItem as CartItemModel; use Illuminate\Support\Facades\DB; -use Webkul\Product\Facades\ProductImage; class Configurable extends AbstractType { diff --git a/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php b/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php index 00d5acea1..10c05b6cc 100755 --- a/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php @@ -307,6 +307,10 @@ this.config.variant_images[this.simpleProduct].forEach(function(image) { galleryImages.unshift(image) }); + + this.config.variant_videos[this.simpleProduct].forEach(function(video) { + galleryImages.unshift(video) + }); } }, diff --git a/packages/Webkul/Velocity/src/Resources/views/shop/products/view/configurable-options.blade.php b/packages/Webkul/Velocity/src/Resources/views/shop/products/view/configurable-options.blade.php index 9ee9e5557..b9f3874f8 100644 --- a/packages/Webkul/Velocity/src/Resources/views/shop/products/view/configurable-options.blade.php +++ b/packages/Webkul/Velocity/src/Resources/views/shop/products/view/configurable-options.blade.php @@ -321,8 +321,18 @@ this.config.variant_images[this.simpleProduct].forEach(function(image) { galleryImages.unshift(image) }); + + this.config.variant_videos[this.simpleProduct].forEach(function(video) { + galleryImages.unshift(video) + }); } + galleryImages.forEach(function(image){ + if (image.type == 'video') { + image.small_image_url = image.medium_image_url = image.large_image_url = image.original_image_url= image.video_url; + } + }); + eventBus.$emit('configurable-variant-update-images-event', galleryImages); },