Commit a95ce595e20ad9a14287192dbc59cc92bfe87303
1 parent
74a103b3
big commti
Showing
25 changed files
with
1325 additions
and
371 deletions
Show diff stats
.htaccess
@@ -144,12 +144,7 @@ AddDefaultCharset utf-8 | @@ -144,12 +144,7 @@ AddDefaultCharset utf-8 | ||
144 | RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] | 144 | RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] |
145 | 145 | ||
146 | RewriteCond %{THE_REQUEST} \s/+(.+?)/+[?\s] | 146 | RewriteCond %{THE_REQUEST} \s/+(.+?)/+[?\s] |
147 | - RewriteRule /$ /%1 [R,L] | ||
148 | - | ||
149 | - | ||
150 | - | ||
151 | - RewriteCond %{THE_REQUEST} \s/+(.+?)/+[?\s] | ||
152 | - RewriteRule /$ /%1 [R,L] | 147 | + RewriteRule /$ /%1 [R=301,L] |
153 | 148 | ||
154 | 149 | ||
155 | RewriteCond %{HTTP_HOST} ^([^www].*)$ | 150 | RewriteCond %{HTTP_HOST} ^([^www].*)$ |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\models; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use yii\helpers\ArrayHelper; | ||
7 | + | ||
8 | +/** | ||
9 | + * This is the model class for table "filter_cache". | ||
10 | + * | ||
11 | + * @property integer $id | ||
12 | + * @property integer $options_key | ||
13 | + * @property integer $category_id | ||
14 | + * @property integer $depth | ||
15 | + * @property integer $count | ||
16 | + */ | ||
17 | +class FilterCache extends \yii\db\ActiveRecord | ||
18 | +{ | ||
19 | + /** | ||
20 | + * @inheritdoc | ||
21 | + */ | ||
22 | + public static function tableName() | ||
23 | + { | ||
24 | + return 'filter_cache'; | ||
25 | + } | ||
26 | + | ||
27 | + /** | ||
28 | + * @inheritdoc | ||
29 | + */ | ||
30 | + public function rules() | ||
31 | + { | ||
32 | + return [ | ||
33 | + [[ 'category_id', 'depth', 'count'], 'integer'], | ||
34 | + [['options_key'], 'string'] | ||
35 | + ]; | ||
36 | + } | ||
37 | + | ||
38 | + /** | ||
39 | + * @inheritdoc | ||
40 | + */ | ||
41 | + public function attributeLabels() | ||
42 | + { | ||
43 | + return [ | ||
44 | + 'id' => 'ID', | ||
45 | + 'options_key' => 'Options Key', | ||
46 | + 'category_id' => 'Category ID', | ||
47 | + 'depth' => 'Depth', | ||
48 | + 'count' => 'Count', | ||
49 | + ]; | ||
50 | + } | ||
51 | + | ||
52 | + /** | ||
53 | + * @param array $optionsIdArray | ||
54 | + * @return string | ||
55 | + */ | ||
56 | + static function createCacheKey($optionsIdArray){ | ||
57 | + if(!empty($optionsIdArray)){ | ||
58 | + sort($optionsIdArray); | ||
59 | + $string = implode('',$optionsIdArray); | ||
60 | + $key = md5($string); | ||
61 | + return $key; | ||
62 | + } else { | ||
63 | + return 0; | ||
64 | + } | ||
65 | + } | ||
66 | + | ||
67 | + | ||
68 | + /** | ||
69 | + * @param $groups | ||
70 | + * @param $params | ||
71 | + * @return array | ||
72 | + */ | ||
73 | + | ||
74 | + static function convertAliasToId($groups,$params){ | ||
75 | + $optionsAlias = ArrayHelper::index($groups, 'option_alias'); | ||
76 | + $convertedParams = []; | ||
77 | + foreach($params as $key => $options){ | ||
78 | + foreach($options as $option){ | ||
79 | + if(isset($optionsAlias[$option]) && !in_array($optionsAlias[$option]['tax_option_id'],$convertedParams)){ | ||
80 | + $convertedParams[] = $optionsAlias[$option]['tax_option_id']; | ||
81 | + } | ||
82 | + } | ||
83 | + } | ||
84 | + return $convertedParams; | ||
85 | + | ||
86 | + } | ||
87 | + | ||
88 | +} |
common/modules/product/helpers/FilterHelper.php
@@ -3,10 +3,16 @@ | @@ -3,10 +3,16 @@ | ||
3 | namespace common\modules\product\helpers; | 3 | namespace common\modules\product\helpers; |
4 | 4 | ||
5 | 5 | ||
6 | +use common\modules\product\models\Brand; | ||
7 | +use common\modules\product\models\Category; | ||
8 | +use common\modules\product\models\Product; | ||
9 | +use common\modules\product\models\ProductVariant; | ||
6 | use common\modules\rubrication\models\TaxGroup; | 10 | use common\modules\rubrication\models\TaxGroup; |
7 | use yii\base\Object; | 11 | use yii\base\Object; |
8 | use Yii; | 12 | use Yii; |
13 | +use yii\db\Query; | ||
9 | use yii\db\QueryInterface; | 14 | use yii\db\QueryInterface; |
15 | +use yii\db\ActiveQuery; | ||
10 | use yii\helpers\ArrayHelper; | 16 | use yii\helpers\ArrayHelper; |
11 | 17 | ||
12 | class FilterHelper extends Object { | 18 | class FilterHelper extends Object { |
@@ -24,7 +30,7 @@ class FilterHelper extends Object { | @@ -24,7 +30,7 @@ class FilterHelper extends Object { | ||
24 | 30 | ||
25 | } | 31 | } |
26 | 32 | ||
27 | - /* | 33 | + /** |
28 | * Return custom filter-option link | 34 | * Return custom filter-option link |
29 | * @var array $filter | 35 | * @var array $filter |
30 | * @var array $options | 36 | * @var array $options |
@@ -84,4 +90,157 @@ class FilterHelper extends Object { | @@ -84,4 +90,157 @@ class FilterHelper extends Object { | ||
84 | 90 | ||
85 | 91 | ||
86 | 92 | ||
93 | + /** | ||
94 | + * @param ActiveQuery $query | ||
95 | + * @param array $params | ||
96 | + */ | ||
97 | + public static function setNewQueryParams($query, $params) | ||
98 | + { | ||
99 | + $last_query = null; | ||
100 | + foreach ($params as $key => $param) { | ||
101 | + switch ($key) { | ||
102 | + case 'special': | ||
103 | + self::filterSpecial($param, $query); | ||
104 | + break; | ||
105 | + case 'brands': | ||
106 | + self::filterBrands($param, $query); | ||
107 | + break; | ||
108 | + case 'keywords': | ||
109 | + self::filterKeywords($param, $query); | ||
110 | + break; | ||
111 | + case 'prices': | ||
112 | + self::filterPrices($param, $query); | ||
113 | + break; | ||
114 | + default: | ||
115 | + $last_query = self::filterOptions($param, $last_query); | ||
116 | + break; | ||
117 | + } | ||
118 | + } | ||
119 | + if(!empty($last_query)) { | ||
120 | + $query->andWhere(['product.product_id' => $last_query]); | ||
121 | + } | ||
122 | + } | ||
123 | + | ||
124 | + private static function filterOptions(array $params, Query $last_query = null) | ||
125 | + { | ||
126 | + $variant_query = ( new Query() )->distinct() | ||
127 | + ->select('product_variant.product_id as products') | ||
128 | + ->from('product_variant_option') | ||
129 | + ->innerJoin( | ||
130 | + 'product_variant', | ||
131 | + 'product_variant_option.product_variant_id = product_variant.product_variant_id' | ||
132 | + ) | ||
133 | + ->innerJoin('tax_option', 'tax_option.tax_option_id = product_variant_option.option_id') | ||
134 | + ->where([ 'tax_option.alias' => $params ]); | ||
135 | + $product_query = ( new Query() )->distinct() | ||
136 | + ->select('product_option.product_id as products') | ||
137 | + ->from('product_option') | ||
138 | + ->innerJoin('tax_option', 'product_option.option_id = tax_option.tax_option_id') | ||
139 | + ->where( | ||
140 | + [ 'tax_option.alias' => $params ] | ||
141 | + )->union($variant_query); | ||
142 | + $query = (new Query())->select('products')->from(['result_table' => $product_query]); | ||
143 | + if (!empty( $last_query )) { | ||
144 | + $query->andWhere([ 'product.product_id' => $last_query ]); | ||
145 | + } | ||
146 | + return $query; | ||
147 | + } | ||
148 | + | ||
149 | + private static function filterSpecial(array $params, ActiveQuery $query) | ||
150 | + { | ||
151 | + $conditions = []; | ||
152 | + /** | ||
153 | + * @var string $key | ||
154 | + */ | ||
155 | + foreach ($params as $key => $param) { | ||
156 | + $conditions[] = [ | ||
157 | + '=', | ||
158 | + Product::tableName() . '.' . $key, | ||
159 | + $param, | ||
160 | + ]; | ||
161 | + } | ||
162 | + /* If 2 or more special conditions get all that satisfy at least one of them. */ | ||
163 | + if (count($conditions) > 1) { | ||
164 | + array_unshift($conditions, 'or'); | ||
165 | + } else { | ||
166 | + $conditions = $conditions[ 0 ]; | ||
167 | + } | ||
168 | + $query->andFilterWhere($conditions); | ||
169 | + } | ||
170 | + | ||
171 | + private static function filterBrands(array $param, ActiveQuery $query) | ||
172 | + { | ||
173 | + $query->andFilterWhere([ Product::tableName() . '.brand_id' => $param ]); | ||
174 | + } | ||
175 | + | ||
176 | + private static function filterKeywords(array $params, ActiveQuery $query) | ||
177 | + { | ||
178 | + $conditions = []; | ||
179 | + if (!empty( $params )) { | ||
180 | + if (!is_array($params)) { | ||
181 | + $params = [ $params ]; | ||
182 | + } | ||
183 | + /** | ||
184 | + * @var string $param Inputed keyword | ||
185 | + */ | ||
186 | + foreach ($params as $param) { | ||
187 | + $conditions[] = [ | ||
188 | + 'or', | ||
189 | + [ | ||
190 | + 'ilike', | ||
191 | + Product::tableName() . '.name', | ||
192 | + $param, | ||
193 | + ], | ||
194 | + [ | ||
195 | + 'ilike', | ||
196 | + Brand::tableName() . '.name', | ||
197 | + $param, | ||
198 | + ], | ||
199 | + [ | ||
200 | + 'ilike', | ||
201 | + Category::tableName() . '.name', | ||
202 | + $param, | ||
203 | + ], | ||
204 | + [ | ||
205 | + 'ilike', | ||
206 | + ProductVariant::tableName() . '.sku', | ||
207 | + $param, | ||
208 | + ], | ||
209 | + ]; | ||
210 | + } | ||
211 | + } | ||
212 | + if (count($conditions) > 1) { | ||
213 | + array_unshift($conditions, 'or'); | ||
214 | + } else { | ||
215 | + $conditions = $conditions[ 0 ]; | ||
216 | + } | ||
217 | + $query->andFilterWhere($conditions); | ||
218 | + } | ||
219 | + | ||
220 | + private static function filterPrices(array $params, ActiveQuery $query) | ||
221 | + { | ||
222 | + $conditions = []; | ||
223 | + if (!empty( $params[ 'min' ] ) && $params[ 'min' ] > 0) { | ||
224 | + $conditions[] = [ | ||
225 | + '>=', | ||
226 | + ProductVariant::tableName() . '.price', | ||
227 | + $params[ 'min' ], | ||
228 | + ]; | ||
229 | + } | ||
230 | + if (!empty( $params[ 'max' ] ) && $params[ 'max' ] > 0) { | ||
231 | + $conditions[] = [ | ||
232 | + '<=', | ||
233 | + ProductVariant::tableName() . '.price', | ||
234 | + $params[ 'max' ], | ||
235 | + ]; | ||
236 | + } | ||
237 | + if (count($conditions) > 1) { | ||
238 | + array_unshift($conditions, 'and'); | ||
239 | + } else { | ||
240 | + $conditions = $conditions[ 0 ]; | ||
241 | + } | ||
242 | + $query->andFilterWhere($conditions); | ||
243 | + } | ||
244 | + | ||
245 | + | ||
87 | } | 246 | } |
88 | \ No newline at end of file | 247 | \ No newline at end of file |
common/modules/product/helpers/ProductHelper.php
@@ -31,7 +31,7 @@ | @@ -31,7 +31,7 @@ | ||
31 | return Brand::find(); // ->with('brandName') | 31 | return Brand::find(); // ->with('brandName') |
32 | } | 32 | } |
33 | 33 | ||
34 | - /* | 34 | + /** |
35 | * Return custom filter-option link | 35 | * Return custom filter-option link |
36 | * @var array $filter | 36 | * @var array $filter |
37 | * @var array $options | 37 | * @var array $options |
@@ -269,7 +269,49 @@ | @@ -269,7 +269,49 @@ | ||
269 | } | 269 | } |
270 | 270 | ||
271 | } | 271 | } |
272 | - | 272 | + |
273 | + /** | ||
274 | + * @param ActiveQuery $query | ||
275 | + * @param $params | ||
276 | + * @param bool $setPriceLimits | ||
277 | + */ | ||
278 | + public static function setCacheQueryParams(&$query, $params) | ||
279 | + { | ||
280 | + | ||
281 | + | ||
282 | + foreach($params as $key => $param) { | ||
283 | + | ||
284 | + | ||
285 | + $query->andWhere( | ||
286 | + Product::tableName() . '.product_id IN ( | ||
287 | + SELECT DISTINCT products | ||
288 | + FROM ( | ||
289 | + SELECT product_id AS products FROM product WHERE product_id IN( | ||
290 | + SELECT product_id FROM product_option | ||
291 | + INNER JOIN tax_option ON tax_option.tax_option_id = product_option.option_id | ||
292 | + INNER JOIN tax_group ON tax_group.tax_group_id = tax_option.tax_group_id | ||
293 | + WHERE tax_group.alias = \''. $key .'\' AND tax_option.alias IN (\'' . implode('\',\'', $param) . '\')) | ||
294 | + OR product_id IN ( | ||
295 | + (SELECT product_id AS products | ||
296 | + FROM product_variant_option | ||
297 | + INNER JOIN product_variant ON product_variant_option.product_variant_id = product_variant.product_variant_id | ||
298 | + INNER JOIN tax_option ON tax_option.tax_option_id = product_variant_option.option_id | ||
299 | + INNER JOIN tax_group ON tax_group.tax_group_id = tax_option.tax_group_id | ||
300 | + WHERE tax_group.alias = \''. $key .'\' AND tax_option.alias IN (\'' . implode('\',\'', $param) . '\')) | ||
301 | + ) | ||
302 | + ) AS table_name | ||
303 | + )' | ||
304 | + ); | ||
305 | + } | ||
306 | + | ||
307 | + | ||
308 | + } | ||
309 | + | ||
310 | + | ||
311 | + | ||
312 | + | ||
313 | + | ||
314 | + | ||
273 | public static function productCountQuery($category = NULL, $params, $excludeKeys = [ ]) | 315 | public static function productCountQuery($category = NULL, $params, $excludeKeys = [ ]) |
274 | { | 316 | { |
275 | $p = [ ]; | 317 | $p = [ ]; |
common/modules/product/models/Category.php
@@ -5,7 +5,8 @@ namespace common\modules\product\models; | @@ -5,7 +5,8 @@ namespace common\modules\product\models; | ||
5 | 5 | ||
6 | use common\components\artboxtree\ArtboxTreeBehavior; | 6 | use common\components\artboxtree\ArtboxTreeBehavior; |
7 | use common\components\artboxtree\ArtboxTreeHelper; | 7 | use common\components\artboxtree\ArtboxTreeHelper; |
8 | - | 8 | +use common\modules\rubrication\models\TaxOption; |
9 | +use yii\db\ActiveQuery; | ||
9 | use common\modules\rubrication\models\TaxGroup; | 10 | use common\modules\rubrication\models\TaxGroup; |
10 | use Yii; | 11 | use Yii; |
11 | 12 | ||
@@ -35,6 +36,7 @@ use common\behaviors\Slug; | @@ -35,6 +36,7 @@ use common\behaviors\Slug; | ||
35 | * @property ProductUnit $productUnit | 36 | * @property ProductUnit $productUnit |
36 | * @property CategoryName[] $categoryNames | 37 | * @property CategoryName[] $categoryNames |
37 | * @property ProductCategory[] $productCategories | 38 | * @property ProductCategory[] $productCategories |
39 | + * @property TaxGroup $TaxGroup | ||
38 | */ | 40 | */ |
39 | class Category extends \yii\db\ActiveRecord | 41 | class Category extends \yii\db\ActiveRecord |
40 | { | 42 | { |
@@ -195,56 +197,99 @@ class Category extends \yii\db\ActiveRecord | @@ -195,56 +197,99 @@ class Category extends \yii\db\ActiveRecord | ||
195 | ProductCategory::deleteAll(['category_id' => $this->category_id]); | 197 | ProductCategory::deleteAll(['category_id' => $this->category_id]); |
196 | return true; | 198 | return true; |
197 | } | 199 | } |
200 | + | ||
201 | + /** | ||
202 | + * @param array $product_id | ||
203 | + * @param array $product_variant_id | ||
204 | + * @return ActiveQuery | ||
205 | + */ | ||
206 | + | ||
207 | + public function getFilterQuery( $product_id = [], $product_variant_id = []){ | ||
208 | + $query1 = (new Query()) | ||
209 | + ->distinct() | ||
210 | + ->select([ | ||
211 | + 'option_id' | ||
212 | + ]) | ||
213 | + ->from('tax_option') | ||
214 | + ->innerJoin('product_variant_option', 'tax_option.tax_option_id = product_variant_option.option_id') | ||
215 | + ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id') | ||
216 | + ->innerJoin('product_variant', 'product_variant.product_variant_id = product_variant_option.product_variant_id') | ||
217 | + ->innerJoin('product', 'product.product_id = product_variant.product_id') | ||
218 | + ->innerJoin('product_category', 'product_category.product_id = product.product_id') | ||
219 | + ->innerJoin('tax_group_to_category', 'tax_group.tax_group_id = tax_group_to_category.tax_group_id') | ||
220 | + ->where(['product_category.category_id' => $this->category_id, | ||
221 | + 'tax_group.is_filter' => TRUE, | ||
222 | + 'tax_group_to_category.category_id'=>$this->category_id, | ||
223 | + | ||
224 | + ]) | ||
225 | + ->filterWhere([ | ||
226 | + 'product_variant_option.product_variant_id' => $product_variant_id | ||
227 | + ]) | ||
228 | + ->andWhere(['!=', 'product_variant.status', 1]); | ||
229 | + | ||
230 | + $query2 = (new Query()) | ||
231 | + ->distinct() | ||
232 | + ->select([ | ||
233 | + 'option_id' | ||
234 | + ]) | ||
235 | + ->from('tax_option') | ||
236 | + ->innerJoin('product_option', 'tax_option.tax_option_id = product_option.option_id') | ||
237 | + ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id') | ||
238 | + ->innerJoin('product', 'product.product_id = product_option.product_id') | ||
239 | + ->innerJoin('product_category', 'product_category.product_id = product.product_id') | ||
240 | + ->innerJoin('product_variant', 'product_variant.product_id = product.product_id') | ||
241 | + ->innerJoin('tax_group_to_category', 'tax_group.tax_group_id = tax_group_to_category.tax_group_id') | ||
242 | + ->where(['product_category.category_id' => $this->category_id, | ||
243 | + 'tax_group.is_filter' => TRUE, | ||
244 | + 'tax_group_to_category.category_id'=>$this->category_id, | ||
245 | + ]) | ||
246 | + ->filterWhere([ | ||
247 | + 'product_option.product_id' => $product_id | ||
248 | + ]) | ||
249 | + ->andWhere(['!=', 'product_variant.status', 1]); | ||
250 | + $query3 = (new Query()) | ||
251 | + ->select([ | ||
252 | + 'tax_option.*', | ||
253 | + 'tax_group.*', | ||
254 | + 'tax_option.alias as option_alias', | ||
255 | + 'tax_group.alias as group_alias', | ||
256 | + 'tax_option.name as value', | ||
257 | + 'tax_option.sort AS tax_option_sort', | ||
258 | + 'tax_group.sort AS tax_group_sort', | ||
259 | + ]) | ||
260 | + ->from(['tax_option' ]) | ||
261 | + ->where(['tax_option.tax_option_id'=>$query1->union($query2)]) | ||
262 | + | ||
263 | + ->innerJoin('tax_group','tax_group.tax_group_id = tax_option.tax_group_id') | ||
264 | + ->orderBy('tax_option.sort, tax_group.sort'); | ||
265 | + return $query3; | ||
266 | + } | ||
267 | + | ||
268 | + /** | ||
269 | + * @return mixed | ||
270 | + * @throws \Exception | ||
271 | + */ | ||
272 | + | ||
273 | + | ||
198 | public function getActiveFilters() { | 274 | public function getActiveFilters() { |
199 | return Category::getDb()->cache(function(){ | 275 | return Category::getDb()->cache(function(){ |
200 | - $query1 = (new Query()) | ||
201 | - ->distinct() | ||
202 | - ->select([ | ||
203 | - 'option_id' | ||
204 | - ]) | ||
205 | - ->from('tax_option') | ||
206 | - ->innerJoin('product_variant_option', 'tax_option.tax_option_id = product_variant_option.option_id') | ||
207 | - ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id') | ||
208 | - ->innerJoin('product_variant', 'product_variant.product_variant_id = product_variant_option.product_variant_id') | ||
209 | - ->innerJoin('product', 'product.product_id = product_variant.product_id') | ||
210 | - ->innerJoin('product_category', 'product_category.product_id = product.product_id') | ||
211 | - ->innerJoin('tax_group_to_category', 'tax_group.tax_group_id = tax_group_to_category.tax_group_id') | ||
212 | - ->where(['product_category.category_id' => $this->category_id, 'tax_group.is_filter' => TRUE,'tax_group_to_category.category_id'=>$this->category_id]) | ||
213 | - ->andWhere(['!=', 'product_variant.status', 1]); | ||
214 | - | ||
215 | - $query2 = (new Query()) | ||
216 | - ->distinct() | ||
217 | - ->select([ | ||
218 | - 'option_id' | ||
219 | - ]) | ||
220 | - ->from('tax_option') | ||
221 | - ->innerJoin('product_option', 'tax_option.tax_option_id = product_option.option_id') | ||
222 | - ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id') | ||
223 | - ->innerJoin('product', 'product.product_id = product_option.product_id') | ||
224 | - ->innerJoin('product_category', 'product_category.product_id = product.product_id') | ||
225 | - ->innerJoin('product_variant', 'product_variant.product_id = product.product_id') | ||
226 | - ->innerJoin('tax_group_to_category', 'tax_group.tax_group_id = tax_group_to_category.tax_group_id') | ||
227 | - ->where(['product_category.category_id' => $this->category_id, 'tax_group.is_filter' => TRUE,'tax_group_to_category.category_id'=>$this->category_id]) | ||
228 | - ->andWhere(['!=', 'product_variant.status', 1]); | ||
229 | - $query3 = (new Query()) | ||
230 | - ->select([ | ||
231 | - 'tax_option.*', | ||
232 | - 'tax_group.*', | ||
233 | - 'tax_option.alias as option_alias', | ||
234 | - 'tax_group.alias as group_alias', | ||
235 | - 'tax_option.name as value', | ||
236 | - 'tax_option.sort AS tax_option_sort', | ||
237 | - 'tax_group.sort AS tax_group_sort', | ||
238 | - ]) | ||
239 | - ->from(['tax_option' ]) | ||
240 | - ->where(['tax_option.tax_option_id'=>$query1->union($query2)]) | ||
241 | - ->innerJoin('tax_group','tax_group.tax_group_id = tax_option.tax_group_id') | ||
242 | - ->orderBy('tax_option.sort, tax_group.sort'); | ||
243 | - return $query3->all(); | 276 | + return $this->getFilterQuery()->all(); |
244 | }, 3600); | 277 | }, 3600); |
245 | 278 | ||
246 | } | 279 | } |
247 | 280 | ||
281 | + /** | ||
282 | + * @param array $product_id | ||
283 | + * @param array $product_variant_id | ||
284 | + * @return mixed | ||
285 | + */ | ||
286 | + public function getSelectFilters($product_id = [], $product_variant_id = []) { | ||
287 | + | ||
288 | + return $this->getFilterQuery($product_id, $product_variant_id)->select('tax_option_id')->column(); | ||
289 | + | ||
290 | + } | ||
291 | + | ||
292 | + | ||
248 | public function getTaxGroupsForMenu() | 293 | public function getTaxGroupsForMenu() |
249 | { | 294 | { |
250 | 295 | ||
@@ -282,4 +327,5 @@ class Category extends \yii\db\ActiveRecord | @@ -282,4 +327,5 @@ class Category extends \yii\db\ActiveRecord | ||
282 | return $this->hasMany(TaxGroup::className(), ['tax_group_id' => 'tax_group_id']) | 327 | return $this->hasMany(TaxGroup::className(), ['tax_group_id' => 'tax_group_id']) |
283 | ->viaTable('tax_group_to_category', ['category_id' => 'category_id']); | 328 | ->viaTable('tax_group_to_category', ['category_id' => 'category_id']); |
284 | } | 329 | } |
330 | + | ||
285 | } | 331 | } |
common/modules/product/models/Product.php
@@ -504,4 +504,5 @@ class Product extends \yii\db\ActiveRecord | @@ -504,4 +504,5 @@ class Product extends \yii\db\ActiveRecord | ||
504 | ->viaTable('product_option',[ 'product_id'=> 'product_id']) | 504 | ->viaTable('product_option',[ 'product_id'=> 'product_id']) |
505 | ->joinWith('taxGroup'); | 505 | ->joinWith('taxGroup'); |
506 | } | 506 | } |
507 | + | ||
507 | } | 508 | } |
common/modules/product/models/ProductVariant.php
@@ -215,6 +215,10 @@ class ProductVariant extends \yii\db\ActiveRecord | @@ -215,6 +215,10 @@ class ProductVariant extends \yii\db\ActiveRecord | ||
215 | return $this->hasMany(TaxOption::className(), ['tax_option_id' => 'option_id'])->viaTable('product_variant_option', ['product_variant_id' => 'product_variant_id']); | 215 | return $this->hasMany(TaxOption::className(), ['tax_option_id' => 'option_id'])->viaTable('product_variant_option', ['product_variant_id' => 'product_variant_id']); |
216 | } | 216 | } |
217 | 217 | ||
218 | + public function setOptions($value){ | ||
219 | + $this->_options = $value; | ||
220 | + } | ||
221 | + | ||
218 | public function getProperties() { | 222 | public function getProperties() { |
219 | $groups = $options = []; | 223 | $groups = $options = []; |
220 | foreach ($this->options as $option) { | 224 | foreach ($this->options as $option) { |
common/widgets/views/order.php
@@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
3 | <html lang="uk"> | 3 | <html lang="uk"> |
4 | <head> | 4 | <head> |
5 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | 5 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
6 | - <title>Rukzachok.com.ua</title> | 6 | + <title>linija-svitla.ua</title> |
7 | <style type="text/css"> | 7 | <style type="text/css"> |
8 | body { | 8 | body { |
9 | font-family: helvetica neue, arial, sans-serif; | 9 | font-family: helvetica neue, arial, sans-serif; |
@@ -57,8 +57,6 @@ | @@ -57,8 +57,6 @@ | ||
57 | </td> | 57 | </td> |
58 | <td style="text-align: left; vertical-align: top; font-size: 85%; padding: 20px 20px 15px 15px;"> | 58 | <td style="text-align: left; vertical-align: top; font-size: 85%; padding: 20px 20px 15px 15px;"> |
59 | <strong>Спасибо за Ваш заказ!</strong> | 59 | <strong>Спасибо за Ваш заказ!</strong> |
60 | - <br> | ||
61 | - <a href="http://www.rukzachok.com.ua" | ||
62 | </td> | 60 | </td> |
63 | </tr> | 61 | </tr> |
64 | <tr> | 62 | <tr> |
1 | +<?php | ||
2 | + | ||
3 | +namespace console\controllers; | ||
4 | + | ||
5 | +use \common\models\FilterCache; | ||
6 | +use common\modules\product\helpers\FilterHelper; | ||
7 | +use common\modules\product\helpers\ProductHelper; | ||
8 | +use common\modules\product\models\Category; | ||
9 | +use common\modules\product\models\Product; | ||
10 | +use common\modules\product\models\ProductVariant; | ||
11 | +use common\modules\rubrication\models\TaxGroup; | ||
12 | +use common\modules\rubrication\models\TaxOption; | ||
13 | +use Yii; | ||
14 | +use yii\console\Controller; | ||
15 | +use yii\db\ActiveQuery; | ||
16 | + | ||
17 | +class FilterController extends Controller | ||
18 | +{ | ||
19 | + | ||
20 | + public $count = 1; | ||
21 | + public $begin_time; | ||
22 | + const DEPTH = 5; | ||
23 | + | ||
24 | + | ||
25 | + | ||
26 | + | ||
27 | + public function actionIndex() | ||
28 | + { | ||
29 | + $categories = Category::find()->all(); | ||
30 | + | ||
31 | + foreach($categories as $category){ | ||
32 | + /** | ||
33 | + *@var TaxGroup $taxGroup | ||
34 | + *@var Category $category | ||
35 | + *@var TaxOption $option | ||
36 | + */ | ||
37 | + | ||
38 | + $taxOptions = $category->filterQuery->all(); | ||
39 | + $brands = $category->brands; | ||
40 | + foreach($brands as $brand){ | ||
41 | + $taxOptions[] = [ | ||
42 | + 'group_alias' => 'brands', | ||
43 | + 'option_alias' => $brand->brand_id, | ||
44 | + 'tax_option_id' => $brand->brand_id, | ||
45 | + ]; | ||
46 | + } | ||
47 | + $count = count($taxOptions); | ||
48 | + $key = 0; | ||
49 | +// $sumArray = FilterCache::find()->select('options_key')->column(); | ||
50 | +// print_r($sumArray); | ||
51 | +// die(); | ||
52 | + $sumArray=[]; | ||
53 | + $optionsIdArray = []; | ||
54 | + $params = []; | ||
55 | + | ||
56 | + $this->begin_time = time() - 1272000000 + floatval(microtime()); | ||
57 | + $this->RecursiveOptionFinder($category,$count, $taxOptions,$key,$sumArray,$optionsIdArray,$params); | ||
58 | + | ||
59 | + $end_time = time() - 1272000000 + floatval(microtime()) - $this->begin_time; | ||
60 | + print_r($end_time); | ||
61 | + die(); | ||
62 | + | ||
63 | + } | ||
64 | + } | ||
65 | + | ||
66 | + | ||
67 | + /** | ||
68 | + * @param Category $category | ||
69 | + * @param $count | ||
70 | + * @param TaxOption array $taxOptions | ||
71 | + * @param $key | ||
72 | + * @param $sumArray | ||
73 | + * @param $optionsIdArray | ||
74 | + * @param array $params | ||
75 | + */ | ||
76 | + | ||
77 | + public function RecursiveOptionFinder($category, $count, $taxOptions, $key, &$sumArray, $optionsIdArray,$params){ | ||
78 | + | ||
79 | + for($o = $key; $o <= $count; $o++){ | ||
80 | + if(isset($taxOptions[$o]) && (count($optionsIdArray) < self::DEPTH)){ | ||
81 | + $_optionsIdArray = $optionsIdArray; | ||
82 | + $_optionsIdArray[] = $taxOptions[$o]['tax_option_id']; | ||
83 | + $sum = FilterCache::createCacheKey($_optionsIdArray); | ||
84 | + if( !in_array( $sum, $sumArray)){ | ||
85 | + | ||
86 | + $sumArray[] = $sum; | ||
87 | + $key = $o+1; | ||
88 | + $this->selectParams($params,$taxOptions[$o]['group_alias'], $taxOptions[$o]['option_alias']); | ||
89 | + $this->RecursiveOptionFinder($category,$count, $taxOptions, $key, $sumArray,$optionsIdArray,$params); | ||
90 | + $optionsIdArray[] = $taxOptions[$o]['tax_option_id']; | ||
91 | + $this->saveFilterCache($category,$params, $sum,$optionsIdArray); | ||
92 | + $o++; | ||
93 | + } else { | ||
94 | + $optionsIdArray[] = $taxOptions[$o]['tax_option_id']; | ||
95 | + $key = $o+1; | ||
96 | + $this->selectParams($params,$taxOptions[$o]['group_alias'], $taxOptions[$o]['option_alias']); | ||
97 | + $this->RecursiveOptionFinder($category,$count, $taxOptions, $key, $sumArray,$optionsIdArray,$params); | ||
98 | + $o++; | ||
99 | + } | ||
100 | + } | ||
101 | + } | ||
102 | + } | ||
103 | + | ||
104 | + public function selectParams(&$params,$alias,$optionAlias){ | ||
105 | + | ||
106 | + if(isset($params[$alias])){ | ||
107 | + $params[$alias][] = $optionAlias; | ||
108 | + } else { | ||
109 | + | ||
110 | + $params = array_merge($params, [$alias=>[$optionAlias]]); | ||
111 | + } | ||
112 | + return $params; | ||
113 | + } | ||
114 | + | ||
115 | + /** | ||
116 | + * | ||
117 | + * @param Category $category | ||
118 | + * @param array $params | ||
119 | + * @param $options_key | ||
120 | + * @param array $optionsIdArray | ||
121 | + */ | ||
122 | + | ||
123 | + public function saveFilterCache($category,$params, $options_key,$optionsIdArray){ | ||
124 | + $count = $this->findItem($category,$params); | ||
125 | + | ||
126 | + $model = new FilterCache(); | ||
127 | + $model->category_id = $category->category_id; | ||
128 | + $model->count = $count; | ||
129 | + $model->depth = count($optionsIdArray); | ||
130 | + $model->options_key = $options_key; | ||
131 | + $model->save(); | ||
132 | + } | ||
133 | + | ||
134 | + | ||
135 | + /** | ||
136 | + * @param Category $category | ||
137 | + * @param array $params | ||
138 | + * @return int | ||
139 | + */ | ||
140 | + public function findItem($category,$params){ | ||
141 | + return $this->getSearchQuery($category,$params)->count(); | ||
142 | + //$count2 = $this->getSearchQuery2($category,$params)->count(); | ||
143 | +// $this->count ++; | ||
144 | +// if($this->count == 100){ | ||
145 | +// $end_time = time() - 1272000000 + floatval(microtime()) - $this->begin_time; | ||
146 | +// print_r($end_time); | ||
147 | +// die(); | ||
148 | +// } | ||
149 | + } | ||
150 | + | ||
151 | + public function getSearchQuery($category = null, $params = []) { | ||
152 | + | ||
153 | + | ||
154 | + /** @var ActiveQuery $query */ | ||
155 | + /**@var Category $category **/ | ||
156 | + $query = $category->getProducts(); | ||
157 | + | ||
158 | + | ||
159 | + $query->select(['product.*']); | ||
160 | + $query->joinWith(['enabledVariants','brand','options', 'category']); | ||
161 | + | ||
162 | + $query->groupBy(['product.product_id', 'product_variant.price']); | ||
163 | + | ||
164 | + ProductHelper::_setQueryParams($query, $params); | ||
165 | + | ||
166 | + $query->andWhere(['!=', ProductVariant::tableName() .'.status', 1]); | ||
167 | + | ||
168 | + | ||
169 | + | ||
170 | + return $query; | ||
171 | + | ||
172 | + } | ||
173 | + | ||
174 | +// public function getSearchQuery2($category = null, $params = []) { | ||
175 | +// | ||
176 | +// | ||
177 | +// /** @var ActiveQuery $query */ | ||
178 | +// /**@var Category $category **/ | ||
179 | +// $query = $category->getProducts(); | ||
180 | +// | ||
181 | +// | ||
182 | +// $query->select(['product.*']); | ||
183 | +// $query->joinWith(['enabledVariants','brand','options', 'category']); | ||
184 | +// | ||
185 | +// $query->groupBy(['product.product_id', 'product_variant.price']); | ||
186 | +// | ||
187 | +// FilterHelper::setNewQueryParams($query, $params); | ||
188 | +// | ||
189 | +// $query->andWhere(['!=', ProductVariant::tableName() .'.status', 1]); | ||
190 | +// | ||
191 | +// | ||
192 | +// | ||
193 | +// return $query; | ||
194 | +// | ||
195 | +// } | ||
196 | + | ||
197 | +} | ||
198 | + |
console/migrations/m160321_232402_orders1.php deleted
1 | -<?php | ||
2 | - | ||
3 | -use yii\db\Migration; | ||
4 | - | ||
5 | -class m160321_232402_orders extends Migration | ||
6 | -{ | ||
7 | - public function up() | ||
8 | - { | ||
9 | - $tableOptions = null; | ||
10 | - if ($this->db->driverName === 'mysql') { | ||
11 | - // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci | ||
12 | - $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; | ||
13 | - } | ||
14 | - | ||
15 | - $this->createTable('{{%orders}}', [ | ||
16 | - 'order_id' => $this->primaryKey(), | ||
17 | - 'customer_id' => $this->integer(), | ||
18 | - 'name' => $this->string()->notNull(), | ||
19 | - 'email' => $this->string()->notNull(), | ||
20 | - 'phone' => $this->string(32)->notNull(), | ||
21 | - 'delivery' => $this->integer(), | ||
22 | - 'payment' => $this->integer(), | ||
23 | - 'code' => $this->string(), | ||
24 | - 'status' => $this->smallInteger(), | ||
25 | - 'created_at' => $this->integer()->notNull(), | ||
26 | - 'updated_at' => $this->integer()->notNull(), | ||
27 | - ], $tableOptions); | ||
28 | - | ||
29 | - $this->createTable('{{%order_items}}', [ | ||
30 | - 'order_items_id' => $this->primaryKey(), | ||
31 | - 'order_id' => $this->integer(), | ||
32 | - 'item_id' => $this->integer(), | ||
33 | - 'item_count' => $this->integer(), | ||
34 | - 'price' => $this->float(), | ||
35 | - ], $tableOptions); | ||
36 | - | ||
37 | - $this->addForeignKey('orders_items_fk', '{{%order_items}}', 'order_id', '{{%orders}}', 'order_id', 'CASCADE', 'CASCADE'); | ||
38 | - $this->addForeignKey('orders_items_items_fk', '{{%order_items}}', 'item_id', '{{%product}}', 'product_id', 'RESTRICT', 'RESTRICT'); | ||
39 | - } | ||
40 | - | ||
41 | - public function down() | ||
42 | - { | ||
43 | - $this->dropForeignKey('orders_items_fk', '{{%order_items}}'); | ||
44 | - $this->dropForeignKey('orders_items_items_fk', '{{%order_items}}'); | ||
45 | - $this->dropTable('{{%orders}}'); | ||
46 | - $this->dropTable('{{%order_items}}'); | ||
47 | - } | ||
48 | - | ||
49 | -} |
1 | +<?php | ||
2 | + | ||
3 | +use yii\db\Migration; | ||
4 | + | ||
5 | +class m161104_094427_filter_cache extends Migration | ||
6 | +{ | ||
7 | + public function up() | ||
8 | + { | ||
9 | + $this->createTable('filter_cache', [ | ||
10 | + 'id' => $this->primaryKey(), | ||
11 | + 'options_key' => $this->integer(20), | ||
12 | + 'category_id' => $this->integer(), | ||
13 | + 'depth' => $this->integer(), | ||
14 | + 'count' => $this->integer(), | ||
15 | + ]); | ||
16 | + } | ||
17 | + | ||
18 | + public function down() | ||
19 | + { | ||
20 | + $this->dropTable('filter_cache'); | ||
21 | + } | ||
22 | +} |
frontend/config/main.php
@@ -10,10 +10,6 @@ return [ | @@ -10,10 +10,6 @@ return [ | ||
10 | 'id' => 'app-frontend', | 10 | 'id' => 'app-frontend', |
11 | 'name'=>'Лінія Світла', | 11 | 'name'=>'Лінія Світла', |
12 | 'basePath' => dirname(__DIR__), | 12 | 'basePath' => dirname(__DIR__), |
13 | - 'bootstrap' => [ | ||
14 | - | ||
15 | - 'frontend\components\SeoComponent', | ||
16 | - ], | ||
17 | 'controllerNamespace' => 'frontend\controllers', | 13 | 'controllerNamespace' => 'frontend\controllers', |
18 | 'modules' => [ | 14 | 'modules' => [ |
19 | 15 |
frontend/controllers/AjaxController.php
@@ -3,6 +3,11 @@ | @@ -3,6 +3,11 @@ | ||
3 | namespace frontend\controllers; | 3 | namespace frontend\controllers; |
4 | 4 | ||
5 | use common\models\Feedback; | 5 | use common\models\Feedback; |
6 | +use common\modules\product\helpers\ProductHelper; | ||
7 | +use common\modules\product\models\Brand; | ||
8 | +use common\modules\product\models\Category; | ||
9 | +use common\modules\product\models\ProductVariant; | ||
10 | +use yii\db\ActiveQuery; | ||
6 | use yii\web\Controller; | 11 | use yii\web\Controller; |
7 | use \common\modules\product\widgets\specialProducts; | 12 | use \common\modules\product\widgets\specialProducts; |
8 | class AjaxController extends Controller | 13 | class AjaxController extends Controller |
@@ -46,4 +51,62 @@ class AjaxController extends Controller | @@ -46,4 +51,62 @@ class AjaxController extends Controller | ||
46 | public function actionProm(){ | 51 | public function actionProm(){ |
47 | return specialProducts::widget(['type' => 'promo']); | 52 | return specialProducts::widget(['type' => 'promo']); |
48 | } | 53 | } |
54 | + | ||
55 | + | ||
56 | + public function actionTest(){ | ||
57 | + $filter = \Yii::$app->request->get('info'); | ||
58 | + | ||
59 | + | ||
60 | + if(!empty( $filter[ 'brands' ] )) { | ||
61 | + $brands = Brand::find() | ||
62 | + ->select('brand_id') | ||
63 | + ->where([ | ||
64 | + 'in', | ||
65 | + 'alias', | ||
66 | + $filter[ 'brands' ], | ||
67 | + ]) | ||
68 | + ->all(); | ||
69 | + $filter[ 'brands' ] = [ ]; | ||
70 | + foreach($brands as $brand) { | ||
71 | + $filter[ 'brands' ][] = $brand->brand_id; | ||
72 | + } | ||
73 | + } | ||
74 | + | ||
75 | + if(!empty($filter)){ | ||
76 | + $category = Category::findOne(176); | ||
77 | + return $this->findItem($category,$filter); | ||
78 | + } else { | ||
79 | + return 'test'; | ||
80 | + } | ||
81 | + | ||
82 | + } | ||
83 | + | ||
84 | + public function getSearchQuery($category = null, $params = []) { | ||
85 | + | ||
86 | + | ||
87 | + /** @var ActiveQuery $query */ | ||
88 | + /**@var Category $category **/ | ||
89 | + $query = $category->getProducts(); | ||
90 | + | ||
91 | + | ||
92 | + $query->select(['product.*']); | ||
93 | + $query->joinWith(['enabledVariants','brand','options', 'category']); | ||
94 | + | ||
95 | + $query->groupBy(['product.product_id', 'product_variant.price']); | ||
96 | + | ||
97 | + ProductHelper::_setQueryParams($query, $params); | ||
98 | + | ||
99 | + $query->andWhere(['!=', ProductVariant::tableName() .'.status', 1]); | ||
100 | + | ||
101 | + | ||
102 | + | ||
103 | + return $query; | ||
104 | + | ||
105 | + } | ||
106 | + | ||
107 | + | ||
108 | + | ||
109 | + public function findItem($category,$params){ | ||
110 | + return $this->getSearchQuery($category,$params)->count(); | ||
111 | + } | ||
49 | } | 112 | } |
50 | \ No newline at end of file | 113 | \ No newline at end of file |
frontend/controllers/CatalogController.php
@@ -2,33 +2,22 @@ | @@ -2,33 +2,22 @@ | ||
2 | 2 | ||
3 | namespace frontend\controllers; | 3 | namespace frontend\controllers; |
4 | 4 | ||
5 | -use common\modules\product\Filter; | 5 | + |
6 | use common\modules\product\helpers\ProductHelper; | 6 | use common\modules\product\helpers\ProductHelper; |
7 | -use common\modules\rubrication\models\TaxOptionSearch; | ||
8 | use frontend\models\ProductFrontendSearch; | 7 | use frontend\models\ProductFrontendSearch; |
9 | use Yii; | 8 | use Yii; |
10 | use common\modules\product\models\Brand; | 9 | use common\modules\product\models\Brand; |
11 | use common\modules\product\models\BrandSearch; | 10 | use common\modules\product\models\BrandSearch; |
12 | use common\modules\product\models\Category; | 11 | use common\modules\product\models\Category; |
13 | -use common\modules\product\models\CategorySearch; | ||
14 | use common\modules\product\models\Product; | 12 | 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; | 13 | 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; | 14 | use yii\data\ActiveDataProvider; |
23 | -use yii\data\Pagination; | ||
24 | -use yii\data\Sort; | ||
25 | -use yii\db\ActiveQuery; | ||
26 | use yii\helpers\ArrayHelper; | 15 | use yii\helpers\ArrayHelper; |
27 | -use yii\helpers\VarDumper; | ||
28 | -use yii\web\HttpException; | ||
29 | 16 | ||
30 | class CatalogController extends \yii\web\Controller | 17 | class CatalogController extends \yii\web\Controller |
31 | { | 18 | { |
19 | + | ||
20 | + | ||
32 | public function actionSearch() { | 21 | public function actionSearch() { |
33 | // @todo | 22 | // @todo |
34 | } | 23 | } |
@@ -36,6 +25,7 @@ class CatalogController extends \yii\web\Controller | @@ -36,6 +25,7 @@ class CatalogController extends \yii\web\Controller | ||
36 | public function actionCategory() | 25 | public function actionCategory() |
37 | { | 26 | { |
38 | 27 | ||
28 | + | ||
39 | /** @var Category $category */ | 29 | /** @var Category $category */ |
40 | $category = Yii::$app->request->get('category'); | 30 | $category = Yii::$app->request->get('category'); |
41 | $filter = Yii::$app->request->get('filters', [ ]); | 31 | $filter = Yii::$app->request->get('filters', [ ]); |
@@ -53,21 +43,7 @@ class CatalogController extends \yii\web\Controller | @@ -53,21 +43,7 @@ class CatalogController extends \yii\web\Controller | ||
53 | ->where([ 'is_filter' => 'TRUE' ]) | 43 | ->where([ 'is_filter' => 'TRUE' ]) |
54 | ->all(), 'alias'); | 44 | ->all(), 'alias'); |
55 | 45 | ||
56 | - if(!empty( $filter[ 'brands' ] )) { | ||
57 | - unset( $filter_check[ 'brands' ] ); | ||
58 | - $brands = Brand::find() | ||
59 | - ->select('brand_id') | ||
60 | - ->where([ | ||
61 | - 'in', | ||
62 | - 'alias', | ||
63 | - $filter[ 'brands' ], | ||
64 | - ]) | ||
65 | - ->all(); | ||
66 | - $params[ 'brands' ] = [ ]; | ||
67 | - foreach($brands as $brand) { | ||
68 | - $params[ 'brands' ][] = $brand->brand_id; | ||
69 | - } | ||
70 | - } | 46 | + |
71 | 47 | ||
72 | if(!empty( $filter[ 'special' ] )) { | 48 | if(!empty( $filter[ 'special' ] )) { |
73 | unset( $filter_check[ 'special' ] ); | 49 | unset( $filter_check[ 'special' ] ); |
@@ -90,6 +66,24 @@ class CatalogController extends \yii\web\Controller | @@ -90,6 +66,24 @@ class CatalogController extends \yii\web\Controller | ||
90 | $params[ 'prices' ] = $filter[ 'prices' ]; | 66 | $params[ 'prices' ] = $filter[ 'prices' ]; |
91 | } | 67 | } |
92 | 68 | ||
69 | + $activeFiltersParams = $filter_check; | ||
70 | + | ||
71 | + if(!empty( $filter[ 'brands' ] )) { | ||
72 | + unset( $filter_check[ 'brands' ] ); | ||
73 | + $brands = Brand::find() | ||
74 | + ->select('brand_id') | ||
75 | + ->where([ | ||
76 | + 'in', | ||
77 | + 'alias', | ||
78 | + $filter[ 'brands' ], | ||
79 | + ]) | ||
80 | + ->all(); | ||
81 | + $params[ 'brands' ] = [ ]; | ||
82 | + foreach($brands as $brand) { | ||
83 | + $params[ 'brands' ][] = $brand->brand_id; | ||
84 | + } | ||
85 | + } | ||
86 | + | ||
93 | foreach($optionsList as $optionList) { | 87 | foreach($optionsList as $optionList) { |
94 | 88 | ||
95 | if(isset( $filter[ $optionList ] )) { | 89 | if(isset( $filter[ $optionList ] )) { |
@@ -109,26 +103,70 @@ class CatalogController extends \yii\web\Controller | @@ -109,26 +103,70 @@ class CatalogController extends \yii\web\Controller | ||
109 | } | 103 | } |
110 | 104 | ||
111 | $productModel = new ProductFrontendSearch(); | 105 | $productModel = new ProductFrontendSearch(); |
106 | + | ||
112 | $productProvider = $productModel->search($category, $params); | 107 | $productProvider = $productModel->search($category, $params); |
113 | 108 | ||
109 | + | ||
114 | $brandModel = new BrandSearch(); | 110 | $brandModel = new BrandSearch(); |
115 | $brands = $brandModel->getBrands($category, $params) | 111 | $brands = $brandModel->getBrands($category, $params) |
116 | ->all(); | 112 | ->all(); |
117 | 113 | ||
114 | + | ||
118 | $groups = $category->getActiveFilters(); | 115 | $groups = $category->getActiveFilters(); |
116 | + | ||
117 | + foreach($brands as $brand){ | ||
118 | + array_unshift($groups , [ | ||
119 | + 'group_alias' => 'brands', | ||
120 | + 'option_alias' => $brand->alias, | ||
121 | + 'tax_option_id' => $brand->brand_id, | ||
122 | + 'value' => $brand->name, | ||
123 | + 'alias' => 'brands', | ||
124 | + 'name' => 'Бренды' | ||
125 | + ]); | ||
126 | + } | ||
127 | + | ||
128 | + | ||
129 | + | ||
130 | + foreach ($groups as $key=> $group) { | ||
131 | + $param = $activeFiltersParams; | ||
132 | + if(isset($param[$group['alias']])){ | ||
133 | + if(!in_array($group['option_alias'],$param[$group['alias']])){ | ||
134 | + $param[$group['alias']][] = $group['option_alias']; | ||
135 | + } else { | ||
136 | + continue; | ||
137 | + } | ||
138 | + }else { | ||
139 | + $param = array_merge($param, [$group['alias']=>[$group['option_alias']]]); | ||
140 | + } | ||
141 | + | ||
142 | + $groups[$key] = array_merge($groups[$key],['cacheKey' => json_encode($param)] ); | ||
143 | + | ||
144 | + } | ||
145 | + | ||
146 | + | ||
147 | + | ||
119 | $groups = ArrayHelper::index($groups, null, 'name'); | 148 | $groups = ArrayHelper::index($groups, null, 'name'); |
120 | - $priceLimits = $productModel->priceLimits($category, $params); | 149 | + |
150 | + | ||
151 | + | ||
152 | + | ||
153 | + $cacheKey = ['ActiveProperties','id' => $category, 'params' => $params]; | ||
154 | + | ||
155 | + if(!$priceLimits = Yii::$app->cache->get($cacheKey)){ | ||
156 | + | ||
157 | + $priceLimits = $productModel->priceLimits($category, $params); | ||
158 | + | ||
159 | + Yii::$app->cache->set($cacheKey,$priceLimits,3600*24); | ||
160 | + } | ||
121 | 161 | ||
122 | 162 | ||
123 | return $this->render('products', [ | 163 | return $this->render('products', [ |
124 | 'category' => $category, | 164 | 'category' => $category, |
125 | - 'brandModel' => $brandModel, | ||
126 | - 'brands' => $brands, | ||
127 | 'filter' => $filter, | 165 | 'filter' => $filter, |
128 | 'params' => $params, | 166 | 'params' => $params, |
129 | 'productModel' => $productModel, | 167 | 'productModel' => $productModel, |
130 | 'productProvider' => $productProvider, | 168 | 'productProvider' => $productProvider, |
131 | - 'groups' => $groups, | 169 | + 'groups' => $groups, |
132 | 'priceLimits' => $priceLimits, | 170 | 'priceLimits' => $priceLimits, |
133 | ]); | 171 | ]); |
134 | 172 |
frontend/controllers/SiteController.php
@@ -3,6 +3,7 @@ | @@ -3,6 +3,7 @@ | ||
3 | namespace frontend\controllers; | 3 | namespace frontend\controllers; |
4 | 4 | ||
5 | 5 | ||
6 | +use common\modules\product\models\Category; | ||
6 | use Yii; | 7 | use Yii; |
7 | use common\models\LoginForm; | 8 | use common\models\LoginForm; |
8 | use frontend\models\PasswordResetRequestForm; | 9 | use frontend\models\PasswordResetRequestForm; |
@@ -223,23 +224,11 @@ class SiteController extends Controller | @@ -223,23 +224,11 @@ class SiteController extends Controller | ||
223 | { | 224 | { |
224 | 225 | ||
225 | 226 | ||
226 | - $category_alias = Yii::$app->request->get('category'); | ||
227 | - $is_count = Yii::$app->request->get('count', false); | ||
228 | 227 | ||
229 | - if ( !($category = CategorySearch::findByAlias($category_alias))) | ||
230 | - { | ||
231 | - throw new HttpException(404, 'Данной страницы не существует!'); | ||
232 | - } | ||
233 | - | ||
234 | - $products = $category->getProducts()->with(['filters','filters.group'])->joinWith('variant')->where(['product_variant.status'=>0])->all(); | ||
235 | - | ||
236 | - if ($is_count) { | ||
237 | - print (count($products)); | ||
238 | - exit; | ||
239 | - } | 228 | + $is_count = Yii::$app->request->get('count', false); |
240 | 229 | ||
230 | + $categories = Category::find()->all(); | ||
241 | 231 | ||
242 | -//var_dump($products);die(); | ||
243 | set_time_limit (0); | 232 | set_time_limit (0); |
244 | header ("Content-Type: text/xml"); | 233 | header ("Content-Type: text/xml"); |
245 | print '<?xml version="1.0" encoding="UTF-8" ?>'; | 234 | print '<?xml version="1.0" encoding="UTF-8" ?>'; |
@@ -250,17 +239,31 @@ class SiteController extends Controller | @@ -250,17 +239,31 @@ class SiteController extends Controller | ||
250 | print "<rate></rate>"; | 239 | print "<rate></rate>"; |
251 | print "<categories>"; | 240 | print "<categories>"; |
252 | 241 | ||
253 | - print "<category>"; | ||
254 | - print "<id>" . $category->category_id . "</id>"; | ||
255 | - print "<parentId></parentId>"; | ||
256 | - print "<name>" . $category->name . "</name>"; | ||
257 | - print "</category>"; | ||
258 | - | 242 | + foreach($categories as $category){ |
243 | + print "<category>"; | ||
244 | + print "<id>" .$category->category_id . "</id>"; | ||
245 | + print "<name>" . $category->name. "</name>"; | ||
246 | + print "</category>"; | ||
247 | + } | ||
259 | print "</categories>"; | 248 | print "</categories>"; |
249 | + | ||
250 | + | ||
251 | + | ||
252 | + | ||
260 | print "<items>"; | 253 | print "<items>"; |
261 | - /** @var Product $product */ | ||
262 | - foreach ($products as $product) | ||
263 | - { | 254 | + |
255 | + foreach($categories as $category){ | ||
256 | + $products = $category->getProducts()->with(['filters','filters.group'])->joinWith('variant')->where(['product_variant.status'=>0])->all(); | ||
257 | + | ||
258 | + if ($is_count) { | ||
259 | + print (count($products)); | ||
260 | + continue; | ||
261 | + } | ||
262 | + | ||
263 | + /** @var Product $product */ | ||
264 | + | ||
265 | + foreach ($products as $product) | ||
266 | + { | ||
264 | 267 | ||
265 | 268 | ||
266 | print "<item>"; | 269 | print "<item>"; |
@@ -338,9 +341,19 @@ class SiteController extends Controller | @@ -338,9 +341,19 @@ class SiteController extends Controller | ||
338 | print "</item>"; | 341 | print "</item>"; |
339 | 342 | ||
340 | 343 | ||
344 | + } | ||
345 | + | ||
341 | } | 346 | } |
342 | 347 | ||
343 | 348 | ||
349 | + | ||
350 | + | ||
351 | + | ||
352 | +//var_dump($products);die(); | ||
353 | + | ||
354 | + | ||
355 | + | ||
356 | + | ||
344 | print "</items>"; | 357 | print "</items>"; |
345 | 358 | ||
346 | print "</price>"; | 359 | print "</price>"; |
frontend/models/ProductFrontendSearch.php
@@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
2 | 2 | ||
3 | namespace frontend\models; | 3 | namespace frontend\models; |
4 | 4 | ||
5 | +use common\modules\product\helpers\FilterHelper; | ||
5 | use common\modules\product\helpers\ProductHelper; | 6 | use common\modules\product\helpers\ProductHelper; |
6 | use common\modules\product\models\Category; | 7 | use common\modules\product\models\Category; |
7 | use Yii; | 8 | use Yii; |
@@ -80,9 +81,7 @@ class ProductFrontendSearch extends Product { | @@ -80,9 +81,7 @@ class ProductFrontendSearch extends Product { | ||
80 | ] | 81 | ] |
81 | ]); | 82 | ]); |
82 | 83 | ||
83 | - if (!$this->validate()) { | ||
84 | - return $dataProvider; | ||
85 | - } | 84 | + |
86 | 85 | ||
87 | 86 | ||
88 | 87 | ||
@@ -105,7 +104,7 @@ class ProductFrontendSearch extends Product { | @@ -105,7 +104,7 @@ class ProductFrontendSearch extends Product { | ||
105 | 104 | ||
106 | $query->groupBy(['product.product_id', 'product_variant.price']); | 105 | $query->groupBy(['product.product_id', 'product_variant.price']); |
107 | 106 | ||
108 | - ProductHelper::_setQueryParams($query, $params); | 107 | + FilterHelper::setNewQueryParams($query, $params); |
109 | if($in_stock){ | 108 | if($in_stock){ |
110 | $query->andWhere(['!=', ProductVariant::tableName() .'.status', 1]); | 109 | $query->andWhere(['!=', ProductVariant::tableName() .'.status', 1]); |
111 | } | 110 | } |
frontend/views/catalog/_product_item.php
@@ -10,10 +10,10 @@ use yii\helpers\Url; | @@ -10,10 +10,10 @@ use yii\helpers\Url; | ||
10 | <div class="item_container" > | 10 | <div class="item_container" > |
11 | <input class="prodInfo" type="hidden" value="[]"> | 11 | <input class="prodInfo" type="hidden" value="[]"> |
12 | <div class="title"> | 12 | <div class="title"> |
13 | - <?= Html::a( $model->name, Url::to(['catalog/product', 'product' => $model->alias]), ['class'=>'btn-product-details'] )?> | 13 | + <?= Html::a( $model->name, Url::to(['catalog/product', 'product' => $model->alias]), ['class'=>'btn-product-details','data-pjax'=>0] )?> |
14 | </div> | 14 | </div> |
15 | <div class="img"> | 15 | <div class="img"> |
16 | - <a class="btn-product-details" | 16 | + <a data-pjax=0 class="btn-product-details" |
17 | 17 | ||
18 | 18 | ||
19 | href="<?= Url::to([ | 19 | href="<?= Url::to([ |
frontend/views/catalog/products.php
@@ -4,13 +4,19 @@ | @@ -4,13 +4,19 @@ | ||
4 | * @var View $this | 4 | * @var View $this |
5 | */ | 5 | */ |
6 | use frontend\widgets\FilterWidget; | 6 | use frontend\widgets\FilterWidget; |
7 | -use frontend\widgets\Seo; | ||
8 | -use yii\helpers\Url; | 7 | + use frontend\widgets\Seo; |
8 | + use yii\helpers\Url; | ||
9 | use yii\web\View; | 9 | use yii\web\View; |
10 | use yii\widgets\ListView; | 10 | use yii\widgets\ListView; |
11 | + use yii\widgets\Pjax; | ||
12 | + $this->registerCssFile (Yii::getAlias('@web/css/ion.rangeSlider.css')); | ||
13 | + $this->registerCssFile (Yii::getAlias('@web/css/ion.rangeSlider.skinHTML5.css')); | ||
14 | + $this->registerJsFile(Yii::getAlias('@web/js/ion.rangeSlider.js'),[ | ||
15 | + 'position' => View::POS_END, | ||
16 | + 'depends' => ['yii\web\JqueryAsset'] | ||
17 | + ]); | ||
11 | 18 | ||
12 | - | ||
13 | - $this->params['seo']['title'] = !empty($category->meta_title) ? $category->meta_title : $category->name; | 19 | +$this->params['seo']['title'] = !empty($category->meta_title) ? $category->meta_title : $category->name; |
14 | 20 | ||
15 | $this->params['seo']['fields']['meta-title'] = $category->meta_title; | 21 | $this->params['seo']['fields']['meta-title'] = $category->meta_title; |
16 | $this->params['seo']['h1'] = !empty($category->h1) ? $category->h1 : $category->name; | 22 | $this->params['seo']['h1'] = !empty($category->h1) ? $category->h1 : $category->name; |
@@ -29,16 +35,20 @@ use yii\helpers\Url; | @@ -29,16 +35,20 @@ use yii\helpers\Url; | ||
29 | 'position' => View::POS_END, | 35 | 'position' => View::POS_END, |
30 | 'depends' => ['yii\web\JqueryAsset'] | 36 | 'depends' => ['yii\web\JqueryAsset'] |
31 | ]); | 37 | ]); |
38 | + $this->registerJsFile(Yii::getAlias('@web/js/filter.js'),[ | ||
39 | + 'position' => View::POS_END, | ||
40 | + 'depends' => ['yii\web\JqueryAsset'] | ||
41 | + ]); | ||
32 | ?> | 42 | ?> |
33 | - | 43 | +<?php Pjax::begin(['timeout' => 5000,'id'=> 'list-container'])?> |
34 | <div class="container"> | 44 | <div class="container"> |
35 | <div class="block-25" style="position: relative;"> | 45 | <div class="block-25" style="position: relative;"> |
36 | <?= FilterWidget::widget([ | 46 | <?= FilterWidget::widget([ |
37 | 'category'=>$category, | 47 | 'category'=>$category, |
38 | 'groups'=> $groups, | 48 | 'groups'=> $groups, |
39 | 'filter'=> $filter, | 49 | 'filter'=> $filter, |
40 | - 'brands' => $brands, | ||
41 | - 'priceLimits' => $priceLimits | 50 | + 'priceLimits' => $priceLimits, |
51 | + //'filterBrands' => $filterBrands | ||
42 | ])?> | 52 | ])?> |
43 | 53 | ||
44 | <div class="clearfix"></div> | 54 | <div class="clearfix"></div> |
@@ -92,45 +102,6 @@ use yii\helpers\Url; | @@ -92,45 +102,6 @@ use yii\helpers\Url; | ||
92 | 102 | ||
93 | 103 | ||
94 | 104 | ||
95 | - <?php $js = "$('.toolbar-list').click(function(event) { | ||
96 | - //alert(1); | ||
97 | - $('.toolbar-list').addClass('selected'); | ||
98 | - $('.toolbar-grid').removeClass('selected'); | ||
99 | - $('#centrit .prodBox').addClass('list'); | ||
100 | - JsHttpRequest.query( | ||
101 | - 'hr_gate.php?test=500&r='+Math.random(), | ||
102 | - { | ||
103 | - 'sp': 'prod_list_style' | ||
104 | - ,'style': 1 | ||
105 | - }, | ||
106 | - function(result, errors) { }, | ||
107 | - true //disable caching | ||
108 | - ); | ||
109 | - }); | ||
110 | - $('.toolbar-grid').click(function(event) { | ||
111 | - $('.toolbar-grid').addClass('selected'); | ||
112 | - $('.toolbar-list').removeClass('selected'); | ||
113 | - $('#centrit .prodBox').removeClass('list'); | ||
114 | - JsHttpRequest.query( | ||
115 | - 'hr_gate.php?test=500&r='+Math.random(), | ||
116 | - { | ||
117 | - 'sp': 'prod_list_style' | ||
118 | - ,'style': 2 | ||
119 | - }, | ||
120 | - function(result, errors) { }, | ||
121 | - true //disable caching | ||
122 | - ); | ||
123 | - | ||
124 | - }); | ||
125 | - | ||
126 | - | ||
127 | - | ||
128 | - | ||
129 | - "; | ||
130 | - $this->registerJs($js,View::POS_READY); | ||
131 | - ?> | ||
132 | - | ||
133 | - | ||
134 | 105 | ||
135 | 106 | ||
136 | <div class="catalog_product_list view_table"> | 107 | <div class="catalog_product_list view_table"> |
@@ -157,6 +128,6 @@ use yii\helpers\Url; | @@ -157,6 +128,6 @@ use yii\helpers\Url; | ||
157 | 128 | ||
158 | </div> | 129 | </div> |
159 | </div> | 130 | </div> |
160 | - | 131 | +<?php Pjax::end()?> |
161 | 132 | ||
162 | 133 |
frontend/views/event/index.php
@@ -32,7 +32,7 @@ $this->params['seo']['h1'] = $this->title; | @@ -32,7 +32,7 @@ $this->params['seo']['h1'] = $this->title; | ||
32 | 32 | ||
33 | <div class="both"></div> | 33 | <div class="both"></div> |
34 | 34 | ||
35 | - | ||
36 | - </div> | ||
37 | - | 35 | + |
36 | + </div> | ||
37 | + | ||
38 | </div> | 38 | </div> |
39 | \ No newline at end of file | 39 | \ No newline at end of file |
frontend/views/event/show.php
@@ -71,6 +71,7 @@ $this->params['seo']['h1'] = $this->title; | @@ -71,6 +71,7 @@ $this->params['seo']['h1'] = $this->title; | ||
71 | 71 | ||
72 | <div class="catalog_product_list view_table"> | 72 | <div class="catalog_product_list view_table"> |
73 | <?= ListView::widget([ | 73 | <?= ListView::widget([ |
74 | + 'emptyText' => '', | ||
74 | 'dataProvider' => $productProvider, | 75 | 'dataProvider' => $productProvider, |
75 | 'itemView' => function ($model, $key, $index, $widget) { | 76 | 'itemView' => function ($model, $key, $index, $widget) { |
76 | return $this->render('../catalog/_product_item',[ | 77 | return $this->render('../catalog/_product_item',[ |
frontend/web/css/css_header.css
@@ -26965,4 +26965,8 @@ ul.product-special li.promo div { | @@ -26965,4 +26965,8 @@ ul.product-special li.promo div { | ||
26965 | 26965 | ||
26966 | .irs-slider.state_hover, .irs-slider{ | 26966 | .irs-slider.state_hover, .irs-slider{ |
26967 | background: #9fa4a8; | 26967 | background: #9fa4a8; |
26968 | +} | ||
26969 | + | ||
26970 | +.disabled-link{ | ||
26971 | + color: grey !important; | ||
26968 | } | 26972 | } |
26969 | \ No newline at end of file | 26973 | \ No newline at end of file |
1 | +/** | ||
2 | + * Created by vitaliy on 07.11.16. | ||
3 | + */ | ||
4 | + | ||
5 | +function loadService(){ | ||
6 | + | ||
7 | + $('.properties_block').each(function(){ | ||
8 | + var block = $(this); | ||
9 | + $(this).find('input[type=checkbox]').each(function(){ | ||
10 | + if(this.checked){ | ||
11 | + block.removeClass('closed').addClass('opened'); | ||
12 | + block.find('ul').css({"display":"block"}) | ||
13 | + return true; | ||
14 | + } | ||
15 | + | ||
16 | + }); | ||
17 | + | ||
18 | + }); | ||
19 | + | ||
20 | + $('#finput').keyup(function() { | ||
21 | + | ||
22 | + var empty = false; | ||
23 | + $('#finput').each(function() { | ||
24 | + if ($(this).val() == '') { | ||
25 | + empty = true; | ||
26 | + } | ||
27 | + }); | ||
28 | + | ||
29 | + if (empty) { | ||
30 | + $('.sok').attr('disabled', 'disabled').css('display','none'); | ||
31 | + } else { | ||
32 | + $('.sok').removeAttr('disabled').css('display','inline-block'); | ||
33 | + } | ||
34 | + | ||
35 | + }); | ||
36 | + | ||
37 | + | ||
38 | + | ||
39 | + | ||
40 | + | ||
41 | + | ||
42 | + $('.price_tooltip_close').on('click',function(){ | ||
43 | + $(this).parent().hide(); | ||
44 | + }); | ||
45 | + | ||
46 | + $('.pok').click(function(event) { | ||
47 | + url = $('#purl').val(); | ||
48 | + price_min = $('#min_price').val(); | ||
49 | + price_max = $('#max_price').val(); | ||
50 | + | ||
51 | + document.location.href = url + "&pmin=" + price_min + "&pmax=" + price_max; | ||
52 | + }); | ||
53 | + | ||
54 | + $('.sok').click(function(event) { | ||
55 | + if ($('#finput').val() != "Артикул" && $('#finput').val() != "") { | ||
56 | + | ||
57 | + | ||
58 | + document.location.href = "/search/main?word="+$('#finput').val(); | ||
59 | + | ||
60 | + | ||
61 | + } | ||
62 | + }); | ||
63 | +} | ||
64 | + | ||
65 | +function priceRequest(link){ | ||
66 | + var tag = $(link).parents('li'); | ||
67 | + var filter = tag.data('filter'); | ||
68 | + $.ajax({ | ||
69 | + url: "/ajax/test", | ||
70 | + type: 'GET', | ||
71 | + data: {info:filter}, | ||
72 | + success: function(result){ | ||
73 | + if(result=='0'){ | ||
74 | + $(link).addClass('disabled-link'); | ||
75 | + tag.find('input').prop( "disabled", true ); | ||
76 | + $(link).find("span").html(result); | ||
77 | + } else { | ||
78 | + $(link).removeClass('disabled-link'); | ||
79 | + tag.find('input').prop( "disabled", false ); | ||
80 | + $(link).find("span").html(result); | ||
81 | + } | ||
82 | + | ||
83 | + | ||
84 | + }}); | ||
85 | +} | ||
86 | + | ||
87 | + | ||
88 | +function loadPrices(){ | ||
89 | + $('.filter-link').each(function(){ | ||
90 | + if(!$(this).parents('li').data('checked')){ | ||
91 | + priceRequest(this); | ||
92 | + } | ||
93 | + | ||
94 | + | ||
95 | + }); | ||
96 | +} | ||
97 | + | ||
98 | + | ||
99 | +function priceSlider(){ | ||
100 | + | ||
101 | + | ||
102 | + if($('#price_interval').length){ | ||
103 | + | ||
104 | + var block = $('#price_block'); | ||
105 | + var link = block.data('url'); | ||
106 | + var min = block.data('min'); | ||
107 | + var max = block.data('max'); | ||
108 | + var from = block.data('from'); | ||
109 | + var to = block.data('to'); | ||
110 | + | ||
111 | + | ||
112 | + $('#price_interval').ionRangeSlider({ | ||
113 | + type: 'double', | ||
114 | + min: min, | ||
115 | + max: max, | ||
116 | + from: from, | ||
117 | + to: to, | ||
118 | + grid: false, | ||
119 | + onFinish: function(e) { | ||
120 | + var url = link; | ||
121 | + var from = e.from; | ||
122 | + var to = e.to; | ||
123 | + $.pjax({url: url.replace('{from}', from).replace('{to}', to), container: "#list-container",timeout:5000, scrollTo: false}) | ||
124 | + } | ||
125 | + }); | ||
126 | + } | ||
127 | +} | ||
128 | + | ||
129 | +$( document ).ready(function() { | ||
130 | + loadService(); | ||
131 | + loadPrices(); | ||
132 | + priceSlider(); | ||
133 | + | ||
134 | + $('body').on('click', '.disabled-link', function(e){ | ||
135 | + e.preventDefault(); | ||
136 | + }); | ||
137 | + | ||
138 | + $('body').on('change', '.features-option', function(){ | ||
139 | + var url = $(this).parents('li').find('a').attr('href'); | ||
140 | + $.pjax({url: url, container: '#list-container',timeout:5000,scrollTo:false }) | ||
141 | + }); | ||
142 | + | ||
143 | + $("#list-container").on("pjax:end", function() { | ||
144 | + loadPrices(); | ||
145 | + loadService(); | ||
146 | + priceSlider(); | ||
147 | + | ||
148 | + }); | ||
149 | + | ||
150 | + | ||
151 | + | ||
152 | + | ||
153 | + | ||
154 | + | ||
155 | +}); |
1 | +<?php | ||
2 | +/** | ||
3 | + * @link http://www.yiiframework.com/ | ||
4 | + * @copyright Copyright (c) 2008 Yii Software LLC | ||
5 | + * @license http://www.yiiframework.com/license/ | ||
6 | + */ | ||
7 | + | ||
8 | +namespace frontend\widgets; | ||
9 | + | ||
10 | +use Yii; | ||
11 | +use yii\base\Widget; | ||
12 | +use yii\helpers\ArrayHelper; | ||
13 | +use yii\helpers\Url; | ||
14 | +use yii\helpers\Html; | ||
15 | + | ||
16 | +/** | ||
17 | + * Menu displays a multi-level menu using nested HTML lists. | ||
18 | + * | ||
19 | + * The main property of Menu is [[items]], which specifies the possible items in the menu. | ||
20 | + * A menu item can contain sub-items which specify the sub-menu under that menu item. | ||
21 | + * | ||
22 | + * Menu checks the current route and request parameters to toggle certain menu items | ||
23 | + * with active state. | ||
24 | + * | ||
25 | + * Note that Menu only renders the HTML tags about the menu. It does do any styling. | ||
26 | + * You are responsible to provide CSS styles to make it look like a real menu. | ||
27 | + * | ||
28 | + * The following example shows how to use Menu: | ||
29 | + * | ||
30 | + * ```php | ||
31 | + * echo FilterList::widget([ | ||
32 | + * 'items' => [ | ||
33 | + * // Important: you need to specify url as 'controller/action', | ||
34 | + * // not just as 'controller' even if default action is used. | ||
35 | + * ['label' => 'Home', 'url' => ['site/index']], | ||
36 | + * // 'Products' menu item will be selected as long as the route is 'product/index' | ||
37 | + * ['label' => 'Products', 'url' => ['product/index'], 'items' => [ | ||
38 | + * ['label' => 'New Arrivals', 'url' => ['product/index', 'tag' => 'new']], | ||
39 | + * ['label' => 'Most Popular', 'url' => ['product/index', 'tag' => 'popular']], | ||
40 | + * ]], | ||
41 | + * ['label' => 'Login', 'url' => ['site/login'], 'visible' => Yii::$app->user->isGuest], | ||
42 | + * ], | ||
43 | + * ]); | ||
44 | + * ``` | ||
45 | + * | ||
46 | + * @author Qiang Xue <qiang.xue@gmail.com> | ||
47 | + * @since 2.0 | ||
48 | + */ | ||
49 | +class FilterList extends Widget | ||
50 | +{ | ||
51 | + /** | ||
52 | + * @var array list of menu items. Each menu item should be an array of the following structure: | ||
53 | + * | ||
54 | + * - label: string, optional, specifies the menu item label. When [[encodeLabels]] is true, the label | ||
55 | + * will be HTML-encoded. If the label is not specified, an empty string will be used. | ||
56 | + * - encode: boolean, optional, whether this item`s label should be HTML-encoded. This param will override | ||
57 | + * global [[encodeLabels]] param. | ||
58 | + * - url: string or array, optional, specifies the URL of the menu item. It will be processed by [[Url::to]]. | ||
59 | + * When this is set, the actual menu item content will be generated using [[linkTemplate]]; | ||
60 | + * otherwise, [[labelTemplate]] will be used. | ||
61 | + * - visible: boolean, optional, whether this menu item is visible. Defaults to true. | ||
62 | + * - items: array, optional, specifies the sub-menu items. Its format is the same as the parent items. | ||
63 | + * - active: boolean, optional, whether this menu item is in active state (currently selected). | ||
64 | + * If a menu item is active, its CSS class will be appended with [[activeCssClass]]. | ||
65 | + * If this option is not set, the menu item will be set active automatically when the current request | ||
66 | + * is triggered by `url`. For more details, please refer to [[isItemActive()]]. | ||
67 | + * - template: string, optional, the template used to render the content of this menu item. | ||
68 | + * The token `{url}` will be replaced by the URL associated with this menu item, | ||
69 | + * and the token `{label}` will be replaced by the label of the menu item. | ||
70 | + * If this option is not set, [[linkTemplate]] or [[labelTemplate]] will be used instead. | ||
71 | + * - submenuTemplate: string, optional, the template used to render the list of sub-menus. | ||
72 | + * The token `{items}` will be replaced with the rendered sub-menu items. | ||
73 | + * If this option is not set, [[submenuTemplate]] will be used instead. | ||
74 | + * - options: array, optional, the HTML attributes for the menu container tag. | ||
75 | + */ | ||
76 | + public $items = []; | ||
77 | + /** | ||
78 | + * @var array list of HTML attributes shared by all menu [[items]]. If any individual menu item | ||
79 | + * specifies its `options`, it will be merged with this property before being used to generate the HTML | ||
80 | + * attributes for the menu item tag. The following special options are recognized: | ||
81 | + * | ||
82 | + * - tag: string, defaults to "li", the tag name of the item container tags. | ||
83 | + * Set to false to disable container tag. | ||
84 | + * See also [[\yii\helpers\Html::tag()]]. | ||
85 | + * | ||
86 | + * @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. | ||
87 | + */ | ||
88 | + public $itemOptions = []; | ||
89 | + /** | ||
90 | + * @var string the template used to render the body of a menu which is a link. | ||
91 | + * In this template, the token `{url}` will be replaced with the corresponding link URL; | ||
92 | + * while `{label}` will be replaced with the link text. | ||
93 | + * This property will be overridden by the `template` option set in individual menu items via [[items]]. | ||
94 | + */ | ||
95 | + public $linkTemplate = '<a href="{url}">{label}</a>'; | ||
96 | + /** | ||
97 | + * @var string the template used to render the body of a menu which is NOT a link. | ||
98 | + * In this template, the token `{label}` will be replaced with the label of the menu item. | ||
99 | + * This property will be overridden by the `template` option set in individual menu items via [[items]]. | ||
100 | + */ | ||
101 | + public $labelTemplate = '{label}'; | ||
102 | + /** | ||
103 | + * @var string the template used to render a list of sub-menus. | ||
104 | + * In this template, the token `{items}` will be replaced with the rendered sub-menu items. | ||
105 | + */ | ||
106 | + public $submenuTemplate = "\n<ul>\n{items}\n</ul>\n"; | ||
107 | + /** | ||
108 | + * @var boolean whether the labels for menu items should be HTML-encoded. | ||
109 | + */ | ||
110 | + public $encodeLabels = true; | ||
111 | + /** | ||
112 | + * @var string the CSS class to be appended to the active menu item. | ||
113 | + */ | ||
114 | + public $activeCssClass = 'active'; | ||
115 | + /** | ||
116 | + * @var boolean whether to automatically activate items according to whether their route setting | ||
117 | + * matches the currently requested route. | ||
118 | + * @see isItemActive() | ||
119 | + */ | ||
120 | + public $activateItems = true; | ||
121 | + /** | ||
122 | + * @var boolean whether to activate parent menu items when one of the corresponding child menu items is active. | ||
123 | + * The activated parent menu items will also have its CSS classes appended with [[activeCssClass]]. | ||
124 | + */ | ||
125 | + public $activateParents = false; | ||
126 | + /** | ||
127 | + * @var boolean whether to hide empty menu items. An empty menu item is one whose `url` option is not | ||
128 | + * set and which has no visible child menu items. | ||
129 | + */ | ||
130 | + public $hideEmptyItems = true; | ||
131 | + /** | ||
132 | + * @var array the HTML attributes for the menu's container tag. The following special options are recognized: | ||
133 | + * | ||
134 | + * - tag: string, defaults to "ul", the tag name of the item container tags. Set to false to disable container tag. | ||
135 | + * See also [[\yii\helpers\Html::tag()]]. | ||
136 | + * | ||
137 | + * @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. | ||
138 | + */ | ||
139 | + public $options = []; | ||
140 | + /** | ||
141 | + * @var string the CSS class that will be assigned to the first item in the main menu or each submenu. | ||
142 | + * Defaults to null, meaning no such CSS class will be assigned. | ||
143 | + */ | ||
144 | + public $firstItemCssClass; | ||
145 | + /** | ||
146 | + * @var string the CSS class that will be assigned to the last item in the main menu or each submenu. | ||
147 | + * Defaults to null, meaning no such CSS class will be assigned. | ||
148 | + */ | ||
149 | + public $lastItemCssClass; | ||
150 | + /** | ||
151 | + * @var string the route used to determine if a menu item is active or not. | ||
152 | + * If not set, it will use the route of the current request. | ||
153 | + * @see params | ||
154 | + * @see isItemActive() | ||
155 | + */ | ||
156 | + public $route; | ||
157 | + /** | ||
158 | + * @var array the parameters used to determine if a menu item is active or not. | ||
159 | + * If not set, it will use `$_GET`. | ||
160 | + * @see route | ||
161 | + * @see isItemActive() | ||
162 | + */ | ||
163 | + public $params; | ||
164 | + | ||
165 | + | ||
166 | + /** | ||
167 | + * Renders the menu. | ||
168 | + */ | ||
169 | + public function run() | ||
170 | + { | ||
171 | + if ($this->route === null && Yii::$app->controller !== null) { | ||
172 | + $this->route = Yii::$app->controller->getRoute(); | ||
173 | + } | ||
174 | + if ($this->params === null) { | ||
175 | + $this->params = Yii::$app->request->getQueryParams(); | ||
176 | + } | ||
177 | + $items = $this->normalizeItems($this->items, $hasActiveChild); | ||
178 | + if (!empty($items)) { | ||
179 | + $options = $this->options; | ||
180 | + $tag = ArrayHelper::remove($options, 'tag', 'ul'); | ||
181 | + | ||
182 | + echo Html::tag($tag, $this->renderItems($items), $options); | ||
183 | + } | ||
184 | + } | ||
185 | + | ||
186 | + /** | ||
187 | + * Recursively renders the menu items (without the container tag). | ||
188 | + * @param array $items the menu items to be rendered recursively | ||
189 | + * @return string the rendering result | ||
190 | + */ | ||
191 | + protected function renderItems($items) | ||
192 | + { | ||
193 | + $n = count($items); | ||
194 | + $lines = []; | ||
195 | + foreach ($items as $i => $item) { | ||
196 | + | ||
197 | + $options = array_merge($this->itemOptions, ArrayHelper::getValue($item, 'option | ||
198 | +s', [])); | ||
199 | + $tag = ArrayHelper::remove($options, 'tag | ||
200 | + print_r($tag);', 'li'); | ||
201 | + $class = []; | ||
202 | + if ($item['active']) { | ||
203 | + $class[] = $this->activeCssClass; | ||
204 | + } | ||
205 | + if ($i === 0 && $this->firstItemCssClass !== null) { | ||
206 | + $class[] = $this->firstItemCssClass; | ||
207 | + } | ||
208 | + if ($i === $n - 1 && $this->lastItemCssClass !== null) { | ||
209 | + $class[] = $this->lastItemCssClass; | ||
210 | + } | ||
211 | + if (!empty($class)) { | ||
212 | + if (empty($options['class'])) { | ||
213 | + $options['class'] = implode(' ', $class); | ||
214 | + } else { | ||
215 | + $options['class'] .= ' ' . implode(' ', $class); | ||
216 | + } | ||
217 | + } | ||
218 | + | ||
219 | + $menu = $this->renderItem($item); | ||
220 | + if (!empty($item['items'])) { | ||
221 | + $submenuTemplate = ArrayHelper::getValue($item, 'submenuTemplate', $this->submenuTemplate); | ||
222 | + $menu .= strtr($submenuTemplate, [ | ||
223 | + '{items}' => $this->renderItems($item['items']), | ||
224 | + ]); | ||
225 | + } | ||
226 | + $lines[] = Html::tag($tag, $menu, $options); | ||
227 | + } | ||
228 | + | ||
229 | + return implode("\n", $lines); | ||
230 | + } | ||
231 | + | ||
232 | + /** | ||
233 | + * Renders the content of a menu item. | ||
234 | + * Note that the container and the sub-menus are not rendered here. | ||
235 | + * @param array $item the menu item to be rendered. Please refer to [[items]] to see what data might be in the item. | ||
236 | + * @return string the rendering result | ||
237 | + */ | ||
238 | + protected function renderItem($item) | ||
239 | + { | ||
240 | + if (isset($item['url'])) { | ||
241 | + $template = ArrayHelper::getValue($item, 'template', $this->linkTemplate); | ||
242 | + | ||
243 | + return strtr($template, [ | ||
244 | + '{url}' => Html::encode(Url::to($item['url'])), | ||
245 | + '{label}' => $item['label'], | ||
246 | + ]); | ||
247 | + } else { | ||
248 | + $template = ArrayHelper::getValue($item, 'template', $this->labelTemplate); | ||
249 | + | ||
250 | + return strtr($template, [ | ||
251 | + '{label}' => $item['label'], | ||
252 | + ]); | ||
253 | + } | ||
254 | + } | ||
255 | + | ||
256 | + /** | ||
257 | + * Normalizes the [[items]] property to remove invisible items and activate certain items. | ||
258 | + * @param array $items the items to be normalized. | ||
259 | + * @param boolean $active whether there is an active child menu item. | ||
260 | + * @return array the normalized menu items | ||
261 | + */ | ||
262 | + protected function normalizeItems($items, &$active) | ||
263 | + { | ||
264 | + foreach ($items as $i => $item) { | ||
265 | + if (isset($item['visible']) && !$item['visible']) { | ||
266 | + unset($items[$i]); | ||
267 | + continue; | ||
268 | + } | ||
269 | + if (!isset($item['label'])) { | ||
270 | + $item['label'] = ''; | ||
271 | + } | ||
272 | + $encodeLabel = isset($item['encode']) ? $item['encode'] : $this->encodeLabels; | ||
273 | + $items[$i]['label'] = $encodeLabel ? Html::encode($item['label']) : $item['label']; | ||
274 | + $hasActiveChild = false; | ||
275 | + if (isset($item['items'])) { | ||
276 | + $items[$i]['items'] = $this->normalizeItems($item['items'], $hasActiveChild); | ||
277 | + if (empty($items[$i]['items']) && $this->hideEmptyItems) { | ||
278 | + unset($items[$i]['items']); | ||
279 | + if (!isset($item['url'])) { | ||
280 | + unset($items[$i]); | ||
281 | + continue; | ||
282 | + } | ||
283 | + } | ||
284 | + } | ||
285 | + if (!isset($item['active'])) { | ||
286 | + if ($this->activateParents && $hasActiveChild || $this->activateItems && $this->isItemActive($item)) { | ||
287 | + $active = $items[$i]['active'] = true; | ||
288 | + } else { | ||
289 | + $items[$i]['active'] = false; | ||
290 | + } | ||
291 | + } elseif ($item['active']) { | ||
292 | + $active = true; | ||
293 | + } | ||
294 | + } | ||
295 | + | ||
296 | + return array_values($items); | ||
297 | + } | ||
298 | + | ||
299 | + /** | ||
300 | + * Checks whether a menu item is active. | ||
301 | + * This is done by checking if [[route]] and [[params]] match that specified in the `url` option of the menu item. | ||
302 | + * When the `url` option of a menu item is specified in terms of an array, its first element is treated | ||
303 | + * as the route for the item and the rest of the elements are the associated parameters. | ||
304 | + * Only when its route and parameters match [[route]] and [[params]], respectively, will a menu item | ||
305 | + * be considered active. | ||
306 | + * @param array $item the menu item to be checked | ||
307 | + * @return boolean whether the menu item is active | ||
308 | + */ | ||
309 | + protected function isItemActive($item) | ||
310 | + { | ||
311 | + if (isset($item['url']) && is_array($item['url']) && isset($item['url'][0])) { | ||
312 | + $route = Yii::getAlias($item['url'][0]); | ||
313 | + if ($route[0] !== '/' && Yii::$app->controller) { | ||
314 | + $route = Yii::$app->controller->module->getUniqueId() . '/' . $route; | ||
315 | + } | ||
316 | + if (ltrim($route, '/') !== $this->route) { | ||
317 | + return false; | ||
318 | + } | ||
319 | + unset($item['url']['#']); | ||
320 | + if (count($item['url']) > 1) { | ||
321 | + $params = $item['url']; | ||
322 | + unset($params[0]); | ||
323 | + foreach ($params as $name => $value) { | ||
324 | + if ($value !== null && (!isset($this->params[$name]) || $this->params[$name] != $value)) { | ||
325 | + return false; | ||
326 | + } | ||
327 | + } | ||
328 | + } | ||
329 | + | ||
330 | + return true; | ||
331 | + } | ||
332 | + | ||
333 | + return false; | ||
334 | + } | ||
335 | +} |
frontend/widgets/FilterWidget.php
@@ -9,8 +9,8 @@ class FilterWidget extends Widget | @@ -9,8 +9,8 @@ class FilterWidget extends Widget | ||
9 | public $category; | 9 | public $category; |
10 | public $groups; | 10 | public $groups; |
11 | public $filter; | 11 | public $filter; |
12 | - public $brands; | ||
13 | public $priceLimits; | 12 | public $priceLimits; |
13 | + public $filterWhitoutPrice; | ||
14 | 14 | ||
15 | 15 | ||
16 | public function init(){ | 16 | public function init(){ |
@@ -27,8 +27,7 @@ class FilterWidget extends Widget | @@ -27,8 +27,7 @@ class FilterWidget extends Widget | ||
27 | 'category'=>$this->category, | 27 | 'category'=>$this->category, |
28 | 'groups'=>$this->groups, | 28 | 'groups'=>$this->groups, |
29 | 'filter'=>$this->filter, | 29 | 'filter'=>$this->filter, |
30 | - 'brands'=>$this->brands, | ||
31 | - 'priceLimits'=>$this->priceLimits | 30 | + 'priceLimits'=>$this->priceLimits, |
32 | ]); | 31 | ]); |
33 | 32 | ||
34 | } | 33 | } |
frontend/widgets/views/_filter_view.php
@@ -2,6 +2,8 @@ | @@ -2,6 +2,8 @@ | ||
2 | use common\modules\product\helpers\FilterHelper; | 2 | use common\modules\product\helpers\FilterHelper; |
3 | use yii\helpers\Url; | 3 | use yii\helpers\Url; |
4 | use yii\web\View; | 4 | use yii\web\View; |
5 | +use frontend\widgets\FilterList; | ||
6 | + | ||
5 | 7 | ||
6 | ?> | 8 | ?> |
7 | 9 | ||
@@ -23,36 +25,6 @@ use yii\web\View; | @@ -23,36 +25,6 @@ use yii\web\View; | ||
23 | 25 | ||
24 | 26 | ||
25 | <div class="filterCat"> | 27 | <div class="filterCat"> |
26 | - <?php if ($brands) :?> | ||
27 | - <div class="properties_block closed"> | ||
28 | - | ||
29 | - <div class="block_title"><i></i>Бренд</div> | ||
30 | - | ||
31 | - <ul class="chechboxes" style="display: none;"> | ||
32 | - <?php foreach($brands as $brand) : | ||
33 | - $checked = !empty($filter['brands']) && in_array($brand->alias, $filter['brands']); | ||
34 | - // | ||
35 | - $option_url = Url::to(['catalog/category', 'category' => $category, 'filters' => FilterHelper::getFilterForOption($filter, 'brands', $brand->alias, $checked)]); | ||
36 | - ?> | ||
37 | - <li> | ||
38 | - | ||
39 | - <input type="checkbox" onchange="document.location='<?= $option_url?>'" class="brands-option" <?= $checked ? ' checked' : ''?> /> | ||
40 | - <div> | ||
41 | - <label for="filter"> | ||
42 | - <a href="<?= $option_url?>"><?= $brand->name?></a> | ||
43 | - </label> | ||
44 | - </div> | ||
45 | - <div class="clearfix"></div> | ||
46 | - | ||
47 | - | ||
48 | - | ||
49 | - | ||
50 | - </li> | ||
51 | - <?php endforeach?> | ||
52 | - </ul> | ||
53 | - | ||
54 | - </div> | ||
55 | - <?php endif?> | ||
56 | <?php foreach($groups as $group_name => $group) :?> | 28 | <?php foreach($groups as $group_name => $group) :?> |
57 | <div class="properties_block closed"> | 29 | <div class="properties_block closed"> |
58 | 30 | ||
@@ -63,15 +35,14 @@ use yii\web\View; | @@ -63,15 +35,14 @@ use yii\web\View; | ||
63 | $checked = (isset($filter[$option['group_alias']]) && in_array($option['option_alias'], $filter[$option['group_alias']])); | 35 | $checked = (isset($filter[$option['group_alias']]) && in_array($option['option_alias'], $filter[$option['group_alias']])); |
64 | $option_url = Url::to(['catalog/category', 'category' => $category, 'filters' => FilterHelper::getFilterForOption($filter, $option['group_alias'], $option['option_alias'], $checked)]); | 36 | $option_url = Url::to(['catalog/category', 'category' => $category, 'filters' => FilterHelper::getFilterForOption($filter, $option['group_alias'], $option['option_alias'], $checked)]); |
65 | ?> | 37 | ?> |
66 | - <li> | 38 | + <li data-checked="<?= $checked ? ' true' : 'false'?>" data-filter='<?= isset($option['cacheKey'])?$option['cacheKey']:'' ?>'> |
67 | 39 | ||
68 | - <input type="checkbox" onchange="document.location='<?= $option_url?>'" class="features-option" <?= $checked ? ' checked' : ''?> /> | 40 | + <input type="checkbox" id="<?= $option['tax_option_id']?>" onchange='<?=$option_url ?>' class="features-option" <?= $checked ? ' checked' : ''?> /> |
69 | <div> | 41 | <div> |
70 | - <label for="filter3278"> | ||
71 | - <a href="<?= $option_url?>"><?= $option['value']?></a> | 42 | + <label for="#<?= $option['tax_option_id']?>"> |
43 | + <a class="filter-link" href="<?= $option_url?>"><?= $option['value']?> <span></span></a> | ||
72 | </label> | 44 | </label> |
73 | </div> | 45 | </div> |
74 | - <div class="clearfix"></div> | ||
75 | 46 | ||
76 | </li> | 47 | </li> |
77 | <?php endforeach?> | 48 | <?php endforeach?> |
@@ -82,8 +53,22 @@ use yii\web\View; | @@ -82,8 +53,22 @@ use yii\web\View; | ||
82 | </div> | 53 | </div> |
83 | <?php endforeach?> | 54 | <?php endforeach?> |
84 | 55 | ||
85 | - <?php if ($priceLimits['min'] < $priceLimits['max']) :?> | ||
86 | - <div class="properties_block"> | 56 | + <?php if ($priceLimits['min'] < $priceLimits['max']) : |
57 | + | ||
58 | + $filterWhitoutPrice = $filter; | ||
59 | + $filterWhitoutPrice['prices'] = [ | ||
60 | + 'min' => '{from}', | ||
61 | + 'max' => '{to}', | ||
62 | + ]; | ||
63 | + | ||
64 | + ?> | ||
65 | + <div id="price_block" class="properties_block" | ||
66 | + data-min="<?=$priceLimits['min']?>" | ||
67 | + data-max="<?=$priceLimits['max']?>" | ||
68 | + data-from="<?=((isset($filter['prices']) && !empty($filter['prices']['min'])) ? $filter['prices']['min'] : $priceLimits['min'])?>" | ||
69 | + data-to="<?=(( isset($filter['prices']) && !empty($filter['prices']['max'])) ? $filter['prices']['max'] : $priceLimits['max'])?>" | ||
70 | + data-url="<?= Url::to(['catalog/category','category' => $category,'filters' => $filterWhitoutPrice])?>" | ||
71 | + > | ||
87 | <div class="block_title"><i></i>Цена</div> | 72 | <div class="block_title"><i></i>Цена</div> |
88 | <div class="price_filter first_price_li"> | 73 | <div class="price_filter first_price_li"> |
89 | <div class="price_slider"> | 74 | <div class="price_slider"> |
@@ -99,120 +84,11 @@ use yii\web\View; | @@ -99,120 +84,11 @@ use yii\web\View; | ||
99 | 84 | ||
100 | </div> | 85 | </div> |
101 | 86 | ||
102 | - | ||
103 | - | ||
104 | - | ||
105 | - | ||
106 | </div> | 87 | </div> |
107 | 88 | ||
108 | </div> | 89 | </div> |
109 | 90 | ||
110 | </div> | 91 | </div> |
111 | 92 | ||
112 | -<?php | ||
113 | - | ||
114 | -$js = " | ||
115 | - | ||
116 | - | ||
117 | - | ||
118 | - $('.properties_block').each(function(){ | ||
119 | - var block = $(this); | ||
120 | - $(this).find('input[type=checkbox]').each(function(){ | ||
121 | - if(this.checked){ | ||
122 | - block.removeClass('closed').addClass('opened'); | ||
123 | - block.find('ul').css({\"display\":\"block\"}) | ||
124 | - return true; | ||
125 | - } | ||
126 | - | ||
127 | - }); | ||
128 | - | ||
129 | - }); | ||
130 | - | ||
131 | - $('#finput').keyup(function() { | ||
132 | - | ||
133 | - var empty = false; | ||
134 | - $('#finput').each(function() { | ||
135 | - if ($(this).val() == '') { | ||
136 | - empty = true; | ||
137 | - } | ||
138 | - }); | ||
139 | - | ||
140 | - if (empty) { | ||
141 | - $('.sok').attr('disabled', 'disabled').css('display','none'); | ||
142 | - } else { | ||
143 | - $('.sok').removeAttr('disabled').css('display','inline-block'); | ||
144 | - } | ||
145 | - | ||
146 | - }); | ||
147 | - | ||
148 | - | ||
149 | - | ||
150 | - | ||
151 | - | ||
152 | - | ||
153 | - $('.price_tooltip_close').on('click',function(){ | ||
154 | - $(this).parent().hide(); | ||
155 | - }); | ||
156 | - | ||
157 | - $('.pok').click(function(event) { | ||
158 | - url = $('#purl').val(); | ||
159 | - price_min = $('#min_price').val(); | ||
160 | - price_max = $('#max_price').val(); | ||
161 | - | ||
162 | - document.location.href = url + \"&pmin=\" + price_min + \"&pmax=\" + price_max; | ||
163 | - }); | ||
164 | - | ||
165 | - $('.sok').click(function(event) { | ||
166 | - if ($('#finput').val() != \"Артикул\" && $('#finput').val() != \"\") { | ||
167 | - | ||
168 | - | ||
169 | - document.location.href = \"/search/main?word=\"+$('#finput').val(); | ||
170 | - | ||
171 | - | ||
172 | - } | ||
173 | - }); | ||
174 | - | ||
175 | - "; | ||
176 | - $this->registerJs($js, | ||
177 | - View::POS_LOAD | ||
178 | - ); | ||
179 | - | ||
180 | - | ||
181 | - if ($priceLimits['min'] < $priceLimits['max']){ | ||
182 | - | ||
183 | - $filterWhitoutPrice = $filter; | ||
184 | - $filterWhitoutPrice['prices'] = [ | ||
185 | - 'min' => '{from}', | ||
186 | - 'max' => '{to}', | ||
187 | - ]; | ||
188 | - | ||
189 | - $js = " | ||
190 | - | ||
191 | - | ||
192 | - | ||
193 | - $('#price_interval').ionRangeSlider({ | ||
194 | - type: 'double', | ||
195 | - min: {$priceLimits['min']}, | ||
196 | - max: {$priceLimits['max']}, | ||
197 | - from: ".((isset($filter['prices']) && !empty($filter['prices']['min'])) ? $filter['prices']['min'] : $priceLimits['min']) .", | ||
198 | - to: ". ((isset($filter['prices']) && !empty($filter['prices']['max'])) ? $filter['prices']['max'] : $priceLimits['max']) .", | ||
199 | - grid: false, | ||
200 | - onFinish: function(e) { | ||
201 | - var url = '" . Url::to([ | ||
202 | - 'catalog/category', | ||
203 | - 'category' => $category, | ||
204 | - 'filters' => $filterWhitoutPrice | ||
205 | - ])."'; | ||
206 | - var from = e.from; | ||
207 | - var to = e.to; | ||
208 | - document.location = url.replace('{from}', from).replace('{to}', to); | ||
209 | - } | ||
210 | - }); | ||
211 | 93 | ||
212 | - "; | ||
213 | - $this->registerJs($js, | ||
214 | - View::POS_READY | ||
215 | - ); | ||
216 | - } | ||
217 | - ?> | ||
218 | 94 |