ProductFrontendSearch.php 3.2 KB
<?php

namespace frontend\models;

use common\modules\product\helpers\ProductHelper;
use common\modules\product\models\Category;
use common\modules\product\models\ProductCategory;
use common\modules\product\models\ProductOption;
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 common\modules\product\models\Product;
use common\modules\product\models\ProductVariant;

class ProductFrontendSearch extends Product {


    public $price_interval;
    public $brands;


    /**
     * @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 = [], $in_stock = true) {
        
        $dataProvider = new ActiveDataProvider([
            'query' => $this->getSearchQuery($category, $params, $in_stock),
            'pagination' => [
                'pageSize' => 15,
            ],
            '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 = [], $in_stock = true) {
        if (!empty($category)) {
            /** @var ActiveQuery $query */
            /**@var Category $category **/
            $query = $category->getProducts();
        } else {
            $query = Product::find();
        }
        $query->select(['product.*']);
        $query->joinWith(['enabledVariants','brand','options', 'category']);

        $query->groupBy(['product.product_id', 'product_variant.price']);

        ProductHelper::_setQueryParams($query, $params);
        if($in_stock){
            $query->andWhere(['!=', ProductVariant::tableName() .'.status', 1]);
        }


        return $query;
    }


    public function priceLimits($query) {

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