Untitled

mail@pastecode.io avatar
unknown
php_laravel_blade
a month ago
12 kB
2
Indexable
Never
// 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
        ),
    ];
}

Leave a Comment