Commit ab917b7436f86e52d80f204b5ec2a14e41312c25
1 parent
58552c89
Import
Showing
3 changed files
with
111 additions
and
465 deletions
Show diff stats
common/modules/product/controllers/ManageController.php
@@ -268,15 +268,23 @@ class ManageController extends Controller | @@ -268,15 +268,23 @@ class ManageController extends Controller | ||
268 | if ($model->load(Yii::$app->request->post())) { | 268 | if ($model->load(Yii::$app->request->post())) { |
269 | $file = UploadedFile::getInstances($model, 'file'); | 269 | $file = UploadedFile::getInstances($model, 'file'); |
270 | $method = 'go'. ucfirst($model->type); | 270 | $method = 'go'. ucfirst($model->type); |
271 | + $target = Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFile'. ucfirst($model->type)); | ||
271 | if (empty($file)) { | 272 | if (empty($file)) { |
272 | $model->errors[] = 'File not upload'; | 273 | $model->errors[] = 'File not upload'; |
273 | } elseif ($method == 'goPrices' && $file[0]->name != 'file_1.csv') { | 274 | } elseif ($method == 'goPrices' && $file[0]->name != 'file_1.csv') { |
274 | $model->errors[] = 'File need "file_1.csv"'; | 275 | $model->errors[] = 'File need "file_1.csv"'; |
275 | } elseif ($method == 'goProducts' && $file[0]->name == 'file_1.csv') { | 276 | } elseif ($method == 'goProducts' && $file[0]->name == 'file_1.csv') { |
276 | $model->errors[] = 'File can not "file_1.csv"'; | 277 | $model->errors[] = 'File can not "file_1.csv"'; |
277 | - } elseif ($model->validate()) { | ||
278 | - $file[0]->saveAs(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFile'. ucfirst($model->type))); | ||
279 | - $model->$method(); | 278 | + } elseif ($model->validate() && $file[0]->saveAs($target)) { |
279 | + // PROCESS PAGE | ||
280 | + return $this->render('import-process', [ | ||
281 | + 'model' => $model, | ||
282 | + 'method' => $model->type, | ||
283 | + 'target' => $target, | ||
284 | + ]); | ||
285 | +// $model->$method(); | ||
286 | + } else { | ||
287 | + $model->errors[] = 'File can not be upload or other error'; | ||
280 | } | 288 | } |
281 | } | 289 | } |
282 | 290 | ||
@@ -285,6 +293,28 @@ class ManageController extends Controller | @@ -285,6 +293,28 @@ class ManageController extends Controller | ||
285 | ]); | 293 | ]); |
286 | } | 294 | } |
287 | 295 | ||
296 | + public function actionProducts() { | ||
297 | + $from = Yii::$app->request->get('from', 0); | ||
298 | + | ||
299 | + $model = new Import(); | ||
300 | + | ||
301 | + if (Yii::$app->request->isAjax) { | ||
302 | + Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
303 | + return $model->goProducts($from, 10); | ||
304 | + } | ||
305 | + } | ||
306 | + | ||
307 | + public function actionPrices() { | ||
308 | + $from = Yii::$app->request->get('from', 0); | ||
309 | + | ||
310 | + $model = new Import(); | ||
311 | + | ||
312 | + if (Yii::$app->request->isAjax) { | ||
313 | + Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
314 | + return $model->goPrices($from, 10); | ||
315 | + } | ||
316 | + } | ||
317 | + | ||
288 | public function actionExport() { | 318 | public function actionExport() { |
289 | $model = new Export(); | 319 | $model = new Export(); |
290 | if (($file = $model->process(Yii::getAlias('@uploadDir')))) { | 320 | if (($file = $model->process(Yii::getAlias('@uploadDir')))) { |
common/modules/product/views/manage/import-process.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\widgets\ActiveForm; | ||
5 | + | ||
6 | +$this->registerJs(" | ||
7 | + | ||
8 | +"); | ||
9 | +?> | ||
10 | + | ||
11 | +<script type="text/javascript"> | ||
12 | + jQuery(document).ready(function () { | ||
13 | + var in_process=false; | ||
14 | + var count=1; | ||
15 | + | ||
16 | + in_process=true; | ||
17 | + | ||
18 | + doImport(); | ||
19 | + | ||
20 | +// $('ul#process-result').prepend('<li style="color: green; font-weight: bold">Импорт завершен</li>'); | ||
21 | + | ||
22 | + function doImport(from) { | ||
23 | + from = typeof(from) != 'undefined' ? from : 0; | ||
24 | + console.log('go', from); | ||
25 | + $.ajax({ | ||
26 | + url: "<?= Yii::$app->request->baseUrl .'/product/manage/'. $method?>", | ||
27 | + data: {from:from}, | ||
28 | + dataType: 'json', | ||
29 | + success: function(data){ | ||
30 | + for(var key in data.items) | ||
31 | + { | ||
32 | + $('ul#process-result').prepend('<li>'+ data.items[key] +'</li>'); | ||
33 | + count++; | ||
34 | + } | ||
35 | + | ||
36 | + var per = Math.round(100*data.from/data.totalsize)+'%'; | ||
37 | + $('#progressbar div').css({width: per}); | ||
38 | +// $('#progressbar .ui-progressbar-value').html(per); | ||
39 | + | ||
40 | + if(data != false && !data.end) | ||
41 | + { | ||
42 | + doImport(data.from); | ||
43 | + } | ||
44 | + else | ||
45 | + { | ||
46 | + progressbar.hide('fast'); | ||
47 | + in_process = false; | ||
48 | + } | ||
49 | + }, | ||
50 | + error: function(xhr, status, errorThrown) { | ||
51 | + alert(errorThrown+'\n'+xhr.responseText); | ||
52 | + } | ||
53 | + }); | ||
54 | + } | ||
55 | + | ||
56 | + }); | ||
57 | +</script> | ||
58 | + | ||
59 | +<div class="product-import-process-form"> | ||
60 | + <h1>Импорт <?= $method == 'prices' ? 'цен' : 'данных'?> товаров</h1> | ||
61 | + | ||
62 | + <?= \yii\jui\ProgressBar::widget([ | ||
63 | + 'clientOptions' => [ | ||
64 | + 'value' => 100, | ||
65 | + 'label' => 'ddd' | ||
66 | + ], | ||
67 | + 'options' => [ | ||
68 | + 'id' => 'progressbar' | ||
69 | + ], | ||
70 | + ]);?> | ||
71 | + <ul id="process-result"></ul> | ||
72 | +</div> |
console/controllers/ImportController.php
@@ -4,6 +4,7 @@ namespace console\controllers; | @@ -4,6 +4,7 @@ namespace console\controllers; | ||
4 | 4 | ||
5 | use common\modules\product\models\Category; | 5 | use common\modules\product\models\Category; |
6 | use common\modules\product\models\CategoryName; | 6 | use common\modules\product\models\CategoryName; |
7 | +use common\modules\product\models\Import; | ||
7 | use common\modules\product\models\ProductImage; | 8 | use common\modules\product\models\ProductImage; |
8 | use common\modules\product\models\ProductVariantType; | 9 | use common\modules\product\models\ProductVariantType; |
9 | use common\modules\product\models\Stock; | 10 | use common\modules\product\models\Stock; |
@@ -28,473 +29,16 @@ class ImportController extends Controller { | @@ -28,473 +29,16 @@ class ImportController extends Controller { | ||
28 | return fopen ($filename, 'r'); | 29 | return fopen ($filename, 'r'); |
29 | } | 30 | } |
30 | 31 | ||
31 | - public function actionIndex() { | ||
32 | - $new_products = $linked_products = 0; | ||
33 | - | ||
34 | - $db = yii::$app->db; | ||
35 | - | ||
36 | - if ( !($handle = $this->getProductsFile()) ) { | ||
37 | - return Controller::EXIT_CODE_ERROR; | ||
38 | - } | ||
39 | - | ||
40 | - $j = 0; | ||
41 | - | ||
42 | - while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE) | ||
43 | - { | ||
44 | - $j++; | ||
45 | - | ||
46 | - foreach ($data as &$value) | ||
47 | - { | ||
48 | - //$value = mb_convert_encoding ($value, "UTF-8", mb_detect_encoding ($value)); | ||
49 | - $value = iconv ('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value); | ||
50 | - $value = trim ($value); | ||
51 | - } | ||
52 | - | ||
53 | - // будет всегда 19 элементов | ||
54 | - for ($i = 0; $i <= 18; $i++) | ||
55 | - { | ||
56 | - if (! isset ($data[$i])) | ||
57 | - { | ||
58 | - $data[$i] = null; | ||
59 | - } | ||
60 | - } | ||
61 | - | ||
62 | - // 1 Группа (категория) | ||
63 | - $catalog_name = $data[0]; | ||
64 | - if (empty ($catalog_name)) | ||
65 | - { | ||
66 | - CONTINUE; | ||
67 | - } | ||
68 | - | ||
69 | - // 2 Бренд | ||
70 | - $brand_name = $data[1]; | ||
71 | - if (empty ($brand_name)) | ||
72 | - { | ||
73 | - CONTINUE; | ||
74 | - } | ||
75 | - | ||
76 | - // 3 Название товара | ||
77 | - $product_name = $data[2]; | ||
78 | - if (empty ($product_name)) | ||
79 | - { | ||
80 | - CONTINUE; | ||
81 | - } | ||
82 | - | ||
83 | - // 4 Описание Укр | ||
84 | - $product_body_uk = $data[3]; | ||
85 | - | ||
86 | - // 5 Описание Рус | ||
87 | - $product_body_ru = $data[4]; | ||
88 | - | ||
89 | - // 6 Фильтр (через запятую) | ||
90 | - $filters = explode (',', $data[5]); | ||
91 | - | ||
92 | - // 7 Доп фильтр через запятую | ||
93 | - $filters_extra = explode (',', $data[6]); | ||
94 | - | ||
95 | - // 8 Пол череззапятую (мужской, женский, детский, унисекс) | ||
96 | - $gender = explode (',', $data[7]); | ||
97 | - | ||
98 | - // 9 Год | ||
99 | - $years = explode (',', $data[8]); | ||
100 | - | ||
101 | - // 10 Цена старая | ||
102 | - $product_cost_old = $data[10]; | ||
103 | - | ||
104 | - // 11 Цена | ||
105 | - $product_cost = $data[9]; | ||
106 | - | ||
107 | - // 12 Акция | ||
108 | - $product_akciya = (bool)$data[11]; | ||
109 | - | ||
110 | - // 13 Сопуд. Тов. | ||
111 | - $similar = explode (',', $data[12]); | ||
112 | - | ||
113 | - // 14 Новинки | ||
114 | - $product_new = (bool)$data[13]; | ||
115 | - | ||
116 | - // 15 Топ продаж | ||
117 | - $product_top = (bool)$data[14]; | ||
118 | - | ||
119 | - // 16 Сетка Характеристик | ||
120 | - $feature = explode ('=', $data[15]); | ||
121 | - | ||
122 | - // 17 ВИДЕО КОД | ||
123 | - $product_video = $data[16]; | ||
124 | - | ||
125 | - // 18 Галлерея фото | ||
126 | - $fotos = explode (',', $data[17]); | ||
127 | - | ||
128 | - // 19 Штрих код товара. | ||
129 | - // расшифровал - это модификации товара! | ||
130 | - | ||
131 | - $product_image = explode ('=', $data[18]); | ||
132 | - $product_image = @$product_image[3]; | ||
133 | - | ||
134 | - if ( ($_product = Product::find()->filterWhere(['ilike', 'name', trim($product_name)])->one()) === null ) { | ||
135 | - $_product = new Product(); | ||
136 | - } | ||
137 | - | ||
138 | - $is_new_product = empty($_product->product_id); | ||
139 | - | ||
140 | - // ==== Set category ==== | ||
141 | - if ( ($category = CategoryName::find()->filterWhere(['ilike', 'value', trim($catalog_name)])->one()) === null ) { | ||
142 | - // Create category | ||
143 | - $category = new Category(); | ||
144 | - $category->name = trim($catalog_name); | ||
145 | - $category->save(); | ||
146 | - } | ||
147 | - $_product->categories = [$category->category_id]; | ||
148 | - | ||
149 | - // ===== Set brand ==== | ||
150 | - if ( $brand_name ) { | ||
151 | - if ( ($brand = BrandName::find()->filterWhere(['ilike', 'value', trim($brand_name)])->one()) !== null ) { | ||
152 | - $_product->brand_id = $brand->brand_id; | ||
153 | - } else { | ||
154 | - // Create brand | ||
155 | - $brand = new Brand(); | ||
156 | - $brand->name = trim($brand_name); | ||
157 | - $brand->save(); | ||
158 | - $_product->brand_id = $brand->brand_id; | ||
159 | - } | ||
160 | - } | ||
161 | - | ||
162 | - $_product->name = $product_name; | ||
163 | - $_product->video = $product_video; | ||
164 | - $_product->description = $product_body_ru; | ||
165 | - $_product->is_top = $product_top; | ||
166 | - $_product->akciya = $product_akciya; | ||
167 | - $_product->is_new = $product_new; | ||
168 | - | ||
169 | - if (!$_product->save()) { | ||
170 | - var_dump($category->category_id, $_product->categories);exit; | ||
171 | - } | ||
172 | - | ||
173 | - | ||
174 | - // @todo Set image | ||
175 | - /*// картинки | ||
176 | - if (is_file ($dir.'/mod/' . $product_image)) | ||
177 | - { | ||
178 | - $resizeObj = new resize ($dir.'/mod/' . $product_image); | ||
179 | - $resizeObj->resizeImage (135, 200, 'auto'); | ||
180 | - $resizeObj->saveImage ($dir.'/products/ico/' . $product_image, 100); | ||
181 | - $resizeObj->resizeImage (370, 370, 'auto'); | ||
182 | - $resizeObj->saveImage ($dir.'/products/big/' . $product_image, 100); | ||
183 | - }*/ | ||
184 | - | ||
185 | - // ==== mods ==== | ||
186 | - | ||
187 | - // (типа штрих код товара) | ||
188 | - | ||
189 | - // нужно для проставления характеристик относящихся к модификациям | ||
190 | - $MOD_ARRAY = []; | ||
191 | - | ||
192 | - for ($i = 18; $i < count ($data); $i ++) | ||
193 | - { | ||
194 | - if (! empty ($data[$i])) | ||
195 | - { | ||
196 | - $mod_arr = explode ('=', $data[$i]); | ||
197 | - $mod_art = $mod_arr[0]; | ||
198 | - $mod_size = $mod_arr[1]; | ||
199 | - $mod_color = $mod_arr[2]; | ||
200 | - $mod_image = $mod_arr[3]; | ||
201 | - $mod_cost = floatval($product_cost); | ||
202 | - $mod_old_cost = floatval($product_cost_old); | ||
203 | - | ||
204 | - // Check product variant | ||
205 | - if ( ($_productVariant = ProductVariant::find()->andFilterWhere(['ilike', 'sku', $mod_art])->andFilterWhere(['product_id' => $_product->product_id])->one()) === null ) { | ||
206 | - $_productVariant = new ProductVariant(); | ||
207 | - $_productVariant->product_id = $_product->product_id; | ||
208 | - } | ||
209 | - $_productVariant->product_unit_id = 1; | ||
210 | - | ||
211 | - $_productVariant->sku = $mod_art; | ||
212 | - $_productVariant->price = $mod_cost; | ||
213 | - $_productVariant->price_old = $mod_old_cost; | ||
214 | - $_productVariant->stock = 1; | ||
215 | - | ||
216 | - $product_variant_type_name = ''; | ||
217 | - if (! empty ($mod_color)) { | ||
218 | - $product_variant_type_name = 'Цвет'; | ||
219 | - $_productVariant->name = $mod_color; | ||
220 | - } | ||
221 | - elseif (! empty ($mod_size)) { | ||
222 | - $product_variant_type_name = 'Размер'; | ||
223 | - $_productVariant->name = $mod_size; | ||
224 | - } | ||
225 | - | ||
226 | - // ===== Set variant type ==== | ||
227 | - if ( $product_variant_type_name ) { | ||
228 | - if ( ($product_variant_type = ProductVariantType::find()->filterWhere(['ilike', 'name', $product_variant_type_name])->one()) !== null ) { | ||
229 | - $_productVariant->product_variant_type_id = $product_variant_type->product_variant_type_id; | ||
230 | - } else { | ||
231 | - $product_variant_type = new ProductVariantType(); | ||
232 | - $product_variant_type->name = $product_variant_type_name; | ||
233 | - $product_variant_type->save(); | ||
234 | - $_productVariant->product_variant_type_id = $product_variant_type->product_variant_type_id; | ||
235 | - } | ||
236 | - } | ||
237 | - $_productVariant->save(false); | ||
238 | -// if (!$_productVariant->save(false)) { | ||
239 | -//// $this->stdout("$j: Product {$_product->name} #{$_product->product_id} NOT saved (". ($is_new_product ? 'new product' : 'exists product') .")\n"); | ||
240 | -//// var_dump($_productVariant);exit; | ||
241 | -// continue; | ||
242 | -// } | ||
243 | - | ||
244 | -// if ($mod_art == '610934725148') { | ||
245 | -// var_dump($_productVariant); | ||
246 | -// exit; | ||
247 | -// } | ||
248 | - | ||
249 | - $MOD_ARRAY[] = $_productVariant->product_variant_id; | ||
250 | - | ||
251 | - if ($mod_image) { | ||
252 | - $url = 'http://rukzachok.com.ua/upload/mod/' . urlencode($mod_image); | ||
253 | - $image = @file_get_contents($url); | ||
254 | - if ($image) { | ||
255 | - if (($variantImage = ProductImage::find()->andFilterWhere(['ilike', 'image', $mod_image])->andFilterWhere(['product_variant_id' => $_productVariant->product_variant_id])->one()) === null) { | ||
256 | - file_put_contents(Yii::getAlias('@productsDir') . "/" . $mod_image, $image); | ||
257 | - $variantImage = new ProductImage(); | ||
258 | - $variantImage->product_id = $_product->product_id; | ||
259 | - $variantImage->product_variant_id = $_productVariant->product_variant_id; | ||
260 | - $variantImage->image = $mod_image; | ||
261 | - $variantImage->save(); | ||
262 | - } | ||
263 | - } | ||
264 | - } | ||
265 | - } | ||
266 | - } | ||
267 | - | ||
268 | - /*// ==== fotos ==== | ||
269 | - | ||
270 | - foreach ($fotos as $foto) | ||
271 | - { | ||
272 | - $fields = [ | ||
273 | - 'product_id' => $product_id, | ||
274 | - 'image' => $foto | ||
275 | - ]; | ||
276 | - | ||
277 | - $modelFotos = Fotos::find () | ||
278 | - ->where ('image=:image', [ | ||
279 | - ':image' => $foto | ||
280 | - ]) | ||
281 | - ->one (); | ||
282 | - | ||
283 | - if (empty ($modelFotos->id)) | ||
284 | - { | ||
285 | - $db->createCommand () | ||
286 | - ->insert ('products_fotos', $fields) | ||
287 | - ->execute (); | ||
288 | - } | ||
289 | - else | ||
290 | - { | ||
291 | - $db->createCommand () | ||
292 | - ->update ('products_fotos', $fields, 'id = ' . $modelFotos->id) | ||
293 | - ->execute (); | ||
294 | - } | ||
295 | - | ||
296 | - if (is_file ($dir.'/fotos/' . $foto)) | ||
297 | - { | ||
298 | - $resizeObj = new resize ($dir.'/fotos/' . $foto); | ||
299 | - $resizeObj->resizeImage (100, 100, 'crop'); | ||
300 | - $resizeObj->saveImage ($dir.'/fotos/ico/' . $foto, 100); | ||
301 | - $resizeObj->resizeImage (400, 400, 'crop'); | ||
302 | - $resizeObj->saveImage ($dir.'/fotos/big/' . $foto, 100); | ||
303 | - } | ||
304 | - }*/ | ||
305 | - | ||
306 | - $options = []; | ||
307 | - | ||
308 | - if (! empty ($filters)) { | ||
309 | - // Set Naznachenie (tax_group_id = 20) | ||
310 | - foreach($filters as $filter) { | ||
311 | - $filter = trim($filter); | ||
312 | - if (!$filter) { | ||
313 | - continue; | ||
314 | - } | ||
315 | - if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => 20])->one()) === null ) { | ||
316 | - // Create option | ||
317 | - $option = new TaxOption(); | ||
318 | - $option->tax_group_id = 20; | ||
319 | - $option->save(); | ||
320 | - | ||
321 | - $value = new TaxValueString(); | ||
322 | - $value->tax_option_id = $option->tax_option_id; | ||
323 | - $value->value = $filter; | ||
324 | - $value->save(); | ||
325 | - | ||
326 | - $option->default_value = $value->tax_value_id; | ||
327 | - $option->save(); | ||
328 | - } | ||
329 | - $options[] = $value->tax_option_id; | ||
330 | - } | ||
331 | - } | ||
332 | - | ||
333 | - if (! empty ($years)) { | ||
334 | - // Set God (tax_group_id = 21) | ||
335 | - foreach($years as $filter) { | ||
336 | - $filter = trim($filter); | ||
337 | - if (!$filter) { | ||
338 | - continue; | ||
339 | - } | ||
340 | - if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => 21])->one()) === null ) { | ||
341 | - // Create option | ||
342 | - $option = new TaxOption(); | ||
343 | - $option->tax_group_id = 21; | ||
344 | - $option->save(); | ||
345 | - | ||
346 | - $value = new TaxValueString(); | ||
347 | - $value->tax_option_id = $option->tax_option_id; | ||
348 | - $value->value = $filter; | ||
349 | - $value->save(); | ||
350 | - | ||
351 | - $option->default_value = $value->tax_value_id; | ||
352 | - $option->save(); | ||
353 | - } | ||
354 | - $options[] = $value->tax_option_id; | ||
355 | - } | ||
356 | - } | ||
357 | - | ||
358 | - if (! empty ($gender)) { | ||
359 | - // Set Pol (tax_group_id = 22) | ||
360 | - foreach($gender as $filter) { | ||
361 | - $filter = trim($filter); | ||
362 | - if (!$filter) { | ||
363 | - continue; | ||
364 | - } | ||
365 | - if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => 22])->one()) === null ) { | ||
366 | - // Create option | ||
367 | - $option = new TaxOption(); | ||
368 | - $option->tax_group_id = 22; | ||
369 | - $option->save(); | ||
370 | - | ||
371 | - $value = new TaxValueString(); | ||
372 | - $value->tax_option_id = $option->tax_option_id; | ||
373 | - $value->value = $filter; | ||
374 | - $value->save(); | ||
375 | - | ||
376 | - $option->default_value = $value->tax_value_id; | ||
377 | - $option->save(); | ||
378 | - } | ||
379 | - $options[] = $value->tax_option_id; | ||
380 | - } | ||
381 | - } | ||
382 | - | ||
383 | - if (!empty($options)) { | ||
384 | - $_product->options = $options; | ||
385 | - } | ||
386 | - | ||
387 | - $_product->save(); | ||
388 | - | ||
389 | - $this->stdout("$j: Product {$_product->name} #{$_product->product_id} saved (". ($is_new_product ? 'new product' : 'exists product') .")\n"); | ||
390 | - | ||
391 | - /*if ($j > 100) { | ||
392 | - $this->stdout("Dev OK"); | ||
393 | - exit; | ||
394 | - }*/ | ||
395 | - | ||
396 | - } | ||
397 | - | ||
398 | - fclose ($handle); | 32 | + public function actionProducts() { |
33 | + $model = new Import(); | ||
34 | + $data = $model->goProducts(0, null); | ||
399 | 35 | ||
400 | return Controller::EXIT_CODE_NORMAL; | 36 | return Controller::EXIT_CODE_NORMAL; |
401 | } | 37 | } |
402 | 38 | ||
403 | - public function goProducts() { | ||
404 | - | ||
405 | - } | ||
406 | - | ||
407 | public function actionPrices() { | 39 | public function actionPrices() { |
408 | - $new_products = $linked_products = 0; | ||
409 | - | ||
410 | - if ( !($handle = $this->getProductsFile('uploadFilePrices')) ) { | ||
411 | - $this->stdout("File not found\n"); | ||
412 | - return Controller::EXIT_CODE_ERROR; | ||
413 | - } | ||
414 | - | ||
415 | - $j = 0; | ||
416 | - | ||
417 | - while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE) { | ||
418 | - $j++; | ||
419 | -// if ($j > 1) { | ||
420 | -// return TRUE; | ||
421 | -// } | ||
422 | - | ||
423 | - foreach ($data as &$value) | ||
424 | - { | ||
425 | - //$value = mb_convert_encoding ($value, "UTF-8", mb_detect_encoding ($value)); | ||
426 | - $value = iconv ('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value); | ||
427 | - $value = trim ($value); | ||
428 | - } | ||
429 | - | ||
430 | - // данные строк | ||
431 | - $modification_code = @$data[0]; | ||
432 | - $_price = floatval(@$data[1]); | ||
433 | - $_price_promo = floatval(@$data[2]); | ||
434 | - $count = intval(@$data[3]); | ||
435 | - $city_name = @$data[4]; | ||
436 | - $product_title = @$data[5]; | ||
437 | - | ||
438 | - // @todo refactory this code | ||
439 | - $price = $_price_promo > 0 ? $_price_promo : $_price; | ||
440 | - $price_promo = $_price_promo > 0 ? $_price : $_price_promo; | ||
441 | - | ||
442 | - $modification_code = trim($modification_code); | ||
443 | - | ||
444 | - if (empty ($modification_code)) { | ||
445 | - continue; | ||
446 | - } | ||
447 | - // товары в пути | ||
448 | - if (empty ($city_name)) | ||
449 | - { | ||
450 | - $this->saveNotFoundRecord ( | ||
451 | - [$modification_code, $product_title], | ||
452 | - Yii::getAlias('@uploadFilePricesAway') | ||
453 | - ); | ||
454 | - | ||
455 | - $this->stdout("~ Товар $product_title в пути\n"); | ||
456 | - | ||
457 | - continue; | ||
458 | - } | ||
459 | - | ||
460 | - if ( ($productVariant = ProductVariant::find()->filterWhere(['sku' => $modification_code])->one()) === null ) { | ||
461 | - // 'Нет даной модификации в базе'; | ||
462 | - $this->saveNotFoundRecord ( | ||
463 | - [$modification_code, $product_title], | ||
464 | - Yii::getAlias('@uploadFilePricesNoVariant') | ||
465 | - ); | ||
466 | - | ||
467 | - $this->stdout("- Для товара $product_title (#$modification_code) не найдено соотвествия\n"); | ||
468 | - | ||
469 | - continue; | ||
470 | - } | ||
471 | - | ||
472 | - $quantity = 0; | ||
473 | - | ||
474 | - // ===== Set stock ==== | ||
475 | - if ( $city_name ) { | ||
476 | - if ( ($stock = Stock::find()->filterWhere(['name' => trim($city_name)])->one()) === null ) { | ||
477 | - // Create stock | ||
478 | - $stock = new Stock(); | ||
479 | - $stock->name = trim($city_name); | ||
480 | - $stock->save(); | ||
481 | - } | ||
482 | - | ||
483 | - $productVariant->stocks[$stock->stock_id] = $count; | ||
484 | - $quantity = $quantity + $count; | ||
485 | - } | ||
486 | - | ||
487 | - $productVariant->price = $price; | ||
488 | - $productVariant->price_old = $price_promo; | ||
489 | - $productVariant->stock = $quantity; | ||
490 | - | ||
491 | - $productVariant->save(); | ||
492 | - | ||
493 | - $this->stdout("+ Товар $product_title успешно сохранен\n"); | ||
494 | - } | ||
495 | - fclose ($handle); | ||
496 | - | ||
497 | - unlink(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFilePrices')); | 40 | + $model = new Import(); |
41 | + $data = $model->goPrices(0, null); | ||
498 | 42 | ||
499 | return Controller::EXIT_CODE_NORMAL; | 43 | return Controller::EXIT_CODE_NORMAL; |
500 | } | 44 | } |