diff --git a/config/app.php b/config/app.php index 6603e3b6d..edd6fd40b 100755 --- a/config/app.php +++ b/config/app.php @@ -301,5 +301,7 @@ return [ 'DbView' => Flynsarmy\DbBladeCompiler\Facades\DbView::class, 'PDF' => Barryvdh\DomPDF\Facade::class, 'Excel' => Maatwebsite\Excel\Facades\Excel::class, + 'Concord' => Konekt\Concord\Facades\Concord::class, + 'Helper' => Konekt\Concord\Facades\Helper::class, ], ]; \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Listeners/Product.php b/packages/Webkul/Admin/src/Listeners/Product.php index 6fad7284f..4a3d8bbb4 100755 --- a/packages/Webkul/Admin/src/Listeners/Product.php +++ b/packages/Webkul/Admin/src/Listeners/Product.php @@ -38,7 +38,12 @@ class Product { */ protected $productGrid; - public function __construct(ProductRepository $product, ProductGridRepository $productGrid, ProductFlatRepository $productFlat, Price $price) + public function __construct( + ProductRepository $product, + ProductGridRepository $productGrid, + ProductFlatRepository $productFlat, + Price $price + ) { $this->product = $product; diff --git a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/variations.blade.php b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/variations.blade.php index 2be66590d..5d6faa7fa 100755 --- a/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/variations.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/catalog/products/accordians/variations.blade.php @@ -183,7 +183,7 @@ ]; }); - var super_attributes = @json($product->super_attributes); + var super_attributes = @json($product->super_attributes()->with('options')->get()); var variants = @json($product->variants); Vue.component('variant-form', { diff --git a/packages/Webkul/Attribute/src/Models/Attribute.php b/packages/Webkul/Attribute/src/Models/Attribute.php index 8fd43e016..e6bf8ba94 100755 --- a/packages/Webkul/Attribute/src/Models/Attribute.php +++ b/packages/Webkul/Attribute/src/Models/Attribute.php @@ -11,7 +11,7 @@ class Attribute extends TranslatableModel implements AttributeContract protected $fillable = ['code', 'admin_name', 'type', 'position', 'is_required', 'is_unique', 'validation', 'value_per_locale', 'value_per_channel', 'is_filterable', 'is_configurable', 'is_visible_on_front', 'is_user_defined', 'swatch_type']; - protected $with = ['options', 'translations']; + // protected $with = ['options']; /** * Get the options. diff --git a/packages/Webkul/Attribute/src/Models/AttributeOption.php b/packages/Webkul/Attribute/src/Models/AttributeOption.php index d92b8e6d0..ad81ea63a 100755 --- a/packages/Webkul/Attribute/src/Models/AttributeOption.php +++ b/packages/Webkul/Attribute/src/Models/AttributeOption.php @@ -14,8 +14,6 @@ class AttributeOption extends TranslatableModel implements AttributeOptionContra protected $fillable = ['admin_name', 'swatch_value', 'sort_order', 'attribute_id']; - protected $with = ['translations']; - /** * Get the attribute that owns the attribute option. */ diff --git a/packages/Webkul/Category/src/Repositories/CategoryRepository.php b/packages/Webkul/Category/src/Repositories/CategoryRepository.php index ec23041e3..d37c06597 100755 --- a/packages/Webkul/Category/src/Repositories/CategoryRepository.php +++ b/packages/Webkul/Category/src/Repositories/CategoryRepository.php @@ -99,18 +99,14 @@ class CategoryRepository extends Repository */ public function getVisibleCategoryTree($id = null) { - static $categories; + static $categories = []; - if ($categories[$id]) + if(array_key_exists($id, $categories)) return $categories[$id]; - if ($id) { - $categories[$id] = Category::orderBy('position', 'ASC')->where('status', 1)->descendantsOf($id)->toTree(); - } else { - $categories[$id] = Category::orderBy('position', 'ASC')->where('status', 1)->get()->toTree(); - } - - return $categories[$id]; + return $categories[$id] = $id + ? Category::orderBy('position', 'ASC')->where('status', 1)->descendantsOf($id)->toTree() + : Category::orderBy('position', 'ASC')->where('status', 1)->get()->toTree(); } /** diff --git a/packages/Webkul/Checkout/src/Cart.php b/packages/Webkul/Checkout/src/Cart.php index 776e31b0b..4042c5014 100755 --- a/packages/Webkul/Checkout/src/Cart.php +++ b/packages/Webkul/Checkout/src/Cart.php @@ -566,7 +566,10 @@ class Cart { */ public function getCart() { - $cart = null; + static $cart; + + if ($cart) + return $cart; if (auth()->guard('customer')->check()) { $cart = $this->cart->findOneWhere([ @@ -592,12 +595,16 @@ class Cart { $data = $cart->toArray(); - $data['shipping_address'] = current($data['shipping_address']); + $data['shipping_address'] = $cart->shipping_address->toArray(); - $data['billing_address'] = current($data['billing_address']); + $data['billing_address'] = $cart->billing_address->toArray(); $data['selected_shipping_rate'] = $cart->selected_shipping_rate->toArray(); + $data['payment'] = $cart->payment->toArray(); + + $data['items'] = $cart->items->toArray(); + return $data; } @@ -612,7 +619,6 @@ class Cart { $labels = []; - $attribute = $product->parent->super_attributes; foreach ($product->parent->super_attributes as $attribute) { $option = $attribute->options()->where('id', $product->{$attribute->code})->first(); @@ -834,20 +840,22 @@ class Cart { $items = $cart->items; foreach ($items as $item) { - if ($item->product->type == 'configurable') { - if ($item->product->sku != $item->sku) { - $item->update(['sku' => $item->product->sku]); + $productFlat = $item->product_flat; - } else if ($item->product->name != $item->name) { - $item->update(['name' => $item->product->name]); + if ($productFlat->type == 'configurable') { + if ($productFlat->sku != $item->sku) { + $item->update(['sku' => $productFlat->sku]); - } else if ($this->price->getMinimalPrice($item->child->product) != $item->price) { + } else if ($productFlat->name != $item->name) { + $item->update(['name' => $productFlat->name]); + + } else if ($this->price->getMinimalPrice($item->child->product_flat) != $item->price) { // $price = (float) $item->custom_price ? $item->custom_price : $item->child->product->price; if ((float)$item->custom_price) { $price = $item->custom_price; } else { - $price = $this->price->getMinimalPrice($item->child->product); + $price = $this->price->getMinimalPrice($item->child->product_flat); } $item->update([ @@ -858,20 +866,20 @@ class Cart { ]); } - } else if ($item->product->type == 'simple') { - if ($item->product->sku != $item->sku) { - $item->update(['sku' => $item->product->sku]); + } else if ($productFlat->type == 'simple') { + if ($productFlat->sku != $item->sku) { + $item->update(['sku' => $productFlat->sku]); - } else if ($item->product->name != $item->name) { - $item->update(['name' => $item->product->name]); + } else if ($productFlat->name != $item->name) { + $item->update(['name' => $productFlat->name]); - } else if ($this->price->getMinimalPrice($item->product) != $item->price) { + } else if ($this->price->getMinimalPrice($productFlat) != $item->price) { // $price = (float) $item->custom_price ? $item->custom_price : $item->product->price; if ((float)$item->custom_price) { $price = $item->custom_price; } else { - $price = $this->price->getMinimalPrice($item->product); + $price = $this->price->getMinimalPrice($productFlat); } $item->update([ @@ -1092,7 +1100,7 @@ class Cart { if ($product->type == 'simple') { $data['quantity'] = 1; - $data['product'] = $wishlistItem->product->id; + $data['product'] = $product->id; $result = $this->add($product->id, $data); diff --git a/packages/Webkul/Checkout/src/Http/ViewComposers/CartComposer.php b/packages/Webkul/Checkout/src/Http/ViewComposers/CartComposer.php deleted file mode 100755 index ffd56c398..000000000 --- a/packages/Webkul/Checkout/src/Http/ViewComposers/CartComposer.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com) - */ -class CartComposer -{ - - /** - * The cart implementation - * for shop bundle's navigation - * menu - */ - protected $cart; - - /** - * Bind data to the view. - * - * @param View $view - * @return void - */ - public function __construct(CartRepository $cart, CartItemRepository $cartItem, ProductImage $productImage) { - $this->cart = $cart; - - $this->cartItem = $cartItem; - - $this->productImage = $productImage; - } - - public function compose(View $view) { - - } -} diff --git a/packages/Webkul/Checkout/src/Models/Cart.php b/packages/Webkul/Checkout/src/Models/Cart.php index ae1090489..8a91e215b 100755 --- a/packages/Webkul/Checkout/src/Models/Cart.php +++ b/packages/Webkul/Checkout/src/Models/Cart.php @@ -14,7 +14,7 @@ class Cart extends Model implements CartContract protected $hidden = ['coupon_code']; - protected $with = ['items', 'items.child', 'shipping_address', 'billing_address', 'selected_shipping_rate', 'payment']; + protected $with = ['items', 'items.child']; /** * To get relevant associated items with the cart instance diff --git a/packages/Webkul/Checkout/src/Models/CartItem.php b/packages/Webkul/Checkout/src/Models/CartItem.php index f7ae968a3..3a53425cb 100755 --- a/packages/Webkul/Checkout/src/Models/CartItem.php +++ b/packages/Webkul/Checkout/src/Models/CartItem.php @@ -4,6 +4,7 @@ namespace Webkul\Checkout\Models; use Illuminate\Database\Eloquent\Model; use Webkul\Product\Models\ProductProxy; +use Webkul\Product\Models\ProductFlatProxy; use Webkul\Checkout\Contracts\CartItem as CartItemContract; @@ -22,6 +23,26 @@ class CartItem extends Model implements CartItemContract return $this->hasOne(ProductProxy::modelClass(), 'id', 'product_id'); } + /** + * The Product Flat that belong to the product. + */ + public function product_flat() + { + return (ProductFlatProxy::modelClass()) + ::where('product_flat.product_id', $this->product_id) + ->where('product_flat.locale', app()->getLocale()) + ->where('product_flat.channel', core()->getCurrentChannelCode()) + ->select('product_flat.*'); + } + + /** + * Get all of the attributes for the attribute groups. + */ + public function getProductFlatAttribute() + { + return $this->product_flat()->first(); + } + public function cart() { return $this->hasOne(CartProxy::modelClass(), 'id', 'cart_id'); diff --git a/packages/Webkul/Core/src/Core.php b/packages/Webkul/Core/src/Core.php index 8b2daefdb..c2dc10887 100755 --- a/packages/Webkul/Core/src/Core.php +++ b/packages/Webkul/Core/src/Core.php @@ -340,7 +340,7 @@ class Core */ public function convertPrice($amount, $targetCurrencyCode = null) { - $targetCurrency = !$targetCurrencyCode + $targetCurrency = ! $targetCurrencyCode ? $this->getCurrentCurrency() : $this->currencyRepository->findOneByField('code', $targetCurrencyCode); diff --git a/packages/Webkul/Product/src/Contracts/Criteria/ActiveProductCriteria.php b/packages/Webkul/Product/src/Contracts/Criteria/ActiveProductCriteria.php deleted file mode 100755 index b353d592f..000000000 --- a/packages/Webkul/Product/src/Contracts/Criteria/ActiveProductCriteria.php +++ /dev/null @@ -1,56 +0,0 @@ -attribute = $attribute; - } - - /** - * Apply criteria in query repository - * - * @param string $model - * @param RepositoryInterface $repository - * - * @return mixed - */ - public function apply($model, RepositoryInterface $repository) - { - foreach (['status', 'visible_individually'] as $code) { - $attribute = $this->attribute->findOneByField('code', $code); - - $alias = 'filter_' . $attribute->code; - - $model = $model->leftJoin('product_attribute_values as ' . $alias, 'products.id', '=', $alias . '.product_id'); - - $model = $this->applyChannelLocaleFilter($attribute, $model, $alias); - - $model->where($alias . '.boolean_value', 1) - ->where($alias . '.attribute_id', $attribute->id); - } - - return $model; - } -} diff --git a/packages/Webkul/Product/src/Contracts/Criteria/AttributeToSelectCriteria.php b/packages/Webkul/Product/src/Contracts/Criteria/AttributeToSelectCriteria.php deleted file mode 100755 index 1551e8f8f..000000000 --- a/packages/Webkul/Product/src/Contracts/Criteria/AttributeToSelectCriteria.php +++ /dev/null @@ -1,79 +0,0 @@ -attribute = $attribute; - } - - /** - * Set attributes in attributeToSelect variable - * - * @param array|string $attributes - * - * @return mixed - */ - public function addAttribueToSelect($attributes) - { - $this->attributeToSelect = $attributes; - - return $this; - } - - /** - * Apply criteria in query repository - * - * @param string $model - * @param RepositoryInterface $repository - * - * @return mixed - */ - public function apply($model, RepositoryInterface $repository) - { - $model = $model->select('products.*'); - - foreach ($this->attribute->getProductDefaultAttributes() as $attribute) { - $productValueAlias = 'pav_' . $attribute->code; - - $model = $model->leftJoin('product_attribute_values as ' . $productValueAlias, function($qb) use($attribute, $productValueAlias) { - - $qb = $this->applyChannelLocaleFilter($attribute, $qb, $productValueAlias); - - $qb->on('products.id', $productValueAlias . '.product_id') - ->where($productValueAlias . '.attribute_id', $attribute->id); - }); - - $model = $model->addSelect($productValueAlias . '.' . ProductAttributeValue::$attributeTypeFields[$attribute->type] . ' as ' . $attribute->code); - } - - return $model; - } -} diff --git a/packages/Webkul/Product/src/Helpers/AbstractProduct.php b/packages/Webkul/Product/src/Helpers/AbstractProduct.php index f27be092a..50650ad4c 100755 --- a/packages/Webkul/Product/src/Helpers/AbstractProduct.php +++ b/packages/Webkul/Product/src/Helpers/AbstractProduct.php @@ -3,9 +3,18 @@ namespace Webkul\Product\Helpers; use Webkul\Product\Models\ProductAttributeValue; +use Webkul\Product\Models\ProductFlatProxy; +use Webkul\Product\Models\ProductFlat; abstract class AbstractProduct { + /** + * array + * + * @var array + */ + protected $productFlat = []; + /** * Add Channle and Locale filter * @@ -35,4 +44,27 @@ abstract class AbstractProduct return $qb; } + + /** + * Sets product flat variable + * + * @param Product $product + * @return void + */ + public function setProductFlat($product) + { + if (array_key_exists($product->id, $this->productFlat)) + return; + + if (! $product instanceof ProductFlat) { + $this->productFlat[$product->id] = ProductFlatProxy::modelClass() + ::where('product_flat.product_id', $product->id) + ->where('product_flat.locale', app()->getLocale()) + ->where('product_flat.channel', core()->getCurrentChannelCode()) + ->select('product_flat.*') + ->first(); + } else { + $this->productFlat[$product->id] = $product; + } + } } \ No newline at end of file diff --git a/packages/Webkul/Product/src/Helpers/ConfigurableOption.php b/packages/Webkul/Product/src/Helpers/ConfigurableOption.php index 08698d8c6..5cc6b0513 100755 --- a/packages/Webkul/Product/src/Helpers/ConfigurableOption.php +++ b/packages/Webkul/Product/src/Helpers/ConfigurableOption.php @@ -107,7 +107,7 @@ class ConfigurableOption extends AbstractProduct */ public function getAllowAttributes($product) { - return $product->super_attributes; + return $product->product->super_attributes; } /** @@ -124,8 +124,11 @@ class ConfigurableOption extends AbstractProduct $allowAttributes = $this->getAllowAttributes($currentProduct); foreach ($allowedProducts as $product) { - - $productId = $product->id; + if ($product instanceof \Webkul\Product\Models\ProductFlat) { + $productId = $product->product_id; + } else { + $productId = $product->id; + } foreach ($allowAttributes as $productAttribute) { $productAttributeId = $productAttribute->id; @@ -154,7 +157,9 @@ class ConfigurableOption extends AbstractProduct $attributes = []; - foreach ($product->super_attributes as $attribute) { + $allowAttributes = $this->getAllowAttributes($product); + + foreach ($allowAttributes as $attribute) { $attributeOptionsData = $this->getAttributeOptionsData($attribute, $options); @@ -211,7 +216,13 @@ class ConfigurableOption extends AbstractProduct $prices = []; foreach ($this->getAllowedProducts($product) as $variant) { - $prices[$variant->id] = [ + if ($variant instanceof \Webkul\Product\Models\ProductFlat) { + $variantId = $variant->product_id; + } else { + $variantId = $variant->id; + } + + $prices[$variantId] = [ 'regular_price' => [ 'formated_price' => core()->currency($variant->price), 'price' => $variant->price @@ -237,7 +248,13 @@ class ConfigurableOption extends AbstractProduct $images = []; foreach ($this->getAllowedProducts($product) as $variant) { - $images[$variant->id] = $this->productImage->getGalleryImages($variant); + if ($variant instanceof \Webkul\Product\Models\ProductFlat) { + $variantId = $variant->product_id; + } else { + $variantId = $variant->id; + } + + $images[$variantId] = $this->productImage->getGalleryImages($variant); } return $images; diff --git a/packages/Webkul/Product/src/Helpers/Price.php b/packages/Webkul/Product/src/Helpers/Price.php index fc8d980d9..d36d49bb9 100755 --- a/packages/Webkul/Product/src/Helpers/Price.php +++ b/packages/Webkul/Product/src/Helpers/Price.php @@ -5,6 +5,7 @@ namespace Webkul\Product\Helpers; use Webkul\Attribute\Repositories\AttributeRepository as Attribute; use Webkul\Product\Models\ProductAttributeValue; use Webkul\Product\Models\Product; +use Webkul\Product\Models\ProductFlat; class Price extends AbstractProduct { @@ -34,14 +35,19 @@ class Price extends AbstractProduct */ public function getMinimalPrice($product) { + static $price = []; + + if(array_key_exists($product->id, $price)) + return $price[$product->id]; + if ($product->type == 'configurable') { - return $this->getVariantMinPrice($product); + return $price[$product->id] = $this->getVariantMinPrice($product); } else { if ($this->haveSpecialPrice($product)) { - return $product->special_price; - } else { - return $product->price; + return $price[$product->id] = $product->special_price; } + + return $price[$product->id] = $product->price; } } @@ -53,20 +59,30 @@ class Price extends AbstractProduct */ public function getVariantMinPrice($product) { - static $attribute; + static $price = []; - if (! $attribute) - $attribute = $this->attribute->findOneByField('code', 'price'); + if(array_key_exists($product->id, $price)) + return $price[$product->id]; + $attribute = $this->attribute->findOneByField('code', 'price'); + + if ($product instanceof ProductFlat) { + $productId = $product->product_id; + } else { + $productId = $product->id; + } + + + //Todo => can be optimized $qb = ProductAttributeValue::join('products', 'product_attribute_values.product_id', '=', 'products.id') ->join('attributes', 'product_attribute_values.attribute_id', '=', 'attributes.id') - ->where('products.parent_id', $product->id) + ->where('products.parent_id', $productId) ->where('attributes.code', 'price') ->addSelect('product_attribute_values.*'); $this->applyChannelLocaleFilter($attribute, $qb); - return $qb->min('product_attribute_values.' . ProductAttributeValue::$attributeTypeFields['price']); + return $price[$product->id] = $qb->min('product_attribute_values.' . ProductAttributeValue::$attributeTypeFields['price']); } /** @@ -77,10 +93,15 @@ class Price extends AbstractProduct */ public function getSpecialPrice($product) { + static $price = []; + + if(array_key_exists($product->id, $price)) + return $price[$product->id]; + if ($this->haveSpecialPrice($product)) { - return $product->special_price; + return $price[$product->id] = $product->special_price; } else { - return $product->price; + return $price[$product->id] = $product->price; } } @@ -90,7 +111,7 @@ class Price extends AbstractProduct */ public function haveSpecialPrice($product) { - if (is_null($product->special_price) || !$product->special_price) + if (is_null($product->special_price) || ! (float) $product->special_price) return false; if (core()->isChannelDateInInterval($product->special_price_from, $product->special_price_to)) { diff --git a/packages/Webkul/Product/src/Helpers/ProductImage.php b/packages/Webkul/Product/src/Helpers/ProductImage.php index b4769d530..778995166 100755 --- a/packages/Webkul/Product/src/Helpers/ProductImage.php +++ b/packages/Webkul/Product/src/Helpers/ProductImage.php @@ -15,23 +15,24 @@ class ProductImage extends AbstractProduct */ public function getGalleryImages($product) { + if (! $product) + return []; + $images = []; - if ($product) { - foreach ($product->images as $image) { - if (! Storage::has($image->path)) - continue; + foreach ($product->images as $image) { + if (! Storage::has($image->path)) + continue; - $images[] = [ - 'small_image_url' => url('cache/small/' . $image->path), - 'medium_image_url' => url('cache/medium/' . $image->path), - 'large_image_url' => url('cache/large/' . $image->path), - 'original_image_url' => url('cache/original/' . $image->path), - ]; - } + $images[] = [ + 'small_image_url' => url('cache/small/' . $image->path), + 'medium_image_url' => url('cache/medium/' . $image->path), + 'large_image_url' => url('cache/large/' . $image->path), + 'original_image_url' => url('cache/original/' . $image->path), + ]; } - if (! $product || (! $product->parent_id && !count($images))) { + if (! $product->parent_id && ! count($images)) { $images[] = [ 'small_image_url' => asset('vendor/webkul/ui/assets/images/product/small-product-placeholder.png'), 'medium_image_url' => asset('vendor/webkul/ui/assets/images/product/meduim-product-placeholder.png'), @@ -51,8 +52,12 @@ class ProductImage extends AbstractProduct */ public function getProductBaseImage($product) { - if ($product && $product->images->count()) { - $images = $product->images; + if (! $product) + return []; + + $images = $product->images; + + if ($images->count()) { $image = [ 'small_image_url' => url('cache/small/' . $images[0]->path), 'medium_image_url' => url('cache/medium/' . $images[0]->path), diff --git a/packages/Webkul/Product/src/Helpers/Review.php b/packages/Webkul/Product/src/Helpers/Review.php index 55b1468a9..72a1059fe 100755 --- a/packages/Webkul/Product/src/Helpers/Review.php +++ b/packages/Webkul/Product/src/Helpers/Review.php @@ -13,7 +13,12 @@ class Review extends AbstractProduct */ public function getReviews($product) { - return $product->reviews()->where('status', 'approved'); + static $reviews = []; + + if(array_key_exists($product->id, $reviews)) + return $reviews[$product->id]; + + return $reviews[$product->id] = $product->reviews()->where('status', 'approved'); } /** @@ -24,7 +29,12 @@ class Review extends AbstractProduct */ public function getAverageRating($product) { - return number_format(round($product->reviews()->where('status', 'approved')->average('rating'), 2), 1); + static $avgRating = []; + + if(array_key_exists($product->id, $avgRating)) + return $avgRating[$product->id]; + + return $avgRating[$product->id] = number_format(round($product->reviews()->where('status', 'approved')->average('rating'), 2), 1); } /** @@ -35,7 +45,12 @@ class Review extends AbstractProduct */ public function getTotalReviews($product) { - return $product->reviews()->where('status', 'approved')->count(); + static $totalReviews = []; + + if(array_key_exists($product->id, $totalReviews)) + return $totalReviews[$product->id]; + + return $totalReviews[$product->id] = $product->reviews()->where('status', 'approved')->count(); } /** @@ -46,7 +61,12 @@ class Review extends AbstractProduct */ public function getTotalRating($product) { - return $product->reviews()->where('status','approved')->sum('rating'); + static $totalRating = []; + + if(array_key_exists($product->id, $totalRating)) + return $totalRating[$product->id]; + + return $totalRating[$product->id] = $product->reviews()->where('status','approved')->sum('rating'); } /** @@ -57,17 +77,20 @@ class Review extends AbstractProduct */ public function getPercentageRating($product) { - $reviews = $product->reviews()->where('status','approved') + $reviews = $product->reviews()->where('status', 'approved') ->select('rating', DB::raw('count(*) as total')) ->groupBy('rating') ->orderBy('rating','desc') ->get(); + $totalReviews = $this->getTotalReviews($product); + for ($i = 5; $i >= 1; $i--) { if (! $reviews->isEmpty()) { foreach ($reviews as $review) { if ($review->rating == $i) { - $percentage[$i] = round(($review->total/$this->getTotalReviews($product))*100); + $percentage[$i] = round(($review->total / $totalReviews) * 100); + break; } else { $percentage[$i]=0; diff --git a/packages/Webkul/Product/src/Helpers/View.php b/packages/Webkul/Product/src/Helpers/View.php index 2c4904d24..abbf961de 100755 --- a/packages/Webkul/Product/src/Helpers/View.php +++ b/packages/Webkul/Product/src/Helpers/View.php @@ -14,52 +14,23 @@ class View extends AbstractProduct { $data = []; - $attributes = $product->attribute_family->custom_attributes()->where('attributes.is_visible_on_front', 1)->get(); - - $attributeOptionReposotory = app('Webkul\Attribute\Repositories\AttributeOptionRepository'); + $attributes = $product->product->attribute_family->custom_attributes()->where('attributes.is_visible_on_front', 1)->get(); foreach ($attributes as $attribute) { + $value = $product->{$attribute->code}; + if ($attribute->type == 'boolean') { - $value = $product->{$attribute->code} ? 'Yes' : 'No'; - - $data[] = [ - 'code' => $attribute->code, - 'label' => $attribute->name, - 'value' => $value, - 'admin_name' => $attribute->admin_name, - ]; - } else if ($product->{$attribute->code}) { - $value = $product->{$attribute->code}; - - if ($attribute->type == 'select') { - $attributeOption = $attributeOptionReposotory->find($value); - - if ($attributeOption) { - $value = $attributeOption->label; - } - } else if ($attribute->type == 'multiselect') { - $optionIds = explode(",", $value); - - if (count($optionIds)) { - $attributeOptions = $attributeOptionReposotory->findWhereIn('id', $optionIds); - - foreach ($attributeOptions as $attributeOption) { - if ($attributeOption && $attributeOption->label) { - $result[] = $attributeOption->label; - } - } - - $value = implode(", ", $result); - } - } - - $data[] = [ - 'code' => $attribute->code, - 'label' => $attribute->name, - 'value' => $value, - 'admin_name' => $attribute->admin_name, - ]; + $value = $value ? 'Yes' : 'No'; + } else if ($attribute->type == 'select' || $attribute->type == 'multiselect') { + $value = $product->{$attribute->code . '_label'}; } + + $data[] = [ + 'code' => $attribute->code, + 'label' => $attribute->name, + 'value' => $value, + 'admin_name' => $attribute->admin_name, + ]; } return $data; diff --git a/packages/Webkul/Product/src/Http/Controllers/ProductController.php b/packages/Webkul/Product/src/Http/Controllers/ProductController.php index be4a4d016..c2224e161 100755 --- a/packages/Webkul/Product/src/Http/Controllers/ProductController.php +++ b/packages/Webkul/Product/src/Http/Controllers/ProductController.php @@ -167,7 +167,7 @@ class ProductController extends Controller */ public function edit($id) { - $product = $this->product->with(['variants'])->findOrFail($id); + $product = $this->product->with(['variants', 'variants.inventories'])->findOrFail($id); $categories = $this->category->getCategoryTree(); diff --git a/packages/Webkul/Product/src/Models/Product.php b/packages/Webkul/Product/src/Models/Product.php index 3cfa6487c..248ab4efc 100755 --- a/packages/Webkul/Product/src/Models/Product.php +++ b/packages/Webkul/Product/src/Models/Product.php @@ -13,7 +13,7 @@ class Product extends Model implements ProductContract { protected $fillable = ['type', 'attribute_family_id', 'sku', 'parent_id']; - protected $with = ['attribute_family', 'inventories']; + // protected $with = ['attribute_family', 'inventories']; // protected $table = 'products'; @@ -206,7 +206,7 @@ class Product extends Model implements ProductContract */ public function getAttribute($key) { - if (! method_exists(self::class, $key) && !in_array($key, ['parent_id', 'attribute_family_id']) && !isset($this->attributes[$key])) { + if (! method_exists(self::class, $key) && ! in_array($key, ['parent_id', 'attribute_family_id']) && ! isset($this->attributes[$key])) { if (isset($this->id)) { $this->attributes[$key] = ''; diff --git a/packages/Webkul/Product/src/Models/ProductFlat.php b/packages/Webkul/Product/src/Models/ProductFlat.php index 06151c4cc..93a7aa59b 100644 --- a/packages/Webkul/Product/src/Models/ProductFlat.php +++ b/packages/Webkul/Product/src/Models/ProductFlat.php @@ -28,4 +28,74 @@ class ProductFlat extends Model implements ProductFlatContract { return $this->hasMany(self::class, 'parent_id'); } + + /** + * Get product type value from base product + */ + public function getTypeAttribute() + { + return $this->product->type; + } + + /** + * @param string $key + * + * @return bool + */ + public function isSaleable() + { + if (! $this->status) + return false; + + if ($this->haveSufficientQuantity(1)) + return true; + + return false; + } + + /** + * @param integer $qty + * + * @return bool + */ + public function haveSufficientQuantity($qty) + { + return $this->product->haveSufficientQuantity($qty); + } + + /** + * The images that belong to the product. + */ + public function images() + { + return (ProductImageProxy::modelClass()) + ::where('product_images.product_id', $this->product_id) + ->select('product_images.*'); + } + + /** + * Get all of the attributes for the attribute groups. + */ + public function getImagesAttribute() + { + return $this->images()->get(); + } + + /** + * The reviews that belong to the product. + */ + public function reviews() + { + return (ProductReviewProxy::modelClass()) + ::where('product_reviews.product_id', $this->product_id) + ->select('product_reviews.*'); + } + + /** + * Get all of the reviews for the attribute groups. + */ + public function getReviewsAttribute() + { + return $this->images()->get(); + } } \ No newline at end of file diff --git a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php index d62edcc6e..cc9358ed9 100644 --- a/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php +++ b/packages/Webkul/Product/src/Repositories/ProductFlatRepository.php @@ -5,7 +5,6 @@ namespace Webkul\Product\Repositories; use Illuminate\Container\Container as App; use Webkul\Core\Eloquent\Repository; use Webkul\Product\Repositories\ProductRepository as Product; -use Webkul\Product\Helpers\Price; /** * Product Repository @@ -26,13 +25,9 @@ class ProductFlatRepository extends Repository public function __construct( Product $product, - Price $price, App $app ) { $this->product = $product; - - $this->price = $price; - parent::__construct($app); } diff --git a/packages/Webkul/Product/src/Repositories/ProductRepository.php b/packages/Webkul/Product/src/Repositories/ProductRepository.php index b4d7fa6d7..96cac0473 100755 --- a/packages/Webkul/Product/src/Repositories/ProductRepository.php +++ b/packages/Webkul/Product/src/Repositories/ProductRepository.php @@ -9,8 +9,6 @@ use Webkul\Core\Eloquent\Repository; use Webkul\Attribute\Repositories\AttributeRepository; use Webkul\Attribute\Repositories\AttributeOptionRepository; use Webkul\Product\Models\ProductAttributeValue; -use Webkul\Product\Contracts\Criteria\ActiveProductCriteria; -use Webkul\Product\Contracts\Criteria\AttributeToSelectCriteria; use Illuminate\Database\Eloquent\ModelNotFoundException; /** @@ -518,25 +516,19 @@ class ProductRepository extends Repository */ public function findBySlugOrFail($slug, $columns = null) { - $attribute = $this->attribute->findOneByField('code', 'url_key'); + $product = app('Webkul\Product\Repositories\ProductFlatRepository')->findOneWhere([ + 'url_key' => $slug, + 'locale' => app()->getLocale(), + 'channel' => core()->getCurrentChannelCode(), + ]); - $attributeValue = $this->attributeValue->findOneWhere([ - 'attribute_id' => $attribute->id, - ProductAttributeValue::$attributeTypeFields[$attribute->type] => $slug - ], ['product_id']); - - if ($attributeValue && $attributeValue->product_id) { - $this->pushCriteria(app(ActiveProductCriteria::class)); - $this->pushCriteria(app(AttributeToSelectCriteria::class)->addAttribueToSelect($columns)); - - $product = $this->findOrFail($attributeValue->product_id); - - return $product; + if (! $product) { + throw (new ModelNotFoundException)->setModel( + get_class($this->model), $slug + ); } - throw (new ModelNotFoundException)->setModel( - get_class($this->model), $slug - ); + return $product; } /** diff --git a/packages/Webkul/Shop/src/Http/Controllers/CartController.php b/packages/Webkul/Shop/src/Http/Controllers/CartController.php index 282df58fb..b1d690405 100755 --- a/packages/Webkul/Shop/src/Http/Controllers/CartController.php +++ b/packages/Webkul/Shop/src/Http/Controllers/CartController.php @@ -9,8 +9,6 @@ use Webkul\Checkout\Repositories\CartItemRepository; use Webkul\Product\Repositories\ProductRepository; use Webkul\Customer\Repositories\CustomerRepository; use Webkul\Customer\Repositories\WishlistRepository; -use Webkul\Product\Helpers\ProductImage; -use Webkul\Product\Helpers\View as ProductView; use Illuminate\Support\Facades\Event; use Cart; @@ -32,7 +30,6 @@ class CartController extends Controller * @param $cartItem * @param $customer * @param $product - * @param $productImage * @param $productView */ protected $_config; @@ -45,8 +42,6 @@ class CartController extends Controller protected $product; - protected $productView; - protected $suppressFlash = false; /** @@ -61,8 +56,6 @@ class CartController extends Controller CartItemRepository $cartItem, CustomerRepository $customer, ProductRepository $product, - ProductImage $productImage, - ProductView $productView, WishlistRepository $wishlist ) { @@ -77,10 +70,6 @@ class CartController extends Controller $this->product = $product; - $this->productImage = $productImage; - - $this->productView = $productView; - $this->wishlist = $wishlist; $this->_config = request('_config'); diff --git a/packages/Webkul/Shop/src/Http/Controllers/HomeController.php b/packages/Webkul/Shop/src/Http/Controllers/HomeController.php index db6df7a96..2fd854e37 100755 --- a/packages/Webkul/Shop/src/Http/Controllers/HomeController.php +++ b/packages/Webkul/Shop/src/Http/Controllers/HomeController.php @@ -31,6 +31,9 @@ use Webkul\Core\Repositories\SliderRepository as Sliders; */ public function index() { + if (request()->route('any')) + abort(404); + $current_channel = core()->getCurrentChannel(); $all_sliders = $this->sliders->findWhere(['channel_id' => $current_channel['id']]); diff --git a/packages/Webkul/Shop/src/Http/routes.php b/packages/Webkul/Shop/src/Http/routes.php index 37952a061..1580a947d 100755 --- a/packages/Webkul/Shop/src/Http/routes.php +++ b/packages/Webkul/Shop/src/Http/routes.php @@ -2,7 +2,7 @@ Route::group(['middleware' => ['web', 'locale', 'theme', 'currency']], function () { //Store front home - Route::get('/', 'Webkul\Shop\Http\Controllers\HomeController@index')->defaults('_config', [ + Route::get('/{any?}', 'Webkul\Shop\Http\Controllers\HomeController@index')->defaults('_config', [ 'view' => 'shop::home.index' ])->name('shop.home.index'); diff --git a/packages/Webkul/Shop/src/Resources/views/checkout/onepage/review.blade.php b/packages/Webkul/Shop/src/Resources/views/checkout/onepage/review.blade.php index 2c5deca95..8ef912c1c 100755 --- a/packages/Webkul/Shop/src/Resources/views/checkout/onepage/review.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/checkout/onepage/review.blade.php @@ -73,7 +73,7 @@ $productBaseImage = $productImageHelper->getProductBaseImage($product); ?> -