Merge pull request #4581 from rahulshukla-webkul/development
Issue #4571 fixed.
This commit is contained in:
commit
7e09297db1
|
|
@ -5,6 +5,7 @@ namespace Webkul\Product\Helpers;
|
||||||
use Webkul\Product\Models\Product;
|
use Webkul\Product\Models\Product;
|
||||||
use Webkul\Product\Models\ProductAttributeValue;
|
use Webkul\Product\Models\ProductAttributeValue;
|
||||||
use Webkul\Product\Facades\ProductImage;
|
use Webkul\Product\Facades\ProductImage;
|
||||||
|
use Webkul\Product\Facades\ProductVideo;
|
||||||
|
|
||||||
class ConfigurableOption extends AbstractProduct
|
class ConfigurableOption extends AbstractProduct
|
||||||
{
|
{
|
||||||
|
|
@ -50,6 +51,7 @@ class ConfigurableOption extends AbstractProduct
|
||||||
],
|
],
|
||||||
'variant_prices' => $this->getVariantPrices($product),
|
'variant_prices' => $this->getVariantPrices($product),
|
||||||
'variant_images' => $this->getVariantImages($product),
|
'variant_images' => $this->getVariantImages($product),
|
||||||
|
'variant_videos' => $this->getVariantVideos($product),
|
||||||
'chooseText' => trans('shop::app.products.choose-option'),
|
'chooseText' => trans('shop::app.products.choose-option'),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -211,4 +213,27 @@ class ConfigurableOption extends AbstractProduct
|
||||||
|
|
||||||
return $images;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -37,43 +37,67 @@ class ProductFlatRepository extends Repository
|
||||||
*/
|
*/
|
||||||
public function getCategoryProductAttribute($categoryId)
|
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')
|
->leftJoin('product_categories', 'product_flat.product_id', 'product_categories.product_id')
|
||||||
->where('product_categories.category_id', $categoryId)
|
->where('product_categories.category_id', $categoryId)
|
||||||
->where('product_flat.channel', core()->getCurrentChannelCode())
|
->where('product_flat.channel', core()->getCurrentChannelCode())
|
||||||
->where('product_flat.locale', app()->getLocale());
|
->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)
|
public function getProductsRelatedFilterableAttributes($category)
|
||||||
{
|
{
|
||||||
|
$productsCount = $this->categoryProductQuerybuilder($category->id)->count();
|
||||||
|
|
||||||
|
if ($productsCount > 0) {
|
||||||
$categoryFilterableAttributes = $category->filterableAttributes->pluck('id')->toArray();
|
$categoryFilterableAttributes = $category->filterableAttributes->pluck('id')->toArray();
|
||||||
|
|
||||||
$productCategoryArrributes = $this->getCategoryProductAttribute($category->id);
|
$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) {
|
$attributes = app('Webkul\Attribute\Repositories\AttributeRepository')->getModel()::with(['options' => function($query) use ($productCategoryArrributes) {
|
||||||
return $query->whereIn('id', $productCategoryArrributes['attributeOptions']);
|
return $query->whereIn('id', $productCategoryArrributes['attributeOptions']);
|
||||||
|
|
@ -96,6 +123,10 @@ class ProductFlatRepository extends Repository
|
||||||
])->whereIn('id', $allFilterableAttributes)->get();
|
])->whereIn('id', $allFilterableAttributes)->get();
|
||||||
|
|
||||||
return $attributes;
|
return $attributes;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
return $category->filterableAttributes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,10 @@ use Webkul\Customer\Contracts\CartItem;
|
||||||
use Webkul\Product\Datatypes\CartItemValidationResult;
|
use Webkul\Product\Datatypes\CartItemValidationResult;
|
||||||
use Webkul\Product\Models\ProductAttributeValue;
|
use Webkul\Product\Models\ProductAttributeValue;
|
||||||
use Webkul\Product\Models\ProductFlat;
|
use Webkul\Product\Models\ProductFlat;
|
||||||
|
use Webkul\Product\Facades\ProductImage;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use Webkul\Checkout\Models\CartItem as CartItemModel;
|
use Webkul\Checkout\Models\CartItem as CartItemModel;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Webkul\Product\Facades\ProductImage;
|
|
||||||
|
|
||||||
class Configurable extends AbstractType
|
class Configurable extends AbstractType
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -307,6 +307,10 @@
|
||||||
this.config.variant_images[this.simpleProduct].forEach(function(image) {
|
this.config.variant_images[this.simpleProduct].forEach(function(image) {
|
||||||
galleryImages.unshift(image)
|
galleryImages.unshift(image)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.config.variant_videos[this.simpleProduct].forEach(function(video) {
|
||||||
|
galleryImages.unshift(video)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -321,8 +321,18 @@
|
||||||
this.config.variant_images[this.simpleProduct].forEach(function(image) {
|
this.config.variant_images[this.simpleProduct].forEach(function(image) {
|
||||||
galleryImages.unshift(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);
|
eventBus.$emit('configurable-variant-update-images-event', galleryImages);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue