Merge pull request #4581 from rahulshukla-webkul/development

Issue #4571 fixed.
This commit is contained in:
Glenn Hermans 2021-02-10 15:00:27 +01:00 committed by GitHub
commit 7e09297db1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 106 additions and 36 deletions

View File

@ -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;
}
}

View File

@ -37,43 +37,67 @@ class ProductFlatRepository extends Repository
*/
public function getCategoryProductAttribute($categoryId)
{
$qb = $this->model
$qb = $this->categoryProductQuerybuilder($categoryId);
$productFlatIds = $qb->pluck('id')->toArray();
$productIds = $qb->pluck('product_flat.product_id')->toArray();
$childProductIds = $this->model->distinct()
->whereIn('parent_id', $productFlatIds)
->pluck('product_id')->toArray();
$productIds = array_merge($productIds, $childProductIds);
$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();
$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]);
}
}
}
}
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());
$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);
$productArrributesIds = $productArrributes->pluck('pa.attribute_id')->toArray();
$productSelectArrributes = $productArrributes
->pluck('integer_value')
->toArray();
$productmultiSelectArrributes = $productArrributes
->pluck('text_value')
->toArray();
$multiSelectArrributes = [];
foreach ($productmultiSelectArrributes as $multi) {
if ($multi) {
$multiSelectArrributes = explode(",", $multi);
}
}
$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;
}
/**
@ -84,11 +108,14 @@ class ProductFlatRepository extends Repository
*/
public function getProductsRelatedFilterableAttributes($category)
{
$productsCount = $this->categoryProductQuerybuilder($category->id)->count();
if ($productsCount > 0) {
$categoryFilterableAttributes = $category->filterableAttributes->pluck('id')->toArray();
$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']);
@ -96,6 +123,10 @@ class ProductFlatRepository extends Repository
])->whereIn('id', $allFilterableAttributes)->get();
return $attributes;
} else {
return $category->filterableAttributes;
}
}
/**

View File

@ -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
{

View File

@ -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)
});
}
},

View File

@ -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);
},