3f2bc3d0
Administrator
first commit
|
1
2
3
4
|
<?php
namespace common\modules\product;
|
1b898c16
Administrator
20.07.16
|
5
|
use common\modules\product\helpers\FilterHelper;
|
3f2bc3d0
Administrator
first commit
|
6
|
use common\modules\product\models\Brand;
|
38828295
Karnovsky A
-
|
7
|
use common\modules\product\models\BrandSearch;
|
3f2bc3d0
Administrator
first commit
|
8
9
10
11
12
|
use common\modules\product\models\CategorySearch;
use common\modules\product\models\ProductSearch;
use common\modules\rubrication\models\TaxOption;
use Yii;
use yii\helpers\Url;
|
3918480b
Karnovsky A
UrlManager
|
13
|
use yii\web\HttpException;
|
3f2bc3d0
Administrator
first commit
|
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
use yii\web\UrlRuleInterface;
class CatalogUrlManager implements UrlRuleInterface {
public $route_map = [];
public $option_prefix = 'o:';
/**
* Parses the given request and returns the corresponding route and parameters.
* @param \yii\web\UrlManager $manager the URL manager
* @param \yii\web\Request $request the request component
* @return array|boolean the parsing result. The route and the parameters are returned as an array.
* If false, it means this rule cannot be used to parse this path info.
*/
public function parseRequest($manager, $request)
{
$pathInfo = $request->getPathInfo();
$paths = explode('/', $pathInfo);
if (!array_key_exists($paths[0], $this->route_map)) {
return false;
}
$params = [];
if ($paths[0] == 'catalog') {
$route = 'catalog/category';
// Category
if (!empty($paths[1])) {
$category = CategorySearch::findByAlias($paths[1]);
if (empty($category)) {
http_redirect(Url::to(['/']));
}
$params['category'] = $category;
}
if (!empty($paths[2])) {
// Filter
|
1b898c16
Administrator
20.07.16
|
49
50
|
if (strpos($paths[2], 'filters:') === 0) {
|
868680ca
Karnovsky A
-
|
51
|
$this->parseFilter($paths[2], $params);
|
0f852b51
Administrator
29.06.16
|
52
|
}
|
1b898c16
Administrator
20.07.16
|
53
54
55
|
else if(strpos($paths[2], 'filter:') === 0){
$this->parseOldFilter($paths[2], $params);
//['catalog/category', 'category' => $category, 'filters' =>$params['filter']]
|
ed62b6ee
Administrator
20.07.16
|
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
$optionsTemplate = FilterHelper::optionsTemplate();
array_unshift($optionsTemplate, "special", "brands");
$filterView = [];
foreach($optionsTemplate as $optionKey){
if(isset($params['filter'][$optionKey])){
$filterView[$optionKey] = $params['filter'][$optionKey];
}
}
Yii::$app->response->redirect(['catalog/category', 'category' => $category, 'filters' =>$filterView],301);
|
1b898c16
Administrator
20.07.16
|
70
|
}
|
a3b7905e
Karnovsky A
UrlManager
|
71
72
73
|
else {
throw new HttpException(404 ,'Page not found');
}
|
3f2bc3d0
Administrator
first commit
|
74
75
|
}
} elseif ($paths[0] == 'product') {
|
4365261e
Karnovsky A
UrlManager
|
76
77
78
|
if (!empty($paths[2])) {
throw new HttpException(404 ,'Page not found');
}
|
3f2bc3d0
Administrator
first commit
|
79
80
81
82
83
84
85
86
|
$product = ProductSearch::findByAlias($paths[1]);
if (empty($product->product_id)) {
throw new HttpException(404 ,'Page not found');
}
$route = 'catalog/product';
$params = [
'product' => $product,
];
|
38828295
Karnovsky A
-
|
87
88
89
90
|
} elseif ($paths[0] == 'brands') {
if (empty($paths[1]) || $paths[1] == 'index') {
$route = 'catalog/brands';
} elseif (($brand = BrandSearch::findByAlias($paths[1]))) {
|
868680ca
Karnovsky A
-
|
91
|
$route = 'catalog/brand';
|
38828295
Karnovsky A
-
|
92
|
$params['brand'] = $brand;
|
868680ca
Karnovsky A
-
|
93
94
|
if (!empty($paths[2])) {
// Filter
|
1b898c16
Administrator
20.07.16
|
95
|
if (strpos($paths[2], 'filters:') === 0) {
|
868680ca
Karnovsky A
-
|
96
97
98
|
$this->parseFilter($paths[2], $params);
}
}
|
38828295
Karnovsky A
-
|
99
100
101
|
} else {
// @todo redirect or return FALSE
}
|
3f2bc3d0
Administrator
first commit
|
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
}
return [$route, $params];
}
/**
* Creates a URL according to the given route and parameters.
* @param \yii\web\UrlManager $manager the URL manager
* @param string $route the route. It should not have slashes at the beginning or the end.
* @param array $params the parameters
* @return string|boolean the created URL, or false if this rule cannot be used for creating this URL.
*/
public function createUrl($manager, $route, $params)
{
if (!in_array($route, $this->route_map)) {
return false;
}
switch($route) {
case 'catalog/category':
if (!empty($params['category'])) {
$category_alias = is_object($params['category']) ? $params['category']->alias : strtolower($params['category']);
$url = 'catalog/'. $category_alias .'/';
} else {
$url = 'catalog/';
}
|
3f2bc3d0
Administrator
first commit
|
127
|
|
868680ca
Karnovsky A
-
|
128
|
$this->setFilterUrl($params, $url);
|
3f2bc3d0
Administrator
first commit
|
129
|
|
9d539ac3
Karnovsky A
Brands and option...
|
130
131
132
133
134
135
|
foreach ($params as $key => $param) {
if (empty($params[$key])) {
unset($params[$key]);
}
}
|
ccc7a9d3
Karnovsky A
Karnovsky 12052016
|
136
137
138
139
|
if (!empty($params) && ($query = http_build_query($params)) !== '') {
$url .= '?' . $query;
}
|
3f2bc3d0
Administrator
first commit
|
140
141
142
143
144
145
146
147
|
return $url;
break;
case 'catalog/product':
if (!empty($params['product'])) {
$product_alias = is_object($params['product']) ? $params['product']->alias : strtolower($params['product']);
}
$url = 'product/'. $product_alias;
|
ccc7a9d3
Karnovsky A
Karnovsky 12052016
|
148
149
150
151
152
|
if (!empty($params) && ($query = http_build_query($params)) !== '') {
$url .= '?' . $query;
}
|
3f2bc3d0
Administrator
first commit
|
153
154
|
return $url;
break;
|
38828295
Karnovsky A
-
|
155
156
157
158
159
160
161
|
case 'catalog/brands':
if (empty($params['brand'])) {
return 'brands';
} else {
$brand_alias = is_object($params['brand']) ? $params['brand']->alias : strtolower($params['brand']);
}
|
868680ca
Karnovsky A
-
|
162
163
164
|
$url = 'brands/'. $brand_alias .'/';
$this->setFilterUrl($params, $url);
|
38828295
Karnovsky A
-
|
165
166
167
168
169
170
171
|
if (!empty($params) && ($query = http_build_query($params)) !== '') {
$url .= '?' . $query;
}
return $url;
break;
|
3f2bc3d0
Administrator
first commit
|
172
173
174
175
176
177
|
}
}
private function option_value_encode($value) {
return str_replace(array(',', '/'), array('~', '&s;'), $value);
}
|
868680ca
Karnovsky A
-
|
178
179
180
|
private function setFilterUrl(&$params, &$url) {
$filter = [];
|
1b898c16
Administrator
20.07.16
|
181
182
|
if (!empty($params['filters'])) {
foreach ($params['filters'] as $key => $values) {
|
868680ca
Karnovsky A
-
|
183
184
185
186
187
|
switch($key) {
case 'prices':
$filter[] = $key .'='. implode(':', $values);
break;
|
1b898c16
Administrator
20.07.16
|
188
189
190
191
192
193
194
195
196
197
198
|
// case 'options':
// foreach($values as $group => &$value_items) {
// foreach($value_items as &$value_item) {
// $value_item = $this->option_value_encode($value_item);
// if (empty($value_item)) {
// unset($value_item);
// }
// }
// $filter[] = $this->option_prefix. $group .'='. implode(',', $value_items);
// }
// break;
|
868680ca
Karnovsky A
-
|
199
200
201
202
203
204
205
206
207
208
209
210
|
default:
foreach($values as &$value) {
$value = $this->option_value_encode($value);
if (empty($value)) {
unset($value);
}
}
$filter[] = $key .'='. implode(',', $values);
break;
}
}
|
9d539ac3
Karnovsky A
Brands and option...
|
211
|
if (!empty($filter)) {
|
1b898c16
Administrator
20.07.16
|
212
|
$url .= 'filters:'. implode(';', $filter);
|
9d539ac3
Karnovsky A
Brands and option...
|
213
|
}
|
1b898c16
Administrator
20.07.16
|
214
|
unset($params['filters']);
|
868680ca
Karnovsky A
-
|
215
216
217
218
|
}
}
private function parseFilter($paths, &$params) {
|
1b898c16
Administrator
20.07.16
|
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
|
$params['filters'] = [];
$filter_str = substr($paths, 8);
$filter_options = explode(';', $filter_str);
foreach ($filter_options as $filter_option) {
if (empty($filter_option)) {
continue;
}
list($filter_key, $filter_option) = explode('=', $filter_option);
if($filter_key == 'prices') { // price-interval section
$prices = explode(':', $filter_option);
$params['filters'][$filter_key] = [
'min' => floatval($prices[0]),
'max' => floatval($prices[1]),
];
}
else { // brands and other sections
$params['filters'][$filter_key] = explode(',', $filter_option);
}
}
}
private function parseOldFilter($paths, &$params) {
|
868680ca
Karnovsky A
-
|
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
$params['filter'] = [];
$filter_str = substr($paths, 7);
$filter_options = explode(';', $filter_str);
foreach ($filter_options as $filter_option) {
if (empty($filter_option)) {
continue;
}
list($filter_key, $filter_option) = explode('=', $filter_option);
if($filter_key == 'prices') { // price-interval section
$prices = explode(':', $filter_option);
$params['filter'][$filter_key] = [
'min' => floatval($prices[0]),
'max' => floatval($prices[1]),
];
|
1b898c16
Administrator
20.07.16
|
257
258
259
260
261
|
}
elseif (strpos($filter_key, $this->option_prefix) === 0) { // options section
$params['filter'][substr($filter_key, 2)] = explode(',', $filter_option);
}
else { // brands and other sections
|
868680ca
Karnovsky A
-
|
262
263
264
265
|
$params['filter'][$filter_key] = explode(',', $filter_option);
}
}
}
|
3f2bc3d0
Administrator
first commit
|
266
|
}
|