sarga/packages/Webkul/Product/src/Helpers/ConfigurableOption.php

214 lines
6.7 KiB
PHP
Executable File

<?php
namespace Webkul\Product\Helpers;
use Webkul\Product\Models\Product;
use Webkul\Product\Models\ProductAttributeValue;
use Webkul\Product\Facades\ProductImage;
class ConfigurableOption extends AbstractProduct
{
/**
* Returns the allowed variants
*
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
* @return array
*/
public function getAllowedProducts($product)
{
static $variants = [];
if (count($variants)) {
return $variants;
}
foreach ($product->variants as $variant) {
if ($variant->isSaleable()) {
$variants[] = $variant;
}
}
return $variants;
}
/**
* Returns the allowed variants JSON
*
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
* @return array
*/
public function getConfigurationConfig($product)
{
$options = $this->getOptions($product, $this->getAllowedProducts($product));
$config = [
'attributes' => $this->getAttributesData($product, $options),
'index' => isset($options['index']) ? $options['index'] : [],
'regular_price' => [
'formated_price' => $product->getTypeInstance()->haveOffer() ? core()->currency($product->getTypeInstance()->getOfferPrice()) : core()->currency($product->getTypeInstance()->getMinimalPrice()),
'price' => $product->getTypeInstance()->haveOffer() ? $product->getTypeInstance()->getOfferPrice() : $product->getTypeInstance()->getMinimalPrice(),
],
'variant_prices' => $this->getVariantPrices($product),
'variant_images' => $this->getVariantImages($product),
'chooseText' => trans('shop::app.products.choose-option'),
];
return $config;
}
/**
* Get allowed attributes
*
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
* @return \Illuminate\Support\Collection
*/
public function getAllowAttributes($product)
{
return $product->product->super_attributes;
}
/**
* Get Configurable Product Options
*
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $currentProduct
* @param array $allowedProducts
* @return array
*/
public function getOptions($currentProduct, $allowedProducts)
{
$options = [];
$allowAttributes = $this->getAllowAttributes($currentProduct);
foreach ($allowedProducts as $product) {
if ($product instanceof \Webkul\Product\Models\ProductFlat) {
$productId = $product->product_id;
} else {
$productId = $product->id;
}
foreach ($allowAttributes as $productAttribute) {
$productAttributeId = $productAttribute->id;
$attributeValue = $product->{$productAttribute->code};
if ($attributeValue == '' && $product instanceof \Webkul\Product\Models\ProductFlat) {
$attributeValue = $product->product->{$productAttribute->code};
}
$options[$productAttributeId][$attributeValue][] = $productId;
$options['index'][$productId][$productAttributeId] = $attributeValue;
}
}
return $options;
}
/**
* Get product attributes
*
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
* @param array $options
* @return array
*/
public function getAttributesData($product, array $options = [])
{
$defaultValues = [];
$attributes = [];
$allowAttributes = $this->getAllowAttributes($product);
foreach ($allowAttributes as $attribute) {
$attributeOptionsData = $this->getAttributeOptionsData($attribute, $options);
if ($attributeOptionsData) {
$attributeId = $attribute->id;
$attributes[] = [
'id' => $attributeId,
'code' => $attribute->code,
'label' => $attribute->name ? $attribute->name : $attribute->admin_name,
'swatch_type' => $attribute->swatch_type,
'options' => $attributeOptionsData,
];
}
}
return $attributes;
}
/**
* @param \Webkul\Attribute\Contracts\Attribute $attribute
* @param array $options
* @return array
*/
protected function getAttributeOptionsData($attribute, $options)
{
$attributeOptionsData = [];
foreach ($attribute->options as $attributeOption) {
$optionId = $attributeOption->id;
if (isset($options[$attribute->id][$optionId])) {
$attributeOptionsData[] = [
'id' => $optionId,
'label' => $attributeOption->label ? $attributeOption->label : $attributeOption->admin_name,
'swatch_value' => $attribute->swatch_type == 'image' ? $attributeOption->swatch_value_url : $attributeOption->swatch_value,
'products' => $options[$attribute->id][$optionId],
];
}
}
return $attributeOptionsData;
}
/**
* Get product prices for configurable variations
*
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
* @return array
*/
protected function getVariantPrices($product)
{
$prices = [];
foreach ($this->getAllowedProducts($product) as $variant) {
if ($variant instanceof \Webkul\Product\Models\ProductFlat) {
$variantId = $variant->product_id;
} else {
$variantId = $variant->id;
}
$prices[$variantId] = $variant->getTypeInstance()->getProductPrices();
}
return $prices;
}
/**
* Get product images for configurable variations
*
* @param \Webkul\Product\Contracts\Product|\Webkul\Product\Contracts\ProductFlat $product
* @return array
*/
protected function getVariantImages($product)
{
$images = [];
foreach ($this->getAllowedProducts($product) as $variant) {
if ($variant instanceof \Webkul\Product\Models\ProductFlat) {
$variantId = $variant->product_id;
} else {
$variantId = $variant->id;
}
$images[$variantId] = ProductImage::getGalleryImages($variant);
}
return $images;
}
}