From 85c3048a384f26836d50975e67846eb639fc7059 Mon Sep 17 00:00:00 2001 From: rahul shukla Date: Mon, 8 Feb 2021 18:23:43 +0530 Subject: [PATCH 1/6] failing checks --- packages/Webkul/Product/src/Type/Configurable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 { From 1ba0eccd5d88192742bb98eb19ec72ae4223a64b Mon Sep 17 00:00:00 2001 From: rahul shukla Date: Mon, 8 Feb 2021 20:20:06 +0530 Subject: [PATCH 2/6] Issue #3571 --- .../src/Helpers/ConfigurableOption.php | 25 +++++++++++++++++++ .../view/configurable-options.blade.php | 6 ++++- .../view/configurable-options.blade.php | 4 +++ 3 files changed, 34 insertions(+), 1 deletion(-) 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/Shop/src/Resources/views/products/view/configurable-options.blade.php b/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php index 3d2d8eb1f..55344f2b8 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 @@ -304,7 +304,11 @@ }); if (this.simpleProduct) { - this.config.variant_images[this.simpleProduct].forEach(function(image) { + this.config.variant_images[this.simpleProduct].forEach(function(video) { + galleryImages.unshift(video) + }); + + this.config.variant_videos[this.simpleProduct].forEach(function(image) { galleryImages.unshift(image) }); } 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 c8b13e5b0..48dc2e03c 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 @@ -318,6 +318,10 @@ }); if (this.simpleProduct) { + this.config.variant_images[this.simpleProduct].forEach(function(video) { + galleryImages.unshift(video) + }); + this.config.variant_images[this.simpleProduct].forEach(function(image) { galleryImages.unshift(image) }); From 8e0d5ebe2cc17720bfad33e2dc6c262b8d1da032 Mon Sep 17 00:00:00 2001 From: rahul shukla Date: Tue, 9 Feb 2021 19:20:00 +0530 Subject: [PATCH 3/6] Issue #4566 and #4567 --- .../Repositories/ProductFlatRepository.php | 70 +++++++++++-------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php index db994b0a8..4db3e5b40 100644 --- a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php +++ b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php @@ -38,42 +38,54 @@ 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()); + ->distinct() + ->leftJoin('product_categories', 'product_flat.product_id', 'product_categories.product_id') + ->where('product_categories.category_id', $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(); + $childProductsIds = $this->model->distinct() + ->whereIn('parent_id', $productFlatIds) + ->pluck('product_id')->toArray(); - $productSelectArrributes = $productArrributes - ->pluck('integer_value') - ->toArray(); + $productIds = array_merge($productIds, $childProductsIds); - $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(); - - $productCategoryArrributes['attributeOptions'] = array_filter(array_unique(array_merge($productSelectArrributes, $multiSelectArrributes))); - - $productCategoryArrributes['attributes'] = array_filter(array_unique(array_merge($productArrributesIds, $productSuperArrributesIds))); - - return $productCategoryArrributes; + return $attributeInfo; } /** @@ -88,7 +100,7 @@ class ProductFlatRepository extends Repository $productCategoryArrributes = $this->getCategoryProductAttribute($category->id); - $allFilterableAttributes = array_filter(array_unique(array_merge($categoryFilterableAttributes, $productCategoryArrributes['attributes']))); + $allFilterableAttributes = array_filter(array_unique(array_intersect($categoryFilterableAttributes, $productCategoryArrributes['attributes']))); $attributes = app('Webkul\Attribute\Repositories\AttributeRepository')->getModel()::with(['options' => function($query) use ($productCategoryArrributes) { return $query->whereIn('id', $productCategoryArrributes['attributeOptions']); From 994e19d7618e1e5fac83ac12a73e8fc7dcf82d51 Mon Sep 17 00:00:00 2001 From: rahul shukla Date: Tue, 9 Feb 2021 19:21:29 +0530 Subject: [PATCH 4/6] Issue #4566 and #4567 --- .../Webkul/Product/src/Repositories/ProductFlatRepository.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php index 4db3e5b40..d4b847e5b 100644 --- a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php +++ b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php @@ -45,11 +45,11 @@ class ProductFlatRepository extends Repository $productFlatIds = $qb->pluck('id')->toArray(); $productIds = $qb->pluck('product_flat.product_id')->toArray(); - $childProductsIds = $this->model->distinct() + $childProductIds = $this->model->distinct() ->whereIn('parent_id', $productFlatIds) ->pluck('product_id')->toArray(); - $productIds = array_merge($productIds, $childProductsIds); + $productIds = array_merge($productIds, $childProductIds); $attributeValues = $this->model ->distinct() From 8ae86f2fd15a48c3c9c68a0abf95a4714c840b6a Mon Sep 17 00:00:00 2001 From: rahul shukla Date: Wed, 10 Feb 2021 17:27:51 +0530 Subject: [PATCH 5/6] fixes as per comment --- .../Repositories/ProductFlatRepository.php | 43 +++++++++++++------ .../view/configurable-options.blade.php | 2 +- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php index d4b847e5b..796b68f6a 100644 --- a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php +++ b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php @@ -37,10 +37,7 @@ class ProductFlatRepository extends Repository */ public function getCategoryProductAttribute($categoryId) { - $qb = $this->model - ->distinct() - ->leftJoin('product_categories', 'product_flat.product_id', 'product_categories.product_id') - ->where('product_categories.category_id', $categoryId); + $qb = $this->categoryProductQuerybuilder($categoryId); $productFlatIds = $qb->pluck('id')->toArray(); $productIds = $qb->pluck('product_flat.product_id')->toArray(); @@ -88,6 +85,21 @@ class ProductFlatRepository extends Repository return $attributeInfo; } + /** + * get Category Product Model + * + * @param int $categoryId + * @return \Illuminate\Support\Querybuilder + */ + public function categoryProductQuerybuilder($categoryId) { + + 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()); + } + /** * filter attributes according to products * @@ -96,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_intersect($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/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 48dc2e03c..354bee696 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 @@ -322,7 +322,7 @@ galleryImages.unshift(video) }); - this.config.variant_images[this.simpleProduct].forEach(function(image) { + this.config.variant_videos[this.simpleProduct].forEach(function(image) { galleryImages.unshift(image) }); } From b979fc0c3f9915f98286d5ab952e026aba56d1dc Mon Sep 17 00:00:00 2001 From: rahul shukla Date: Wed, 10 Feb 2021 18:51:52 +0530 Subject: [PATCH 6/6] video playing issue on velocity --- .../products/view/configurable-options.blade.php | 8 ++++---- .../products/view/configurable-options.blade.php | 16 +++++++++++----- 2 files changed, 15 insertions(+), 9 deletions(-) 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 55344f2b8..fd0696fe3 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 @@ -304,12 +304,12 @@ }); if (this.simpleProduct) { - this.config.variant_images[this.simpleProduct].forEach(function(video) { - galleryImages.unshift(video) + this.config.variant_images[this.simpleProduct].forEach(function(image) { + galleryImages.unshift(image) }); - this.config.variant_videos[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 354bee696..1b4e9a91f 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 @@ -318,15 +318,21 @@ }); if (this.simpleProduct) { - this.config.variant_images[this.simpleProduct].forEach(function(video) { - galleryImages.unshift(video) - }); - - this.config.variant_videos[this.simpleProduct].forEach(function(image) { + 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); },