ProductFrontendSearch.php 4.78 KB
<?php

namespace frontend\models;

use common\modules\product\helpers\ProductHelper;
use common\modules\product\models\Brand;
use common\modules\product\models\BrandName;
use common\modules\product\models\CategoryName;
use common\modules\product\models\ProductCategory;
use common\modules\product\models\ProductOption;
use common\modules\product\models\ProductSearch;
use common\modules\rubrication\models\TaxGroup;
use common\modules\rubrication\models\TaxOption;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use yii\db\ActiveQuery;
use yii\db\ActiveRecord;
use yii\web\NotFoundHttpException;
use common\modules\product\models\Product;
use common\modules\product\models\ProductVariant;

class ProductFrontendSearch extends Product {
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['price_interval', 'brands'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

    /**
     * Creates data provider instance with search query applied for frontend
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search($category = null, $params = []) {


        $dataProvider = new ActiveDataProvider([
            'query' => $this->getSearchQuery($category, $params),
            'pagination' => [
                'pageSize' => 16,
            ],
            'sort' => [
                'attributes' => [
                    'name' => [
                        'asc' => ['name' => SORT_ASC],
                        'desc' => ['name' => SORT_DESC],
                        'default' => SORT_DESC,
                        'label' => 'имени',
                    ],
                    'price' => [
                        'asc' => [ProductVariant::tableName() .'.price' => SORT_ASC],
                        'desc' => [ProductVariant::tableName() .'.price' => SORT_DESC],
                        'default' => SORT_DESC,
                        'label' => 'по цене',
                    ],
                ],
            ]
        ]);

        if (!$this->validate()) {
            return $dataProvider;
        }



        return $dataProvider;
    }

    public function getSearchQuery($category = null, $params = []) {
        if (!empty($category)) {
            /** @var ActiveQuery $query */
//            $query = $category->getRelations('product_categories');
            $query = $category->getProducts();
        } else {
            $query = Product::find();
        }
        $query->select(['product.*']);
        $query->joinWith(['enabledVariants','brand', 'brand.brandName', 'category', 'category.categoryName']);


        ProductHelper::_setQueryParams($query, $params);

        $query->andWhere(['!=', ProductVariant::tableName() .'.stock', 0]);

        return $query;
    }

    public function optionsForCategory($category = null, $params = []) {
        $query = TaxOption::find()
            ->select([
                TaxOption::tableName() .'.*',
            ])
            ->leftJoin(ProductOption::tableName(), ProductOption::tableName() .'.option_id='. TaxOption::tableName() .'.tax_option_id')
            ->joinWith('taxGroup')
            ->where([TaxGroup::tableName() .'.is_filter' => true]);

        $query->innerJoin('product_variant', 'product_variant.product_id = '. ProductOption::tableName() .'.product_id');
        $query->andWhere(['!=', 'product_variant.stock', 0]);

        if (!empty($category)) {
            $query->innerJoin(ProductCategory::tableName(), ProductCategory::tableName() .'.product_id='. ProductOption::tableName() .'.product_id');
            $query->andWhere([ProductCategory::tableName() .'.category_id' => $category->category_id]);
        }

        $query->limit(null);

        return $query;
    }

    public function priceLimits($category = null, $params = []) {
        if (!empty($category)) {
            /** @var ActiveQuery $query */
//            $query = $category->getRelations('product_categories');
            $query = $category->getProducts();
        } else {
            $query = Product::find();
        }
        $query->joinWith('variant');

        ProductHelper::_setQueryParams($query, $params, false);

//        $query->select([
//            'MIN('. ProductVariant::tableName() .'.price) AS priceMIN',
//            'MAX('. ProductVariant::tableName() .'.price) AS priceMAX',
//        ]);

        return [
            'min' => $query->min(ProductVariant::tableName() .'.price'),
            'max' => $query->max(ProductVariant::tableName() .'.price'),
        ];
    }
}