Untitled
unknown
php_laravel_blade
a year ago
12 kB
6
Indexable
// ProductCustController.php public function index() { $categoryId = request()->input('category_id'); $products = ProductResource::collection($this->productRepository->getAll($categoryId)); return $products; } // ProductRepository.php public function getAll($categoryId = null) { $params = request()->input(); if (core()->getConfigData('catalog.products.storefront.products_per_page')) { $pages = explode(',', core()->getConfigData('catalog.products.storefront.products_per_page')); $perPage = isset($params['limit']) ? (! empty($params['limit']) ? $params['limit'] : 9) : current($pages); } else { $perPage = isset($params['limit']) && ! empty($params['limit']) ? $params['limit'] : 9; } $page = Paginator::resolveCurrentPage('page'); $repository = app(ProductFlatRepository::class)->scopeQuery(function ($query) use ($params, $categoryId) { $channel = core()->getRequestedChannelCode(); $locale = core()->getRequestedLocaleCode(); $qb = $query->distinct() ->select('product_flat.*') ->join('product_flat as variants', 'product_flat.id', '=', DB::raw('COALESCE(' . DB::getTablePrefix() . 'variants.parent_id, ' . DB::getTablePrefix() . 'variants.id)')) ->leftJoin('product_categories', 'product_categories.product_id', '=', 'product_flat.product_id') ->leftJoin('product_attribute_values', 'product_attribute_values.product_id', '=', 'variants.product_id') ->where('product_flat.channel', $channel) ->where('product_flat.locale', $locale) ->whereNotNull('product_flat.url_key'); if ($categoryId) { $qb->whereIn('product_categories.category_id', explode(',', $categoryId)); } if (! core()->getConfigData('catalog.products.homepage.out_of_stock_items')) { $qb = $this->checkOutOfStockItem($qb); } if (is_null(request()->input('status'))) { $qb->where('product_flat.status', 1); } if (is_null(request()->input('visible_individually'))) { $qb->where('product_flat.visible_individually', 1); } if (isset($params['search'])) { $qb->where('product_flat.name', 'like', '%' . urldecode($params['search']) . '%'); } /* added for api as per the documentation */ if (isset($params['name'])) { $qb->where('product_flat.name', 'like', '%' . urldecode($params['name']) . '%'); } /* added for api as per the documentation */ if (isset($params['url_key'])) { $qb->where('product_flat.url_key', 'like', '%' . urldecode($params['url_key']) . '%'); } # sort direction $orderDirection = 'asc'; if (isset($params['order']) && in_array($params['order'], ['desc', 'asc'])) { $orderDirection = $params['order']; } else { $sortOptions = $this->getDefaultSortByOption(); $orderDirection = ! empty($sortOptions) ? $sortOptions[1] : 'asc'; } if (isset($params['sort'])) { $this->checkSortAttributeAndGenerateQuery($qb, $params['sort'], $orderDirection); } else { $sortOptions = $this->getDefaultSortByOption(); if (! empty($sortOptions)) { $this->checkSortAttributeAndGenerateQuery($qb, $sortOptions[0], $orderDirection); } } if ($priceFilter = request('price')) { $priceRange = explode(',', $priceFilter); if (count($priceRange) > 0) { $customerGroupId = null; if (Cart::getCurrentCustomer()->check()) { $customerGroupId = Cart::getCurrentCustomer()->user()->customer_group_id; } else { $customerGuestGroup = app('Webkul\Customer\Repositories\CustomerGroupRepository')->getCustomerGuestGroup(); if ($customerGuestGroup) { $customerGroupId = $customerGuestGroup->id; } } $qb ->leftJoin('catalog_rule_product_prices', 'catalog_rule_product_prices.product_id', '=', 'variants.product_id') ->leftJoin('product_customer_group_prices', 'product_customer_group_prices.product_id', '=', 'variants.product_id') ->where(function ($qb) use ($priceRange, $customerGroupId) { $qb->where(function ($qb) use ($priceRange){ $qb ->where('variants.min_price', '>=', core()->convertToBasePrice($priceRange[0])) ->where('variants.min_price', '<=', core()->convertToBasePrice(end($priceRange))); }) ->orWhere(function ($qb) use ($priceRange) { $qb ->where('catalog_rule_product_prices.price', '>=', core()->convertToBasePrice($priceRange[0])) ->where('catalog_rule_product_prices.price', '<=', core()->convertToBasePrice(end($priceRange))); }) ->orWhere(function ($qb) use ($priceRange, $customerGroupId) { $qb ->where('product_customer_group_prices.value', '>=', core()->convertToBasePrice($priceRange[0])) ->where('product_customer_group_prices.value', '<=', core()->convertToBasePrice(end($priceRange))) ->where('product_customer_group_prices.customer_group_id', '=', $customerGroupId); }); }); } } $attributeFilters = $this->attributeRepository ->getProductDefaultAttributes(array_keys( request()->except(['price']) )); if (count($attributeFilters) > 0) { $qb->where(function ($filterQuery) use ($attributeFilters) { foreach ($attributeFilters as $attribute) { $filterQuery->orWhere(function ($attributeQuery) use ($attribute) { $column = DB::getTablePrefix() . 'product_attribute_values.' . ProductAttributeValueProxy::modelClass()::$attributeTypeFields[$attribute->type]; $filterInputValues = explode(',', request()->get($attribute->code)); # define the attribute we are filtering $attributeQuery = $attributeQuery->where('product_attribute_values.attribute_id', $attribute->id); # apply the filter values to the correct column for this type of attribute. if ($attribute->type != 'price') { $attributeQuery->where(function ($attributeValueQuery) use ($column, $filterInputValues) { foreach ($filterInputValues as $filterValue) { if (! is_numeric($filterValue)) { continue; } $attributeValueQuery->orWhereRaw("find_in_set(?, {$column})", [$filterValue]); } }); } else { $attributeQuery->where($column, '>=', core()->convertToBasePrice(current($filterInputValues))) ->where($column, '<=', core()->convertToBasePrice(end($filterInputValues))); } }); } }); # this is key! if a product has been filtered down to the same number of attributes that we filtered on, # we know that it has matched all of the requested filters. $qb->groupBy('variants.id'); $qb->havingRaw('COUNT(*) = ' . count($attributeFilters)); } return $qb->groupBy('product_flat.id'); }); # apply scope query so we can fetch the raw sql and perform a count $repository->applyScope(); $countQuery = "select count(*) as aggregate from ({$repository->model->toSql()}) c"; $count = collect(DB::select($countQuery, $repository->model->getBindings()))->pluck('aggregate')->first(); if ($count > 0) { # apply a new scope query to limit results to one page $repository->scopeQuery(function ($query) use ($page, $perPage) { return $query->forPage($page, $perPage); }); # manually build the paginator $items = $repository->get(); } else { $items = []; } $results = new LengthAwarePaginator($items, $count, $perPage, $page, [ 'path' => request()->url(), 'query' => request()->query(), ]); return $results; } //ProductCust.php // loop public function toArray($request) { $productAttr = $this->getProductAttr(); $product = $productAttr->product; $specialPrice = $productAttr->special_price; $productFlat = $productAttr->product_flat; $productTable = $productAttr->product_table; $minimalPrice = $productAttr->product_type_instance->getMinimalPrice(); $memberPrice = $this->memberPrice($product,$productFlat,$productTable); return [ $this->merge($this->getProductBaseInfo()), 'type' => $product->type, 'slug' => $product->url_key, //changed the name to slug instead 'discountRate' => $this->getDiscountRate($specialPrice,$product->price), "memberDiscountRate" => $this->getDiscountRate($specialPrice,$memberPrice), 'formated_price' => core()->currency($minimalPrice), 'fullDescription' => $product->description, 'new' => $this->new == 1 ? true : false, // customise 'featured' => $this->featured == 1 ? true : false, // customise 'variation' => count($this->variants) > 0 ? $this->getConfigurableProductInfo($product) : "", 'image' => $product->images ? ProductImage::collection($product->images) : null, // customise 'thumbImage' => [$this->productImageHelper->getProductBaseImage($product)], 'base_image' => ProductImageFacade::getProductBaseImage($product), 'isCourse' => $productFlat->course, 'brand' => $productFlat->brand_label, /* product's extra information */ $this->merge($this->allProductExtraInfo()), /* special price cases */ $this->merge($this->specialPriceInfo()), ]; } // ProductCust.php // loop public function allProductExtraInfo() { $product = $this->product ? $this->product : $this; $productTypeInstance = $product->getTypeInstance(); return [ /* grouped product */ $this->mergeWhen( $productTypeInstance instanceof \Webkul\Product\Type\Grouped, $product->type == 'grouped' ? $this->getGroupedProductInfo($product) : null ), /* bundle product */ $this->mergeWhen( $productTypeInstance instanceof \Webkul\Product\Type\Bundle, $product->type == 'bundle' ? $this->getBundleProductInfo($product) : null ), /* downloadable product */ $this->mergeWhen( $productTypeInstance instanceof \Webkul\Product\Type\Downloadable, $product->type == 'downloadable' ? $this->getDownloadableProductInfo($product) : null ), /* booking product */ $this->mergeWhen( $product->type == 'booking', $product->type == 'booking' ? $this->getBookingProductInfo($product) : null ), ]; }
Editor is loading...
Leave a Comment