ProductFrontendSearch.php 3.5 KB
<?php

namespace frontend\models;

use common\modules\product\helpers\FilterHelper;
use common\modules\product\helpers\ProductHelper;
use common\modules\product\models\Category;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use yii\data\ArrayDataProvider;
use yii\db\ActiveQuery;

use common\modules\product\models\Product;
use common\modules\product\models\ProductVariant;
use yii\helpers\ArrayHelper;

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 ArrayDataProvider([
            'allModels' => $this->getSearchQuery($category, $params, $in_stock)->with([
                'images',
                'events',
                'variant',
                'variant.image',
                'comments',
                'averageRating',
            ])->all(),
            'pagination' => [
                'pageSize' => 15,
            ],
            'sort' => [
                'attributes' => [
                    'name' => [
                        'asc' => ['name' => SORT_ASC],
                        'desc' => ['name' => SORT_DESC],
                        'default' => SORT_DESC,
                        'label' => 'имени',
                    ],
                    'price' => [
                        'asc' => ['price' => SORT_ASC],
                        'desc' => ['price' => SORT_DESC],
                        'default' => SORT_DESC,
                        'label' => 'по цене',
                    ],
                ],
            ]
        ]);





        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']);

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


        return $query;
    }


    /**
     * @param Category|null $category
     * @return array
     */

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

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