Untitled
unknown
php_laravel_blade
a year ago
12 kB
7
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