CatalogController.php 8.51 KB
<?php
    
    namespace frontend\controllers;
    
    use common\modules\product\Filter;
    use common\modules\product\helpers\ProductHelper;
    use common\modules\rubrication\models\TaxOptionSearch;
    use frontend\models\ProductFrontendSearch;
    use Yii;
    use common\modules\product\models\Brand;
    use common\modules\product\models\BrandSearch;
    use common\modules\product\models\Category;
    use common\modules\product\models\CategorySearch;
    use common\modules\product\models\Product;
    use common\modules\product\models\ProductCategory;
    use common\modules\product\models\ProductOption;
    use common\modules\product\models\ProductSearch;
    use common\modules\product\models\ProductVariant;
    use common\modules\rubrication\models\TaxGroup;
    use common\modules\rubrication\models\TaxOption;
    use common\modules\rubrication\models\TaxValueString;
    use yii\data\ActiveDataProvider;
    use yii\data\Pagination;
    use yii\data\Sort;
    use yii\db\ActiveQuery;
    use yii\helpers\ArrayHelper;
    use yii\web\HttpException;
    
    class CatalogController extends \yii\web\Controller
    {
        
        public function actionSearch()
        {
            // @todo
        }
        
        public function actionCategory()
        {
            /** @var Category $category */
            $category = Yii::$app->request->get('category');
            $filter = Yii::$app->request->get('filters', [ ]);
            $filter_check = $filter;
            
            if(empty( $category->category_id ) && empty( $word )) {
                return $this->render('catalog');
            }
            
            ProductHelper::addLastCategory($category->category_id);
            
            $params = [ ];
            
            $optionsList = ArrayHelper::getColumn(TaxGroup::find()
                                                          ->where([ 'is_filter' => 'TRUE' ])
                                                          ->all(), 'alias');
            
            if(!empty( $filter[ 'brands' ] )) {
                unset( $filter_check[ 'brands' ] );
                $brands = Brand::find()
                               ->select('brand_id')
                               ->where([
                                   'in',
                                   'alias',
                                   $filter[ 'brands' ],
                               ])
                               ->all();
                $params[ 'brands' ] = [ ];
                foreach($brands as $brand) {
                    $params[ 'brands' ][] = $brand->brand_id;
                }
            }
            
            if(!empty( $filter[ 'special' ] )) {
                unset( $filter_check[ 'special' ] );
                if(!is_array($filter[ 'special' ])) {
                    $filter[ 'special' ] = [ $filter[ 'special' ] ];
                }
                if(in_array('new', $filter[ 'special' ])) {
                    $params[ 'special' ][ 'is_new' ] = true;
                }
                if(in_array('top', $filter[ 'special' ])) {
                    $params[ 'special' ][ 'is_top' ] = true;
                }
                if(in_array('promo', $filter[ 'special' ])) {
                    $params[ 'special' ][ 'akciya' ] = true;
                }
            }
            
            if(!empty( $filter[ 'prices' ] )) {
                unset( $filter_check[ 'prices' ] );
                $params[ 'prices' ] = $filter[ 'prices' ];
            }
            
            foreach($optionsList as $optionList) {
                
                if(isset( $filter[ $optionList ] )) {
                    unset( $filter_check[ $optionList ] );
                    $params[ $optionList ] = $filter[ $optionList ];
                }
                
            }
            
            if(!empty( $filter_check )) {
                $filter = array_diff_key($filter, $filter_check);
                Yii::$app->response->redirect([
                    'catalog/category',
                    'category' => $category,
                    'filters'  => $filter,
                ], 301);
            }
            
            $productModel = new ProductFrontendSearch();
            //$productQuery = $productModel->getSearchQuery($category, $params);
            $productProvider = $productModel->search($category, $params);
            
            $brandModel = new BrandSearch();
            $brands = $brandModel->getBrands($category, $params)
                                 ->all();
            //      Old filters
            //        $optionsQuery = $productModel->optionsForCategory($category, $params);
            //        $groups = [];
            //
            //
            //        foreach ($optionsQuery->all() as $option) {
            //            if (!isset($groups[$option->tax_group_id])) {
            //                $groups[$option->tax_group_id] = $option->taxGroup;
            //                $groups[$option->tax_group_id]->_options = [];
            //            }
            //            $groups[$option->tax_group_id]->_options[] = $option;
            //        }
            //        foreach($groups as $i => $group) {
            //            if (empty($group->_options))
            //                unset($groups[$i]);
            //        }
            //  New filters
            $groups = $category->getActiveFilters()->all();
            $groups = ArrayHelper::index($groups, null, 'name');
            
            $priceLimits = $productModel->priceLimits($category, $params);
            
            /*
             * Greedy search for comments and rating
             */
            $query = $productProvider->query;
            $query->with([
                'comments',
                'averageRating',
            ]);
            /*
             * End of greedy search for rating and comments
             */
            
            return $this->render('products', [
                    'category'        => $category,
                    'brandModel'      => $brandModel,
                    'brands'          => $brands,
                    'filter'          => $filter,
                    'params'          => $params,
                    'productModel'    => $productModel,
                    'productProvider' => $productProvider,
                    'groups'            => $groups,
                    'priceLimits'     => $priceLimits,
                ]);
            
        }
        
        public function actionProduct()
        {
            /** @var Product $product */
            $product = Yii::$app->request->get('product');
            
            if(!$product->enabledVariant) {
                throw new HttpException(404, 'Товар не найден');
            }
            
            ProductHelper::addLastProsucts($product->product_id);
            
            $category = null;
            $last_category_id = ProductHelper::getLastCategory();
            if(!empty($last_category_id)) {
                $category = $product->getCategory()->andWhere(['category_id' => $last_category_id])->one();
            }
            if(empty($category)) {
                $category = $product->category;
            }
            
            return $this->render('product', [
                'product'  => $product,
                'category' => $category,
            ]);
        }
        
        public function actionBrands()
        {
            $dataProvider = new ActiveDataProvider([
                'query'      => Brand::find()
                                     ->joinWith('brandName')
                                     ->orderBy('brand_name.value'),
                'pagination' => [
                    'pageSize' => -1,
                ],
            ]);
            
            return $this->render('brands', [
                'dataProvider' => $dataProvider,
            ]);
        }
        
        public function actionBrand($brand)
        {
            $brand = BrandSearch::findByAlias($brand);
            
            $params = [
                'brands' => $brand->brand_id,
            ];
            
            $productModel = new ProductFrontendSearch();
            $productProvider = $productModel->search(NULL, $params);
            
            $priceLimits = $productModel->priceLimits(NULL, $params);
            
            return $this->render('brand', [
                'productModel'    => $productModel,
                'productProvider' => $productProvider,
                'brand'           => $brand,
                'priceLimits'     => $priceLimits,
            ]);
        }
        
    }