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\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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
},
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue