Commit aa5c63f430d5fb5703d267fd1fbd9a77bc2f3bf7

Authored by Yarik
1 parent 0dfd8fe2

Filter fixing

common/modules/product/helpers/ProductHelper.php
1 1 <?php
2   -
3   -namespace common\modules\product\helpers;
4   -
5   -use common\modules\product\models\Brand;
6   -use common\modules\product\models\Category;
7   -use common\modules\product\models\Product;
8   -use common\modules\product\models\ProductVariant;
9   -use common\modules\product\models\BrandName;
10   -use common\modules\product\models\CategoryName;
11   -use yii\base\Object;
12   -use Yii;
13   -
14   -class ProductHelper extends Object {
15   - const PRODUCT_TAX_GROUP_ID_TARGET = 20;
16   - const PRODUCT_TAX_GROUP_ID_YEAR = 21;
17   - const PRODUCT_TAX_GROUP_ID_SEX = 22;
18   -
19   - const PRODUCT_VARIANT_TYPE_COLOR = 1;
20   - const PRODUCT_VARIANT_TYPE_SIZE = 2;
21   -
22   - public static function getCategories() {
23   - return Category::find()->getTree(); // with('categoryName')->
24   - }
25   -
26   - public static function getBrands() {
27   - return Brand::find(); // ->with('brandName')
28   - }
29   -
30   - /*
31   - * Return custom filter-option link
32   - * @var array $filter
33   - * @var array $options
34   - * @return array
35   - */
36   - public static function getFilterForOption($filter, $key, $value, $remove = false) {
37   - $result = $filter;
38   - if (is_array($value)) {
39   - foreach($value as $value_key => $value_items) {
40   - if (!is_array($value_items)) {
41   - $value_items = [$value_items];
42   - }
43   - foreach($value_items as $value_item) {
44   - if ($remove && isset($result[$key]) && ($i = array_search($value_item, $result[$key][$value_key])) !== FALSE) {
45   - unset($result[$key][$value_key][$i]);
46   - if (empty($result[$key][$value_key])) {
47   - unset($result[$key][$value_key]);
48   - }
49   - } else {
50   - if (!isset($result[$key][$value_key]) || array_search($value_item, $result[$key][$value_key]) === FALSE) {
51   - $result[$key][$value_key][] = $value_item;
  2 +
  3 + namespace common\modules\product\helpers;
  4 +
  5 + use common\modules\product\models\Brand;
  6 + use common\modules\product\models\Category;
  7 + use common\modules\product\models\Product;
  8 + use common\modules\product\models\ProductVariant;
  9 + use common\modules\product\models\BrandName;
  10 + use common\modules\product\models\CategoryName;
  11 + use yii\base\Object;
  12 + use Yii;
  13 + use yii\db\ActiveQuery;
  14 +
  15 + class ProductHelper extends Object
  16 + {
  17 +
  18 + const PRODUCT_TAX_GROUP_ID_TARGET = 20;
  19 + const PRODUCT_TAX_GROUP_ID_YEAR = 21;
  20 + const PRODUCT_TAX_GROUP_ID_SEX = 22;
  21 +
  22 + const PRODUCT_VARIANT_TYPE_COLOR = 1;
  23 + const PRODUCT_VARIANT_TYPE_SIZE = 2;
  24 +
  25 + public static function getCategories()
  26 + {
  27 + return Category::find()
  28 + ->getTree(); // with('categoryName')->
  29 + }
  30 +
  31 + public static function getBrands()
  32 + {
  33 + return Brand::find(); // ->with('brandName')
  34 + }
  35 +
  36 + /*
  37 + * Return custom filter-option link
  38 + * @var array $filter
  39 + * @var array $options
  40 + * @return array
  41 + */
  42 + public static function getFilterForOption($filter, $key, $value, $remove = false)
  43 + {
  44 + $result = $filter;
  45 + if(is_array($value)) {
  46 + foreach($value as $value_key => $value_items) {
  47 + if(!is_array($value_items)) {
  48 + $value_items = [ $value_items ];
  49 + }
  50 + foreach($value_items as $value_item) {
  51 + if($remove && isset( $result[ $key ] ) && ( $i = array_search($value_item, $result[ $key ][ $value_key ]) ) !== false) {
  52 + unset( $result[ $key ][ $value_key ][ $i ] );
  53 + if(empty( $result[ $key ][ $value_key ] )) {
  54 + unset( $result[ $key ][ $value_key ] );
  55 + }
  56 + } else {
  57 + if(!isset( $result[ $key ][ $value_key ] ) || array_search($value_item, $result[ $key ][ $value_key ]) === false) {
  58 + $result[ $key ][ $value_key ][] = $value_item;
  59 + }
52 60 }
53 61 }
54 62 }
55   - }
56   - } else {
57   - if ($remove && isset($result[$key]) && ($i = array_search($value, $result[$key])) !== FALSE) {
58   - unset($result[$key][$i]);
59   - if (empty($result[$key])) {
60   - unset($result[$key]);
61   - }
62 63 } else {
63   - if (!isset($result[$key]) || array_search($value, $result[$key]) === FALSE) {
64   - $result[$key][] = $value;
  64 + if($remove && isset( $result[ $key ] ) && ( $i = array_search($value, $result[ $key ]) ) !== false) {
  65 + unset( $result[ $key ][ $i ] );
  66 + if(empty( $result[ $key ] )) {
  67 + unset( $result[ $key ] );
  68 + }
  69 + } else {
  70 + if(!isset( $result[ $key ] ) || array_search($value, $result[ $key ]) === false) {
  71 + $result[ $key ][] = $value;
  72 + }
65 73 }
66 74 }
  75 + return $result;
67 76 }
68   - return $result;
69   - }
70   -
71   - public static function addLastProsucts($product_id) {
72   - $last_products = self::getLastProducts();
73   - if (!in_array($product_id, $last_products)) {
74   - $last_products[] = intval($product_id);
75   - if (count($last_products) > 16) {
76   - array_shift($last_products);
  77 +
  78 + public static function addLastProsucts($product_id)
  79 + {
  80 + $last_products = self::getLastProducts();
  81 + if(!in_array($product_id, $last_products)) {
  82 + $last_products[] = intval($product_id);
  83 + if(count($last_products) > 16) {
  84 + array_shift($last_products);
  85 + }
  86 + Yii::$app->session->set('last_products', $last_products);
77 87 }
78   - Yii::$app->session->set('last_products', $last_products);
79   - }
80   - }
81   -
82   - public static function getLastProducts($as_object = false) {
83   - $last_products = Yii::$app->session->get('last_products', []);
84   - if ($as_object) {
85   - $last_products = Product::find()->joinWith(['variant'])->where([Product::tableName() .'.product_id' => $last_products])->andWhere(['!=', ProductVariant::tableName() .'.stock', 0])->all();
86 88 }
87   - return array_reverse($last_products);
88   - }
89   -
90   - public static function getSpecialProducts($type, $count, $sort = null) {
91   - switch($type) {
92   - case 'top':
93   - $data = ['is_top' => true];
94   - break;
95   - case 'new':
96   - $data = ['is_new' => true];
97   - break;
98   - case 'promo':
99   - $data = ['akciya' => true];
100   - break;
101   - }
102   - return Product::find()->joinWith('variants')->where($data)->andWhere(['!=', ProductVariant::tableName() .'.stock', 0])->limit($count)/*->orderBy($sort)*/->all();
103   - }
104   -
105   - public static function getSimilarProducts($product, $count = 10) {
106   - if (!is_object($product)) {
107   - $product = Product::find()->where(['product_id'=>$product])->with('enabledVariants')->one();
108   - }
109   -
110   - if (!$product->properties) {
111   - return [];
  89 +
  90 + public static function getLastProducts($as_object = false)
  91 + {
  92 + $last_products = Yii::$app->session->get('last_products', [ ]);
  93 + if($as_object) {
  94 + $last_products = Product::find()
  95 + ->joinWith([ 'variant' ])
  96 + ->where([ Product::tableName() . '.product_id' => $last_products ])
  97 + ->andWhere([
  98 + '!=',
  99 + ProductVariant::tableName() . '.stock',
  100 + 0,
  101 + ])
  102 + ->all();
  103 + }
  104 + return array_reverse($last_products);
112 105 }
113   - $product_categories = [];
114   - foreach ($product->categories as $category) {
115   - $product_categories[] = $category->category_id;
  106 +
  107 + public static function getSpecialProducts($type, $count, $sort = NULL)
  108 + {
  109 + switch($type) {
  110 + case 'top':
  111 + $data = [ 'is_top' => true ];
  112 + break;
  113 + case 'new':
  114 + $data = [ 'is_new' => true ];
  115 + break;
  116 + case 'promo':
  117 + $data = [ 'akciya' => true ];
  118 + break;
  119 + }
  120 + return Product::find()
  121 + ->joinWith('variants')
  122 + ->where($data)
  123 + ->andWhere([
  124 + '!=',
  125 + ProductVariant::tableName() . '.stock',
  126 + 0,
  127 + ])
  128 + ->limit($count)/*->orderBy($sort)*/
  129 + ->all();
116 130 }
117   - $query = Product::find()
118   - ->select('product.product_id')
119   - ->innerJoinWith('variant')
120   - ->joinWith('category')
121   - ->where(['!=', 'product_variant.stock', 0])
122   - ->andWhere(['product_category.category_id' => $product_categories]);
123   -// $query->andWhere(['>=', 'product_variant.price', $product->enabledVariant->price * 0.7]);
124   -// $query->andWhere(['<=', 'product_variant.price', $product->enabledVariant->price * 1.3]);
125   - foreach($product->properties as $group) {
126   - $where = [];
127   - foreach ($group->_options as $option) {
128   - $where[] = $option->tax_option_id;
  131 +
  132 + public static function getSimilarProducts($product, $count = 10)
  133 + {
  134 + if(!is_object($product)) {
  135 + $product = Product::find()
  136 + ->where([ 'product_id' => $product ])
  137 + ->with('enabledVariants')
  138 + ->one();
129 139 }
130   - if (!$where) {
131   - continue;
  140 +
  141 + if(!$product->properties) {
  142 + return [ ];
132 143 }
133   - $query->innerJoin('product_option to'. $group->tax_group_id, 'to'. $group->tax_group_id .'.product_id = product.product_id');
134   - $query->andWhere(['to'. $group->tax_group_id .'.option_id' => $where]);
135   - }
136   - $query->andWhere(['!=', 'product.product_id', $product->product_id]);
137   - $query->groupBy('product.product_id');
138   - $query->limit($count);
139   - $products = $query->asArray()->all();
140   - foreach ($products as &$_product) {
141   - $_product = Product::findOne($_product['product_id']);
142   - }
143   - return $products;
144   - }
145   -
146   -
147   -
148   - public static function _setQueryParams(&$query, $params, $setPriceLimits = true) {
149   - if (!empty($params['keywords'])) {
150   - if (!is_array($params['keywords'])) {
151   - $params['keywords'] = [$params['keywords']];
  144 + $product_categories = [ ];
  145 + foreach($product->categories as $category) {
  146 + $product_categories[] = $category->category_id;
152 147 }
153   - foreach ($params['keywords'] as $keyword) {
154   - $query->orFilterWhere(['ilike', Product::tableName() .'.name', $keyword]);
155   - $query->orFilterWhere(['ilike', BrandName::tableName() .'.value', $keyword]);
156   - $query->orFilterWhere(['ilike', CategoryName::tableName() .'.value', $keyword]);
157   - $query->orFilterWhere(['ilike', ProductVariant::tableName() .'.sku', $keyword]);
  148 + $query = Product::find()
  149 + ->select('product.product_id')
  150 + ->innerJoinWith('variant')
  151 + ->joinWith('category')
  152 + ->where([
  153 + '!=',
  154 + 'product_variant.stock',
  155 + 0,
  156 + ])
  157 + ->andWhere([ 'product_category.category_id' => $product_categories ]);
  158 + // $query->andWhere(['>=', 'product_variant.price', $product->enabledVariant->price * 0.7]);
  159 + // $query->andWhere(['<=', 'product_variant.price', $product->enabledVariant->price * 1.3]);
  160 + foreach($product->properties as $group) {
  161 + $where = [ ];
  162 + foreach($group->_options as $option) {
  163 + $where[] = $option->tax_option_id;
  164 + }
  165 + if(!$where) {
  166 + continue;
  167 + }
  168 + $query->innerJoin('product_option to' . $group->tax_group_id, 'to' . $group->tax_group_id . '.product_id = product.product_id');
  169 + $query->andWhere([ 'to' . $group->tax_group_id . '.option_id' => $where ]);
158 170 }
159   - }
160   -
161   - foreach($params as $key => $param){
162   -
163   - switch ($key) {
164   - case 'special':
165   - foreach($param as $key => $value) {
166   - $query->orFilterWhere([Product::tableName() .'.'. $key => $value]);
167   - }
168   - break;
169   - case 'brands':
170   - $query->andFilterWhere([Product::tableName() .'.brand_id' => $param]);
171   - break;
172   - case 'keywords':
173   - break;
174   - case 'prices':
175   - if ($param['min'] > 0) {
176   - $query->andWhere(['>=', ProductVariant::tableName() .'.price', $param['min']]);
177   - }
178   - if ($param['max'] > 0) {
179   - $query->andWhere(['<=', ProductVariant::tableName() .'.price', $param['max']]);
180   - }
181   - break;
182   - default:
183   - $query->andWhere(
184   - Product::tableName() . '.product_id IN (SELECT product_id AS products FROM product_option INNER JOIN tax_option ON tax_option.tax_option_id = product_option.option_id INNER JOIN tax_group ON tax_group.tax_group_id = tax_option.tax_group_id WHERE tax_group.alias LIKE \''. $key .'\' AND tax_option.alias IN (\'' . implode('\',\'', $param) . '\'))'
185   - );
  171 + $query->andWhere([
  172 + '!=',
  173 + 'product.product_id',
  174 + $product->product_id,
  175 + ]);
  176 + $query->groupBy('product.product_id');
  177 + $query->limit($count);
  178 + $products = $query->asArray()
  179 + ->all();
  180 + foreach($products as &$_product) {
  181 + $_product = Product::findOne($_product[ 'product_id' ]);
186 182 }
187   -
  183 + return $products;
188 184 }
189   -
190   - }
191   -
192   - public static function productCountQuery($category = null, $params, $excludeKeys = []) {
193   - $p = [];
194   - foreach ($params as $key => $param) {
195   - if (in_array($key, $excludeKeys)) {
196   - $p[$key] = $param;
  185 +
  186 + /**
  187 + * @param ActiveQuery $query
  188 + * @param $params
  189 + * @param bool $setPriceLimits
  190 + */
  191 + public static function _setQueryParams(&$query, $params, $setPriceLimits = true)
  192 + {
  193 + if(!empty( $params[ 'keywords' ] )) {
  194 + if(!is_array($params[ 'keywords' ])) {
  195 + $params[ 'keywords' ] = [ $params[ 'keywords' ] ];
  196 + }
  197 + foreach($params[ 'keywords' ] as $keyword) {
  198 + $query->orFilterWhere([
  199 + 'ilike',
  200 + Product::tableName() . '.name',
  201 + $keyword,
  202 + ]);
  203 + $query->orFilterWhere([
  204 + 'ilike',
  205 + BrandName::tableName() . '.value',
  206 + $keyword,
  207 + ]);
  208 + $query->orFilterWhere([
  209 + 'ilike',
  210 + CategoryName::tableName() . '.value',
  211 + $keyword,
  212 + ]);
  213 + $query->orFilterWhere([
  214 + 'ilike',
  215 + ProductVariant::tableName() . '.sku',
  216 + $keyword,
  217 + ]);
  218 + }
  219 + }
  220 +
  221 + foreach($params as $key => $param) {
  222 +
  223 + switch($key) {
  224 + case 'special':
  225 + foreach($param as $key => $value) {
  226 + $query->orFilterWhere([ Product::tableName() . '.' . $key => $value ]);
  227 + }
  228 + break;
  229 + case 'brands':
  230 + $query->andFilterWhere([ Product::tableName() . '.brand_id' => $param ]);
  231 + break;
  232 + case 'keywords':
  233 + break;
  234 + case 'prices':
  235 + if($param[ 'min' ] > 0) {
  236 + $query->andWhere([
  237 + '>=',
  238 + ProductVariant::tableName() . '.price',
  239 + $param[ 'min' ],
  240 + ]);
  241 + }
  242 + if($param[ 'max' ] > 0) {
  243 + $query->andWhere([
  244 + '<=',
  245 + ProductVariant::tableName() . '.price',
  246 + $param[ 'max' ],
  247 + ]);
  248 + }
  249 + break;
  250 + default:
  251 + $query->andWhere(
  252 + Product::tableName() . '.product_id IN (
  253 + SELECT DISTINCT products
  254 + FROM (
  255 + SELECT product_id AS products
  256 + FROM product_option
  257 + INNER JOIN tax_option ON tax_option.tax_option_id = product_option.option_id
  258 + INNER JOIN tax_group ON tax_group.tax_group_id = tax_option.tax_group_id
  259 + WHERE tax_group.alias LIKE \''. $key .'\' AND tax_option.alias IN (\'' . implode('\',\'', $param) . '\') OR product_id IN (
  260 + (SELECT product_id AS products
  261 + FROM product_variant_option
  262 + INNER JOIN product_variant ON product_variant_option.product_variant_id = product_variant.product_variant_id
  263 + INNER JOIN tax_option ON tax_option.tax_option_id = product_variant_option.option_id
  264 + INNER JOIN tax_group ON tax_group.tax_group_id = tax_option.tax_group_id
  265 + WHERE tax_group.alias LIKE \''. $key .'\' AND tax_option.alias IN (\'' . implode('\',\'', $param) . '\'))
  266 + )
  267 + ) AS table_name
  268 + )'
  269 + );
  270 + }
  271 +
197 272 }
  273 +
198 274 }
199   - /** @var ActiveQuery $query */
200   - if (!empty($category)) {
201   - $query = $category->getProducts();
202   - } else {
203   - $query = Product::find();
  275 +
  276 + public static function productCountQuery($category = NULL, $params, $excludeKeys = [ ])
  277 + {
  278 + $p = [ ];
  279 + foreach($params as $key => $param) {
  280 + if(in_array($key, $excludeKeys)) {
  281 + $p[ $key ] = $param;
  282 + }
  283 + }
  284 + /** @var ActiveQuery $query */
  285 + if(!empty( $category )) {
  286 + $query = $category->getProducts();
  287 + } else {
  288 + $query = Product::find();
  289 + }
  290 + ProductHelper::_setQueryParams($query, $params);
  291 + $query->select([ 'COUNT(product.product_id)' ]);
  292 +
  293 + return $query;
204 294 }
205   - ProductHelper::_setQueryParams($query, $params);
206   - $query->select(['COUNT(product.product_id)']);
207   -
208   - return $query;
209   - }
210   -}
211 295 \ No newline at end of file
  296 + }
212 297 \ No newline at end of file
... ...
common/modules/product/models/Category.php
... ... @@ -10,6 +10,7 @@ use common\modules\rubrication\behaviors\ArtboxSynonymBehavior;
10 10 use common\modules\rubrication\models\TaxGroup;
11 11 use Yii;
12 12 use yii\base\ErrorException;
  13 +use yii\db\Query;
13 14  
14 15 /**
15 16 * This is the model class for table "category".
... ... @@ -225,5 +226,57 @@ class Category extends \yii\db\ActiveRecord
225 226 CategoryName::deleteAll(['category_id' => $this->category_id]);
226 227 return true;
227 228 }
  229 +
  230 + public function getActiveFilters() {
  231 + $query1 = (new Query())
  232 + ->distinct()
  233 + ->select([
  234 + 'option_id',
  235 + 'tax_option.*',
  236 + 'tax_group.*',
  237 + 'tax_option.alias as option_alias',
  238 + 'tax_group.alias as group_alias',
  239 + 'tax_value_string.value as value',
  240 + 'tax_option.sort AS tax_option_sort',
  241 + 'tax_group.sort AS tax_group_sort',
  242 + ])
  243 + ->from('tax_option')
  244 + ->innerJoin('product_variant_option', 'tax_option.tax_option_id = product_variant_option.option_id')
  245 + ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id')
  246 + ->innerJoin('product_variant', 'product_variant.product_variant_id = product_variant_option.product_variant_id')
  247 + ->innerJoin('product', 'product.product_id = product_variant.product_id')
  248 + ->innerJoin('product_category', 'product_category.product_id = product.product_id')
  249 + ->innerJoin('tax_value_string', 'tax_value_string.tax_option_id = tax_option.tax_option_id')
  250 + ->where(['product_category.category_id' => $this->category_id])
  251 + ->andWhere(['!=', 'product_variant.stock', 0]);
  252 +
  253 + $query2 = (new Query())
  254 + ->distinct()
  255 + ->select([
  256 + 'option_id',
  257 + 'tax_option.*',
  258 + 'tax_group.*',
  259 + 'tax_option.alias as option_alias',
  260 + 'tax_group.alias as group_alias',
  261 + 'tax_value_string.value as value',
  262 + 'tax_option.sort AS tax_option_sort',
  263 + 'tax_group.sort AS tax_group_sort',
  264 + ])
  265 + ->from('tax_option')
  266 + ->innerJoin('product_option', 'tax_option.tax_option_id = product_option.option_id')
  267 + ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id')
  268 + ->innerJoin('product', 'product.product_id = product_option.product_id')
  269 + ->innerJoin('product_category', 'product_category.product_id = product.product_id')
  270 + ->innerJoin('product_variant', 'product_variant.product_id = product.product_id')
  271 + ->innerJoin('tax_value_string', 'tax_value_string.tax_option_id = tax_option.tax_option_id')
  272 + ->where(['product_category.category_id' => $this->category_id])
  273 + ->andWhere(['!=', 'product_variant.stock', 0])
  274 + ->orderBy('tax_group_sort, tax_option_sort');
  275 + $query3 = (new Query())
  276 + ->select('*')
  277 + ->from(['subquery' => $query1->union($query2)])
  278 + ->orderBy('tax_group_sort, tax_option_sort');
  279 + return $query3;
  280 + }
228 281  
229 282 }
... ...
common/modules/product/models/Product.php
... ... @@ -262,6 +262,20 @@ class Product extends \yii\db\ActiveRecord
262 262 }
263 263 return $groups;
264 264 }
  265 +
  266 + public function getActiveProperties() {
  267 + $groups = $options = [];
  268 + foreach ($this->options as $option) {
  269 + $options[$option->tax_group_id][] = $option;
  270 + }
  271 + foreach (TaxGroup::find()->where(['tax_group_id' => array_keys($options), 'display' => TRUE])->all() as $group) {
  272 + if (!empty($options[$group->tax_group_id])) {
  273 + $group->_options = $options[$group->tax_group_id];
  274 + $groups[] = $group;
  275 + }
  276 + }
  277 + return $groups;
  278 + }
265 279  
266 280 public function getStocks() {
267 281 return $this->hasMany(Stock::className(), ['stock_id' => 'stock_id'])->viaTable(ProductStock::tableName(), ['product_id' => 'product_id']);
... ...
common/modules/rubrication/models/TaxGroup.php
... ... @@ -17,6 +17,8 @@ use Yii;
17 17 * @property string $settings
18 18 * @property boolean $is_filter
19 19 * @property integer $level
  20 + * @property integer $sort
  21 + * @property boolean $display
20 22 * @property TaxGroupToGroup[] $taxGroupToGroups
21 23 * @property TaxGroupToGroup[] $taxGroupToGroups0
22 24 * @property TaxOption[] $taxOptions
... ... @@ -62,8 +64,8 @@ class TaxGroup extends \yii\db\ActiveRecord
62 64 return [
63 65 [['name', 'module'], 'required'],
64 66 [['description', 'settings'], 'string'],
65   - [['hierarchical', 'is_filter'], 'boolean'],
66   - [['level'], 'integer'],
  67 + [['hierarchical', 'is_filter', 'display'], 'boolean'],
  68 + [['level', 'sort'], 'integer'],
67 69 [['alias', 'module'], 'string', 'max' => 50],
68 70 [['name'], 'string', 'max' => 255],
69 71 [['group_to_category'], 'safe']
... ... @@ -84,6 +86,8 @@ class TaxGroup extends \yii\db\ActiveRecord
84 86 'hierarchical' => 'Hierarchical',
85 87 // 'settings' => 'Settings',
86 88 'is_filter' => 'Use in filter',
  89 + 'sort' => 'Sort',
  90 + 'display' => 'Display',
87 91 ];
88 92 }
89 93  
... ...
common/modules/rubrication/views/tax-group/_form.php
... ... @@ -35,6 +35,10 @@ use common\components\artboxtree\ArtboxTreeHelper;
35 35 <?php /*= $form->field($model, 'hierarchical')->checkbox()*/ ?>
36 36  
37 37 <?= $form->field($model, 'is_filter')->checkbox() ?>
  38 +
  39 + <?= $form->field($model, 'display')->checkbox() ?>
  40 +
  41 + <?= $form->field($model, 'sort')->textInput() ?>
38 42  
39 43 <div class="form-group">
40 44 <?= Html::submitButton($model->isNewRecord ? Yii::t('rubrication', 'Create') : Yii::t('rubrication', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
... ...
console/migrations/m160810_074009_add_tax_option_sort.php 0 โ†’ 100644
  1 +<?php
  2 +
  3 +use yii\db\Migration;
  4 +
  5 +class m160810_074009_add_tax_option_sort extends Migration
  6 +{
  7 + public function up()
  8 + {
  9 + $this->addColumn('tax_group', 'sort', $this->integer()->defaultValue(0));
  10 + }
  11 +
  12 + public function down()
  13 + {
  14 + $this->dropColumn('tax_group', 'sort');
  15 + }
  16 +}
... ...
console/migrations/m160810_081231_add_tax_option_display.php 0 โ†’ 100644
  1 +<?php
  2 +
  3 +use yii\db\Migration;
  4 +
  5 +class m160810_081231_add_tax_option_display extends Migration
  6 +{
  7 + public function up()
  8 + {
  9 + $this->addColumn('tax_group', 'display', $this->boolean()->defaultValue(TRUE));
  10 + }
  11 +
  12 + public function down()
  13 + {
  14 + $this->dropColumn('tax_group', 'display');
  15 + }
  16 +}
... ...
frontend/controllers/CatalogController.php
1 1 <?php
2   -
3   -namespace frontend\controllers;
4   -
5   -use common\modules\product\Filter;
6   -use common\modules\product\helpers\ProductHelper;
7   -use common\modules\rubrication\models\TaxOptionSearch;
8   -use frontend\models\ProductFrontendSearch;
9   -use Yii;
10   -use common\modules\product\models\Brand;
11   -use common\modules\product\models\BrandSearch;
12   -use common\modules\product\models\Category;
13   -use common\modules\product\models\CategorySearch;
14   -use common\modules\product\models\Product;
15   -use common\modules\product\models\ProductCategory;
16   -use common\modules\product\models\ProductOption;
17   -use common\modules\product\models\ProductSearch;
18   -use common\modules\product\models\ProductVariant;
19   -use common\modules\rubrication\models\TaxGroup;
20   -use common\modules\rubrication\models\TaxOption;
21   -use common\modules\rubrication\models\TaxValueString;
22   -use yii\data\ActiveDataProvider;
23   -use yii\data\Pagination;
24   -use yii\data\Sort;
25   -use yii\db\ActiveQuery;
26   -use yii\helpers\ArrayHelper;
27   -use yii\web\HttpException;
28   -
29   -class CatalogController extends \yii\web\Controller
30   -{
31   - public function actionSearch() {
32   - // @todo
33   - }
34   -
35   - public function actionCategory()
  2 +
  3 + namespace frontend\controllers;
  4 +
  5 + use common\modules\product\Filter;
  6 + use common\modules\product\helpers\ProductHelper;
  7 + use common\modules\rubrication\models\TaxOptionSearch;
  8 + use frontend\models\ProductFrontendSearch;
  9 + use Yii;
  10 + use common\modules\product\models\Brand;
  11 + use common\modules\product\models\BrandSearch;
  12 + use common\modules\product\models\Category;
  13 + use common\modules\product\models\CategorySearch;
  14 + use common\modules\product\models\Product;
  15 + use common\modules\product\models\ProductCategory;
  16 + use common\modules\product\models\ProductOption;
  17 + use common\modules\product\models\ProductSearch;
  18 + use common\modules\product\models\ProductVariant;
  19 + use common\modules\rubrication\models\TaxGroup;
  20 + use common\modules\rubrication\models\TaxOption;
  21 + use common\modules\rubrication\models\TaxValueString;
  22 + use yii\data\ActiveDataProvider;
  23 + use yii\data\Pagination;
  24 + use yii\data\Sort;
  25 + use yii\db\ActiveQuery;
  26 + use yii\helpers\ArrayHelper;
  27 + use yii\web\HttpException;
  28 +
  29 + class CatalogController extends \yii\web\Controller
36 30 {
37   - /** @var Category $category */
38   - $category = Yii::$app->request->get('category');
39   - $filter = Yii::$app->request->get('filters', []);
40   - $filter_check = $filter;
41   -
42   - if (empty($category->category_id) && empty($word)) {
43   - return $this->render(
44   - 'catalog'
45   - );
  31 +
  32 + public function actionSearch()
  33 + {
  34 + // @todo
46 35 }
47   -
48   -
49   - $params = [];
50   -
51   - $optionsList = ArrayHelper::getColumn(TaxGroup::find()->where(['is_filter' => 'TRUE'])->all(),'alias');
52   -
53   - if ( !empty($filter['brands']) ) {
54   - unset($filter_check['brands']);
55   - $brands = Brand::find()->select('brand_id')->where(['in', 'alias', $filter['brands']])->all();
56   - $params['brands'] = [];
57   - foreach ($brands as $brand) {
58   - $params['brands'][] = $brand->brand_id;
  36 +
  37 + public function actionCategory()
  38 + {
  39 + /** @var Category $category */
  40 + $category = Yii::$app->request->get('category');
  41 + $filter = Yii::$app->request->get('filters', [ ]);
  42 + $filter_check = $filter;
  43 +
  44 + if(empty( $category->category_id ) && empty( $word )) {
  45 + return $this->render('catalog');
59 46 }
60   - }
61   -
62   - if ( !empty($filter['special']) ) {
63   - unset($filter_check['special']);
64   - if (!is_array($filter['special'])) {
65   - $filter['special'] = [$filter['special']];
  47 +
  48 + $params = [ ];
  49 +
  50 + $optionsList = ArrayHelper::getColumn(TaxGroup::find()
  51 + ->where([ 'is_filter' => 'TRUE' ])
  52 + ->all(), 'alias');
  53 +
  54 + if(!empty( $filter[ 'brands' ] )) {
  55 + unset( $filter_check[ 'brands' ] );
  56 + $brands = Brand::find()
  57 + ->select('brand_id')
  58 + ->where([
  59 + 'in',
  60 + 'alias',
  61 + $filter[ 'brands' ],
  62 + ])
  63 + ->all();
  64 + $params[ 'brands' ] = [ ];
  65 + foreach($brands as $brand) {
  66 + $params[ 'brands' ][] = $brand->brand_id;
  67 + }
66 68 }
67   - if (in_array('new', $filter['special'])) {
68   - $params['special']['is_new'] = true;
  69 +
  70 + if(!empty( $filter[ 'special' ] )) {
  71 + unset( $filter_check[ 'special' ] );
  72 + if(!is_array($filter[ 'special' ])) {
  73 + $filter[ 'special' ] = [ $filter[ 'special' ] ];
  74 + }
  75 + if(in_array('new', $filter[ 'special' ])) {
  76 + $params[ 'special' ][ 'is_new' ] = true;
  77 + }
  78 + if(in_array('top', $filter[ 'special' ])) {
  79 + $params[ 'special' ][ 'is_top' ] = true;
  80 + }
  81 + if(in_array('promo', $filter[ 'special' ])) {
  82 + $params[ 'special' ][ 'akciya' ] = true;
  83 + }
69 84 }
70   - if (in_array('top', $filter['special'])) {
71   - $params['special']['is_top'] = true;
  85 +
  86 + if(!empty( $filter[ 'prices' ] )) {
  87 + unset( $filter_check[ 'prices' ] );
  88 + $params[ 'prices' ] = $filter[ 'prices' ];
72 89 }
73   - if (in_array('promo', $filter['special'])) {
74   - $params['special']['akciya'] = true;
  90 +
  91 + foreach($optionsList as $optionList) {
  92 +
  93 + if(isset( $filter[ $optionList ] )) {
  94 + unset( $filter_check[ $optionList ] );
  95 + $params[ $optionList ] = $filter[ $optionList ];
  96 + }
  97 +
75 98 }
76   - }
77   -
78   -
79   - if ( !empty($filter['prices']) ) {
80   - unset($filter_check['prices']);
81   - $params['prices'] = $filter['prices'];
82   - }
83   -
84   -
85   -
86   - foreach($optionsList as $optionList){
87   -
88   - if(isset($filter[$optionList])){
89   - unset($filter_check[$optionList]);
90   - $params[$optionList] = $filter[$optionList];
  99 +
  100 + if(!empty( $filter_check )) {
  101 + $filter = array_diff_key($filter, $filter_check);
  102 + Yii::$app->response->redirect([
  103 + 'catalog/category',
  104 + 'category' => $category,
  105 + 'filters' => $filter,
  106 + ], 301);
91 107 }
92   -
93   - }
94   -
95   - if(!empty($filter_check)){
96   - $filter = array_diff_key($filter,$filter_check);
97   - Yii::$app->response->redirect(['catalog/category', 'category' => $category, 'filters' =>$filter],301);
  108 +
  109 + $productModel = new ProductFrontendSearch();
  110 + //$productQuery = $productModel->getSearchQuery($category, $params);
  111 + $productProvider = $productModel->search($category, $params);
  112 +
  113 + $brandModel = new BrandSearch();
  114 + $brands = $brandModel->getBrands($category, $params)
  115 + ->all();
  116 + // Old filters
  117 + // $optionsQuery = $productModel->optionsForCategory($category, $params);
  118 + // $groups = [];
  119 + //
  120 + //
  121 + // foreach ($optionsQuery->all() as $option) {
  122 + // if (!isset($groups[$option->tax_group_id])) {
  123 + // $groups[$option->tax_group_id] = $option->taxGroup;
  124 + // $groups[$option->tax_group_id]->_options = [];
  125 + // }
  126 + // $groups[$option->tax_group_id]->_options[] = $option;
  127 + // }
  128 + // foreach($groups as $i => $group) {
  129 + // if (empty($group->_options))
  130 + // unset($groups[$i]);
  131 + // }
  132 + // New filters
  133 + $groups = $category->getActiveFilters()->all();
  134 + $groups = ArrayHelper::index($groups, null, 'name');
  135 +
  136 + $priceLimits = $productModel->priceLimits($category, $params);
  137 +
  138 + /*
  139 + * Greedy search for comments and rating
  140 + */
  141 + $query = $productProvider->query;
  142 + $query->with([
  143 + 'comments',
  144 + 'averageRating',
  145 + ]);
  146 + /*
  147 + * End of greedy search for rating and comments
  148 + */
  149 +
  150 + return $this->render('products', [
  151 + 'category' => $category,
  152 + 'brandModel' => $brandModel,
  153 + 'brands' => $brands,
  154 + 'filter' => $filter,
  155 + 'params' => $params,
  156 + 'productModel' => $productModel,
  157 + 'productProvider' => $productProvider,
  158 + 'groups' => $groups,
  159 + 'priceLimits' => $priceLimits,
  160 + ]);
  161 +
98 162 }
99   -
100   - $productModel = new ProductFrontendSearch();
101   - //$productQuery = $productModel->getSearchQuery($category, $params);
102   - $productProvider = $productModel->search($category, $params);
103   -
104   - $brandModel = new BrandSearch();
105   - $brands = $brandModel->getBrands($category, $params)->all();
106   -
107   - $optionsQuery = $productModel->optionsForCategory($category, $params);
108   - $groups = [];
109   -
110   -
111   - foreach ($optionsQuery->all() as $option) {
112   - if (!isset($groups[$option->tax_group_id])) {
113   - $groups[$option->tax_group_id] = $option->taxGroup;
114   - $groups[$option->tax_group_id]->_options = [];
  163 +
  164 + public function actionProduct()
  165 + {
  166 + /** @var Product $product */
  167 + $product = Yii::$app->request->get('product');
  168 +
  169 + if(!$product->enabledVariant) {
  170 + throw new HttpException(404, 'ะขะพะฒะฐั€ ะฝะต ะฝะฐะนะดะตะฝ');
115 171 }
116   - $groups[$option->tax_group_id]->_options[] = $option;
  172 +
  173 + ProductHelper::addLastProsucts($product->product_id);
  174 +
  175 + return $this->render('product', [
  176 + 'product' => $product,
  177 + 'category' => $product->category,
  178 + ]);
117 179 }
118   - foreach($groups as $i => $group) {
119   - if (empty($group->_options))
120   - unset($groups[$i]);
  180 +
  181 + public function actionBrands()
  182 + {
  183 + $dataProvider = new ActiveDataProvider([
  184 + 'query' => Brand::find()
  185 + ->joinWith('brandName')
  186 + ->orderBy('brand_name.value'),
  187 + 'pagination' => [
  188 + 'pageSize' => -1,
  189 + ],
  190 + ]);
  191 +
  192 + return $this->render('brands', [
  193 + 'dataProvider' => $dataProvider,
  194 + ]);
121 195 }
122   -
123   - $priceLimits = $productModel->priceLimits($category, $params);
124   -
125   - /*
126   - * Greedy search for comments and rating
127   - */
128   - $query = $productProvider->query;
129   - $query->with(['comments', 'averageRating']);
130   - /*
131   - * End of greedy search for rating and comments
132   - */
133   -
134   - return $this->render(
135   - 'products',
136   - [
137   - 'category' => $category,
138   - 'brandModel' => $brandModel,
139   - 'brands' => $brands,
140   - 'filter' => $filter,
141   - 'params' => $params,
142   - 'productModel' => $productModel,
143   - 'productProvider' => $productProvider,
144   - 'groups' => $groups,
145   - 'priceLimits' => $priceLimits,
146   - ]
147   - );
148   -
149   - }
150   -
151   - public function actionProduct()
152   - {
153   - /** @var Product $product */
154   - $product = Yii::$app->request->get('product');
155   -
156   - if(!$product->enabledVariant) {
157   - throw new HttpException(404, 'ะขะพะฒะฐั€ ะฝะต ะฝะฐะนะดะตะฝ');
  196 +
  197 + public function actionBrand($brand)
  198 + {
  199 + $brand = BrandSearch::findByAlias($brand);
  200 +
  201 + $params = [
  202 + 'brands' => $brand->brand_id,
  203 + ];
  204 +
  205 + $productModel = new ProductFrontendSearch();
  206 + $productProvider = $productModel->search(NULL, $params);
  207 +
  208 + $priceLimits = $productModel->priceLimits(NULL, $params);
  209 +
  210 + return $this->render('brand', [
  211 + 'productModel' => $productModel,
  212 + 'productProvider' => $productProvider,
  213 + 'brand' => $brand,
  214 + 'priceLimits' => $priceLimits,
  215 + ]);
158 216 }
159   -
160   - ProductHelper::addLastProsucts($product->product_id);
161   -
162   - return $this->render('product', [
163   - 'product' => $product,
164   - 'category' => $product->category,
165   - ]);
166   - }
167   -
168   - public function actionBrands()
169   - {
170   - $dataProvider = new ActiveDataProvider([
171   - 'query' => Brand::find()->joinWith('brandName')->orderBy('brand_name.value'),
172   - 'pagination' => [
173   - 'pageSize' => -1,
174   - ]
175   - ]);
176   -
177   - return $this->render('brands', [
178   - 'dataProvider' => $dataProvider,
179   - ]);
180   - }
181   -
182   - public function actionBrand($brand)
183   - {
184   - $brand = BrandSearch::findByAlias($brand);
185   -
186   - $params = [
187   - 'brands' => $brand->brand_id,
188   - ];
189   -
190   - $productModel = new ProductFrontendSearch();
191   - $productProvider = $productModel->search(null, $params);
192   -
193   - $priceLimits = $productModel->priceLimits(null, $params);
194   -
195   - return $this->render('brand', [
196   - 'productModel' => $productModel,
197   - 'productProvider' => $productProvider,
198   - 'brand' => $brand,
199   - 'priceLimits' => $priceLimits,
200   - ]);
  217 +
201 218 }
202   -
203   -}
... ...
frontend/models/ProductFrontendSearch.php
... ... @@ -48,8 +48,7 @@ class ProductFrontendSearch extends Product {
48 48 * @return ActiveDataProvider
49 49 */
50 50 public function search($category = null, $params = []) {
51   -
52   -
  51 +
53 52 $dataProvider = new ActiveDataProvider([
54 53 'query' => $this->getSearchQuery($category, $params),
55 54 'pagination' => [
... ...
frontend/views/catalog/product.php
... ... @@ -228,7 +228,7 @@
228 228 <li><a href="#">ะฅะฐั€ะฐะบั‚ะตั€ะธัั‚ะธะบะธ</a>
229 229 <div class="info">
230 230 <p>ะ‘ั€ะตะฝะด: <?= $product->brand->name ?></p>
231   - <?php foreach($product->properties as $group): ?>
  231 + <?php foreach($product->activeProperties as $group): ?>
232 232 <p><?= $group->name ?> <?php foreach($group->_options as $option) : ?>&nbsp;<?= $option->ValueRenderHTML ?><?php endforeach ?></p>
233 233 <?php endforeach; ?>
234 234 </div>
... ...
frontend/views/catalog/products.php
... ... @@ -2,9 +2,9 @@
2 2  
3 3 /** @var $this \yii\web\View */
4 4 /** @var $productProvider \yii\data\ActiveDataProvider */
5   -
6   -
7   -use yii\helpers\Url;
  5 +
  6 + use yii\helpers\ArrayHelper;
  7 + use yii\helpers\Url;
8 8 use yii\widgets\Breadcrumbs;
9 9 use yii\web\View;
10 10 use common\modules\product\helpers\ProductHelper;
... ... @@ -62,9 +62,7 @@ $this-&gt;registerJsFile(Yii::getAlias(&#39;@web/js/ion.rangeSlider.js&#39;),[
62 62 });
63 63 <?php endif?>
64 64 </script>
65   -
66   -
67   -
  65 +
68 66 <div class="loyout">
69 67 <div class="leftbar">
70 68 <?php /*
... ... @@ -125,23 +123,44 @@ $this-&gt;registerJsFile(Yii::getAlias(&#39;@web/js/ion.rangeSlider.js&#39;),[
125 123 <?php endif?>
126 124  
127 125 <?php if (!empty($groups)) :?>
  126 + <?php
  127 + foreach($groups as $group_name => $group) {
  128 + ?>
  129 + <div class="filters">
  130 + <div class="begin"><?= $group_name?></div>
  131 + <ul>
  132 + <?php foreach($group as $option) :
  133 + $checked = (isset($filter[$option['group_alias']]) && in_array($option['option_alias'], $filter[$option['group_alias']]));
  134 + $option_url = Url::to(['catalog/category', 'category' => $category, 'filters' => FilterHelper::getFilterForOption($filter, $option['group_alias'], $option['option_alias'], $checked)]);
  135 + ?>
  136 + <li>
  137 + <input type="checkbox" onchange="document.location='<?= $option_url?>'" class="features-option" <?php /* name="option[<?= $group->alias?>][]"value="<?= $option->alias?>"*/?><?= $checked ? ' checked' : ''?> />
  138 +
  139 + <a href="<?= $option_url?>"><?= $option['value']?></a>
  140 + </li>
  141 + <?php endforeach?>
  142 + </ul>
  143 + </div>
  144 + <?php
  145 + }
  146 + /*?>
128 147 <?php foreach($groups as $group) :?>
129 148 <div class="filters">
130   - <div class="begin"><?= $group->name?></div>
  149 + <div class="begin"><?= $group['name']?></div>
131 150 <ul>
132 151 <?php foreach($group->_options as $option) :
133 152 $checked = (isset($filter[$group->alias]) && in_array($option->alias, $filter[$group->alias]));
134 153 $option_url = Url::to(['catalog/category', 'category' => $category, 'filters' => FilterHelper::getFilterForOption($filter, $option->taxGroup->alias, $option->alias, $checked)]);
135 154 ?>
136 155 <li>
137   - <input type="checkbox" onchange="document.location='<?= $option_url?>'" class="features-option" <?php /* name="option[<?= $group->alias?>][]"value="<?= $option->alias?>"*/?><?= $checked ? ' checked' : ''?> />
  156 + <input type="checkbox" onchange="document.location='<?= $option_url?>'" class="features-option" <?php /* name="option[<?= $group->alias?>][]"value="<?= $option->alias?>"*//*?><?= $checked ? ' checked' : ''?> />
138 157  
139 158 <a href="<?= $option_url?>"><?= $option->ValueRenderHTML?></a>
140 159 </li>
141 160 <?php endforeach?>
142 161 </ul>
143 162 </div>
144   - <?php endforeach?>
  163 + <?php endforeach */?>
145 164 <?php endif?>
146 165  
147 166 <?php if ($priceLimits['min'] < $priceLimits['max']) :?>
... ...