d8c1a2e0
Yarik
Big commit artbox
|
1
|
<?php
|
e8ccb1b4
Yarik
Import beta
|
2
3
4
5
6
7
8
9
10
|
namespace common\modules\product\models;
use common\modules\language\models\Language;
use common\modules\rubrication\models\TaxGroup;
use common\modules\rubrication\models\TaxOption;
use Yii;
use yii\base\Model;
use yii\helpers\ArrayHelper;
|
772a3ca4
Yarik
Big commit
|
11
12
13
14
15
16
|
/**
* Class Import
*
* @package common\modules\product\models
*/
|
e8ccb1b4
Yarik
Import beta
|
17
|
class Import extends Model
|
d8c1a2e0
Yarik
Big commit artbox
|
18
|
{
|
c70f24ea
Yarik
For Leha commit.
|
19
20
21
22
23
|
/**
* Import csv file
*
* @var string $file
*/
|
e8ccb1b4
Yarik
Import beta
|
24
25
|
public $file;
|
c70f24ea
Yarik
For Leha commit.
|
26
27
28
29
30
31
32
|
/**
* Import type
* * product
* * price
*
* @var string $type
*/
|
e8ccb1b4
Yarik
Import beta
|
33
34
|
public $type;
|
c70f24ea
Yarik
For Leha commit.
|
35
36
37
38
39
|
/**
* Import language ID
*
* @var int $lang
*/
|
e8ccb1b4
Yarik
Import beta
|
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
public $lang;
public $errors = [];
public $output = [];
/**
* @inheritdoc
*/
public function rules()
{
return [
[
[
'type',
'lang',
],
'required',
],
[
[ 'lang' ],
'integer',
],
[
[ 'type' ],
'string',
],
[
[ 'file' ],
'file',
'extensions' => 'csv',
],
];
|
d8c1a2e0
Yarik
Big commit artbox
|
73
|
}
|
e8ccb1b4
Yarik
Import beta
|
74
75
76
77
78
79
80
81
82
|
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'file' => Yii::t('product', 'File'),
];
|
d8c1a2e0
Yarik
Big commit artbox
|
83
|
}
|
e8ccb1b4
Yarik
Import beta
|
84
|
|
c70f24ea
Yarik
For Leha commit.
|
85
86
87
88
89
90
|
/**
* Get import type
*
* @see Import::type
* @return string
*/
|
e8ccb1b4
Yarik
Import beta
|
91
|
public function getType()
|
d8c1a2e0
Yarik
Big commit artbox
|
92
|
{
|
4428da8c
Yarik
Almost all databa...
|
93
|
if (!$this->type) {
|
e8ccb1b4
Yarik
Import beta
|
94
|
$this->type = 'products';
|
d8c1a2e0
Yarik
Big commit artbox
|
95
|
}
|
e8ccb1b4
Yarik
Import beta
|
96
97
98
|
return $this->type;
}
|
c70f24ea
Yarik
For Leha commit.
|
99
100
101
102
103
104
105
106
|
/**
* Import prices
*
* @param int $from Start row
* @param null $limit Row limit
*
* @return array|bool Array if OK, false otherwise
*/
|
4428da8c
Yarik
Almost all databa...
|
107
|
public function goPrices($from = 0, $limit = null)
|
e8ccb1b4
Yarik
Import beta
|
108
109
110
|
{
set_time_limit(0);
|
4428da8c
Yarik
Almost all databa...
|
111
|
if (!( $handle = $this->getProductsFile('uploadFilePrices') )) {
|
e8ccb1b4
Yarik
Import beta
|
112
113
|
$this->errors[] = 'File not found';
return false;
|
d8c1a2e0
Yarik
Big commit artbox
|
114
|
}
|
e8ccb1b4
Yarik
Import beta
|
115
116
|
$filesize = filesize(Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFilePrices'));
|
4428da8c
Yarik
Almost all databa...
|
117
|
if ($from) {
|
e8ccb1b4
Yarik
Import beta
|
118
|
fseek($handle, $from);
|
d8c1a2e0
Yarik
Big commit artbox
|
119
|
}
|
e8ccb1b4
Yarik
Import beta
|
120
121
122
|
$j = 0;
|
4428da8c
Yarik
Almost all databa...
|
123
124
125
126
127
128
129
130
131
132
|
$is_utf = ( preg_match(
'//u',
file_get_contents(
Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFilePrices'),
null,
null,
null,
1000000
)
) );
|
e8ccb1b4
Yarik
Import beta
|
133
|
|
4428da8c
Yarik
Almost all databa...
|
134
135
136
|
while (( empty( $limit ) || $j++ < $limit ) && ( $data = fgetcsv($handle, 10000, ";") ) !== false) {
foreach ($data as &$value) {
if (!$is_utf) {
|
e8ccb1b4
Yarik
Import beta
|
137
138
139
|
$value = iconv('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value);
}
$value = trim($value);
|
d8c1a2e0
Yarik
Big commit artbox
|
140
|
}
|
e8ccb1b4
Yarik
Import beta
|
141
142
143
144
145
146
147
148
149
|
// данные строк
$modification_code = @$data[ 0 ];
$price = floatval(@$data[ 1 ]);
$price_promo = floatval(@$data[ 2 ]);
$count = intval(@$data[ 3 ]);
$city_name = @$data[ 4 ];
$product_title = @$data[ 5 ];
|
4428da8c
Yarik
Almost all databa...
|
150
|
if (empty ( $modification_code )) {
|
e8ccb1b4
Yarik
Import beta
|
151
|
continue;
|
d8c1a2e0
Yarik
Big commit artbox
|
152
|
}
|
e8ccb1b4
Yarik
Import beta
|
153
|
// товары в пути
|
4428da8c
Yarik
Almost all databa...
|
154
|
if (empty ( $city_name )) {
|
e8ccb1b4
Yarik
Import beta
|
155
156
157
|
$this->output[] = 'Товар ' . $product_title . ' в пути';
continue;
}
|
5c2eb7c8
Yarik
Big commit almost...
|
158
159
160
|
/**
* @var ProductVariant $productVariant
*/
|
4428da8c
Yarik
Almost all databa...
|
161
162
163
|
if (( $productVariant = ProductVariant::find()
->filterWhere([ 'sku' => $modification_code ])
->one() ) === null
|
e8ccb1b4
Yarik
Import beta
|
164
165
166
167
168
|
) {
$this->output[] = 'Для товара ' . $product_title . ' не найдено соотвествие';
continue;
}
// ===== Set stock ====
|
4428da8c
Yarik
Almost all databa...
|
169
170
171
172
|
if ($city_name) {
if (( $stock = Stock::find()
->filterWhere([ 'title' => trim($city_name) ])
->one() ) === null
|
e8ccb1b4
Yarik
Import beta
|
173
174
175
|
) {
// Create stock
$stock = new Stock();
|
8af13427
Yarik
For leha commit.
|
176
|
$stock->title = trim($city_name);
|
7c4bd867
Yarik
Import browser be...
|
177
|
$stock->save(false);
|
e8ccb1b4
Yarik
Import beta
|
178
179
180
|
}
$productStock = ProductStock::find()
|
4428da8c
Yarik
Almost all databa...
|
181
182
183
184
185
186
|
->where(
[
'product_variant_id' => $productVariant->id,
'stock_id' => $stock->id,
]
)
|
e8ccb1b4
Yarik
Import beta
|
187
|
->one();
|
4428da8c
Yarik
Almost all databa...
|
188
189
190
191
|
if (!$productStock instanceof ProductStock) {
$productStock = new ProductStock();
$productStock->product_variant_id = $productVariant->id;
$productStock->stock_id = $stock->id;
|
e8ccb1b4
Yarik
Import beta
|
192
193
194
|
}
$productStock->quantity = $count;
|
7c4bd867
Yarik
Import browser be...
|
195
|
$productStock->save(false);
|
e8ccb1b4
Yarik
Import beta
|
196
|
$productStocks = ProductStock::find()
|
4428da8c
Yarik
Almost all databa...
|
197
198
199
200
201
202
203
204
205
206
|
->where(
[ 'product_variant_id' => $productVariant->id ]
)
->andWhere(
[
'<>',
'stock_id',
$stock->id,
]
)
|
e8ccb1b4
Yarik
Import beta
|
207
208
|
->all();
|
d8c1a2e0
Yarik
Big commit artbox
|
209
210
|
$quantity = array_sum(ArrayHelper::getColumn($productStocks, 'quantity')) + $count;
} else {
|
e8ccb1b4
Yarik
Import beta
|
211
212
|
$productStocks = ProductStock::find()
|
4428da8c
Yarik
Almost all databa...
|
213
214
215
|
->where(
[ 'product_variant_id' => $productVariant->id ]
)
|
e8ccb1b4
Yarik
Import beta
|
216
217
|
->all();
|
4428da8c
Yarik
Almost all databa...
|
218
|
if ($productStocks instanceof ProductStock) {
|
e8ccb1b4
Yarik
Import beta
|
219
220
221
222
223
|
$quantity = array_sum(ArrayHelper::getColumn($productStocks, 'quantity')) + $count;
} else {
$quantity = 0;
}
|
d8c1a2e0
Yarik
Big commit artbox
|
224
|
}
|
e8ccb1b4
Yarik
Import beta
|
225
|
|
4428da8c
Yarik
Almost all databa...
|
226
|
if ($price_promo) {
|
e8ccb1b4
Yarik
Import beta
|
227
228
229
230
231
232
233
234
235
|
$productVariant->price_old = $price;
$productVariant->price = $price_promo;
} else {
$productVariant->price = $price;
$productVariant->price_old = $price_promo;
}
$productVariant->stock = $quantity;
|
7c4bd867
Yarik
Import browser be...
|
236
|
$productVariant->save(false);
|
e8ccb1b4
Yarik
Import beta
|
237
|
|
5c2eb7c8
Yarik
Big commit almost...
|
238
|
$this->output[] = '<span style="color:blue">Товар ' . $product_title . ' успешно сохранен</span>';
|
d8c1a2e0
Yarik
Big commit artbox
|
239
|
}
|
e8ccb1b4
Yarik
Import beta
|
240
241
242
243
244
245
246
247
248
249
250
|
$result = [
'end' => feof($handle),
'from' => ftell($handle),
'totalsize' => $filesize,
'items' => $this->output,
];
fclose($handle);
|
4428da8c
Yarik
Almost all databa...
|
251
|
if ($result[ 'end' ]) {
|
e8ccb1b4
Yarik
Import beta
|
252
|
unlink(Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFilePrices'));
|
d8c1a2e0
Yarik
Big commit artbox
|
253
|
}
|
e8ccb1b4
Yarik
Import beta
|
254
255
|
return $result;
|
d8c1a2e0
Yarik
Big commit artbox
|
256
|
}
|
36d1807a
Yarik
Big commit.
|
257
|
|
e8ccb1b4
Yarik
Import beta
|
258
|
/**
|
c70f24ea
Yarik
For Leha commit.
|
259
260
|
* Pull name and remote_id from formatted string
*
|
e8ccb1b4
Yarik
Import beta
|
261
262
263
264
265
|
* @param string $name
*
* @return array
*/
private function parseName(string $name):array
|
d8c1a2e0
Yarik
Big commit artbox
|
266
|
{
|
e8ccb1b4
Yarik
Import beta
|
267
268
269
|
$pattern = '/^(?P<name>.*)(?:\(#(?P<remote_id>\w+)#\))?$/U';
$name = trim($name);
$matches = [];
|
4428da8c
Yarik
Almost all databa...
|
270
271
|
if (preg_match($pattern, $name, $matches)) {
if (!isset( $matches[ 'remote_id' ] )) {
|
b30494bf
Yarik
Import browser beta
|
272
|
$matches[ 'remote_id' ] = '';
|
d8c1a2e0
Yarik
Big commit artbox
|
273
|
}
|
e8ccb1b4
Yarik
Import beta
|
274
|
return $matches;
|
d8c1a2e0
Yarik
Big commit artbox
|
275
|
}
|
e8ccb1b4
Yarik
Import beta
|
276
277
278
279
280
281
282
|
return [
'name' => $name,
'remote_id' => '',
];
}
/**
|
c70f24ea
Yarik
For Leha commit.
|
283
284
|
* Save categories
*
|
e8ccb1b4
Yarik
Import beta
|
285
286
|
* @param array $catalog_names
*
|
c70f24ea
Yarik
For Leha commit.
|
287
|
* @return int[] Category IDs
|
e8ccb1b4
Yarik
Import beta
|
288
289
290
291
|
* @throws \Exception
*/
private function saveCatalog(array $catalog_names):array
{
|
36d1807a
Yarik
Big commit.
|
292
293
|
$category_id = [];
|
4428da8c
Yarik
Almost all databa...
|
294
|
foreach ($catalog_names as $catalog_name) {
|
d8c1a2e0
Yarik
Big commit artbox
|
295
|
// ==== Set category ====
|
e8ccb1b4
Yarik
Import beta
|
296
|
$parsed_name = $this->parseName($catalog_name);
|
4428da8c
Yarik
Almost all databa...
|
297
298
299
300
301
302
|
if (!empty( $parsed_name[ 'remote_id' ] ) && ( $category = Category::find()
->joinWith('lang')
->andFilterWhere(
[ 'remote_id' => $parsed_name[ 'remote_id' ] ]
)
->one() ) !== null
|
e8ccb1b4
Yarik
Import beta
|
303
|
) {
|
4428da8c
Yarik
Almost all databa...
|
304
|
if (!empty( $category->lang )) {
|
8af13427
Yarik
For leha commit.
|
305
|
$category->lang->title = $parsed_name[ 'name' ];
|
7c4bd867
Yarik
Import browser be...
|
306
|
$category->lang->save(false);
|
e8ccb1b4
Yarik
Import beta
|
307
|
} else {
|
4428da8c
Yarik
Almost all databa...
|
308
309
310
311
|
throw new \Exception(
'Category with ID ' . $category->id . ' and lang ' . Language::getCurrent(
)->id . ' doesn\'t exist'
);
|
e8ccb1b4
Yarik
Import beta
|
312
313
314
|
}
} else {
|
d8c1a2e0
Yarik
Big commit artbox
|
315
316
|
// Create category
$category = new Category();
|
e8ccb1b4
Yarik
Import beta
|
317
|
$category->generateLangs();
|
8af13427
Yarik
For leha commit.
|
318
|
$category_langs = $category->modelLangs;
|
4428da8c
Yarik
Almost all databa...
|
319
|
foreach ($category_langs as $category_lang) {
|
8af13427
Yarik
For leha commit.
|
320
|
$category_lang->title = $parsed_name[ 'name' ];
|
e8ccb1b4
Yarik
Import beta
|
321
322
|
}
$category->remote_id = $parsed_name[ 'remote_id' ];
|
7c4bd867
Yarik
Import browser be...
|
323
|
$category->save(false);
|
d8c1a2e0
Yarik
Big commit artbox
|
324
|
}
|
8af13427
Yarik
For leha commit.
|
325
|
$category_id[] = $category->id;
|
d8c1a2e0
Yarik
Big commit artbox
|
326
|
}
|
e8ccb1b4
Yarik
Import beta
|
327
328
329
330
|
return $category_id;
}
/**
|
c70f24ea
Yarik
For Leha commit.
|
331
332
333
|
* Save brand
*
* @param string|null $brand_name
|
e8ccb1b4
Yarik
Import beta
|
334
|
*
|
c70f24ea
Yarik
For Leha commit.
|
335
|
* @return int|null New Brand ID if inserted or exist or null if skipped
|
e8ccb1b4
Yarik
Import beta
|
336
337
|
* @throws \Exception
*/
|
4428da8c
Yarik
Almost all databa...
|
338
|
private function saveBrand(string $brand_name = null):int
|
e8ccb1b4
Yarik
Import beta
|
339
340
341
|
{
$parsed_name = $this->parseName($brand_name);
|
4428da8c
Yarik
Almost all databa...
|
342
|
if (!empty( $brand_name )) {
|
36d1807a
Yarik
Big commit.
|
343
344
345
|
/**
* @var Brand $brand
*/
|
4428da8c
Yarik
Almost all databa...
|
346
347
348
349
350
351
|
if (!empty( $parsed_name[ 'remote_id' ] ) && ( $brand = Brand::find()
->joinWith('lang')
->andFilterWhere(
[ 'remote_id' => $parsed_name[ 'remote_id' ] ]
)
->one() ) !== null
|
e8ccb1b4
Yarik
Import beta
|
352
|
) {
|
4428da8c
Yarik
Almost all databa...
|
353
|
if (!empty( $brand->lang )) {
|
8af13427
Yarik
For leha commit.
|
354
|
$brand->lang->title = $parsed_name[ 'name' ];
|
7c4bd867
Yarik
Import browser be...
|
355
|
$brand->lang->save(false);
|
e8ccb1b4
Yarik
Import beta
|
356
|
} else {
|
4428da8c
Yarik
Almost all databa...
|
357
358
359
360
|
throw new \Exception(
'Brand with ID ' . $brand->id . ' and lang ' . Language::getCurrent(
)->id . ' doesn\'t exist'
);
|
e8ccb1b4
Yarik
Import beta
|
361
|
}
|
8af13427
Yarik
For leha commit.
|
362
|
return $brand->id;
|
d8c1a2e0
Yarik
Big commit artbox
|
363
364
365
|
} else {
// Create brand
$brand = new Brand();
|
e8ccb1b4
Yarik
Import beta
|
366
|
$brand->generateLangs();
|
8af13427
Yarik
For leha commit.
|
367
|
$brand_langs = $brand->modelLangs;
|
4428da8c
Yarik
Almost all databa...
|
368
|
foreach ($brand_langs as $brand_lang) {
|
8af13427
Yarik
For leha commit.
|
369
|
$brand_lang->title = $parsed_name[ 'name' ];
|
e8ccb1b4
Yarik
Import beta
|
370
371
|
}
$brand->remote_id = $parsed_name[ 'remote_id' ];
|
7c4bd867
Yarik
Import browser be...
|
372
|
$brand->save(false);
|
8af13427
Yarik
For leha commit.
|
373
|
return $brand->id;
|
d8c1a2e0
Yarik
Big commit artbox
|
374
375
|
}
}
|
4428da8c
Yarik
Almost all databa...
|
376
|
return null;
|
e8ccb1b4
Yarik
Import beta
|
377
378
379
|
}
/**
|
c70f24ea
Yarik
For Leha commit.
|
380
381
382
383
384
|
* Save Product or ProductVariant photoes
*
* @param string[] $fotos Photoes names
* @param int $product_id
* @param int|null $product_variant_id Null if photo for Product
|
e8ccb1b4
Yarik
Import beta
|
385
|
*/
|
4428da8c
Yarik
Almost all databa...
|
386
|
private function saveFotos(array $fotos, int $product_id, int $product_variant_id = null)
|
e8ccb1b4
Yarik
Import beta
|
387
|
{
|
4428da8c
Yarik
Almost all databa...
|
388
389
|
if (!empty( $fotos )) {
foreach ($fotos as $foto) {
|
4428da8c
Yarik
Almost all databa...
|
390
|
if (empty( $foto )) {
|
af036678
Yarik
Image behaviors
|
391
392
|
continue;
}
|
e8ccb1b4
Yarik
Import beta
|
393
|
$source_image = Yii::getAlias('@uploadDir') . '/product_images/' . urlencode($foto);
|
4428da8c
Yarik
Almost all databa...
|
394
395
396
397
398
399
400
401
|
if (file_exists($source_image)) {
if (( $productImage = ProductImage::find()
->andWhere([ 'image' => $foto ])
->andWhere([ 'product_id' => $product_id ])
->andFilterWhere(
[ 'product_variant_id' => $product_variant_id ]
)
->one() ) === null
|
e8ccb1b4
Yarik
Import beta
|
402
|
) {
|
d8c1a2e0
Yarik
Big commit artbox
|
403
404
|
copy($source_image, Yii::getAlias('@productsDir') . "/" . $foto);
$productImage = new ProductImage();
|
e8ccb1b4
Yarik
Import beta
|
405
406
|
$productImage->product_id = $product_id;
$productImage->product_variant_id = $product_variant_id;
|
d8c1a2e0
Yarik
Big commit artbox
|
407
|
$productImage->image = $foto;
|
7c4bd867
Yarik
Import browser be...
|
408
|
$productImage->save(false);
|
d8c1a2e0
Yarik
Big commit artbox
|
409
410
411
412
|
}
}
}
}
|
e8ccb1b4
Yarik
Import beta
|
413
414
415
|
}
/**
|
c70f24ea
Yarik
For Leha commit.
|
416
417
|
* Save ProductVariants
*
|
772a3ca4
Yarik
Big commit
|
418
|
* @param array $data ProductVariats data
|
c70f24ea
Yarik
For Leha commit.
|
419
|
* @param float $product_cost_old Old price
|
772a3ca4
Yarik
Big commit
|
420
421
|
* @param int $product_id Product ID
* @param array $category_id Ca
|
5c2eb7c8
Yarik
Big commit almost...
|
422
|
* @param float|null $product_cost
|
e8ccb1b4
Yarik
Import beta
|
423
|
*
|
772a3ca4
Yarik
Big commit
|
424
|
* @return int[] Array of ProductVariants IDs
|
5c2eb7c8
Yarik
Big commit almost...
|
425
|
* @throws \Exception
|
e8ccb1b4
Yarik
Import beta
|
426
|
*/
|
4428da8c
Yarik
Almost all databa...
|
427
428
429
430
431
432
433
|
private function saveVariants(
array $data,
float $product_cost_old,
int $product_id,
array $category_id,
float $product_cost = null
):array
|
e8ccb1b4
Yarik
Import beta
|
434
|
{
|
d8c1a2e0
Yarik
Big commit artbox
|
435
|
$MOD_ARRAY = [];
|
4428da8c
Yarik
Almost all databa...
|
436
437
|
for ($i = 13; $i < count($data); $i++) {
if (!empty ( $data[ $i ] )) {
|
e8ccb1b4
Yarik
Import beta
|
438
439
|
$mod_arr = explode('=', $data[ $i ]);
$mod_art = $mod_arr[ 0 ];
|
72a992f5
Yarik
Import browser v1.0
|
440
|
$mod_art_parsed = $this->parseName($mod_art);
|
e8ccb1b4
Yarik
Import beta
|
441
442
|
$variant_filters = explode('*', $mod_arr[ 1 ]);
$mod_name = $mod_arr[ 2 ];
|
4428da8c
Yarik
Almost all databa...
|
443
|
if (empty( $mod_name )) {
|
5c2eb7c8
Yarik
Big commit almost...
|
444
|
$mod_name = $mod_art_parsed[ 'name' ];
|
e8ccb1b4
Yarik
Import beta
|
445
446
447
448
|
}
$mod_image = $mod_arr[ 3 ];
$mod_stock = isset( $mod_arr[ 4 ] ) ? $mod_arr[ 4 ] : 1;
$mod_cost = isset( $product_cost ) ? floatval($product_cost) : 0;
|
d8c1a2e0
Yarik
Big commit artbox
|
449
|
$mod_old_cost = floatval($product_cost_old);
|
d8c1a2e0
Yarik
Big commit artbox
|
450
|
// Check product variant
|
e8ccb1b4
Yarik
Import beta
|
451
452
453
|
/**
* @var ProductVariant $_productVariant
*/
|
4428da8c
Yarik
Almost all databa...
|
454
455
456
457
458
459
460
461
462
|
if (( $_productVariant = ProductVariant::find()
->joinWith('lang')
->andFilterWhere(
[ 'remote_id' => $mod_art_parsed[ 'remote_id' ] ]
)
->andFilterWhere(
[ 'product_variant.product_id' => $product_id ]
)
->one() ) === null
|
e8ccb1b4
Yarik
Import beta
|
463
|
) {
|
d8c1a2e0
Yarik
Big commit artbox
|
464
|
$_productVariant = new ProductVariant();
|
e8ccb1b4
Yarik
Import beta
|
465
|
$_productVariant->product_id = $product_id;
|
4428da8c
Yarik
Almost all databa...
|
466
|
if (!empty( $mod_art_parsed[ 'remote_id' ] )) {
|
5c2eb7c8
Yarik
Big commit almost...
|
467
|
$_productVariant->remote_id = $mod_art_parsed[ 'remote_id' ];
|
72a992f5
Yarik
Import browser v1.0
|
468
|
}
|
e8ccb1b4
Yarik
Import beta
|
469
|
$_productVariant->generateLangs();
|
8af13427
Yarik
For leha commit.
|
470
|
$product_variant_langs = $_productVariant->modelLangs;
|
4428da8c
Yarik
Almost all databa...
|
471
|
foreach ($product_variant_langs as $product_variant_lang) {
|
8af13427
Yarik
For leha commit.
|
472
|
$product_variant_lang->title = $mod_name;
|
e8ccb1b4
Yarik
Import beta
|
473
474
|
}
} else {
|
4428da8c
Yarik
Almost all databa...
|
475
|
if (!empty( $_productVariant->lang )) {
|
8af13427
Yarik
For leha commit.
|
476
|
$_productVariant->lang->title = $mod_name;
|
7c4bd867
Yarik
Import browser be...
|
477
|
$_productVariant->lang->save(false);
|
e8ccb1b4
Yarik
Import beta
|
478
|
} else {
|
4428da8c
Yarik
Almost all databa...
|
479
480
481
482
|
throw new \Exception(
'Product variant with ID ' . $_productVariant->id . ' and lang ' . Language::getCurrent(
)->id . ' doesn\'t exist'
);
|
e8ccb1b4
Yarik
Import beta
|
483
|
}
|
d8c1a2e0
Yarik
Big commit artbox
|
484
485
|
}
$_productVariant->product_unit_id = 1;
|
5c2eb7c8
Yarik
Big commit almost...
|
486
|
$_productVariant->sku = $mod_art_parsed[ 'name' ];
|
d8c1a2e0
Yarik
Big commit artbox
|
487
488
489
|
$_productVariant->price = $mod_cost;
$_productVariant->price_old = $mod_old_cost;
$_productVariant->stock = $mod_stock;
|
e8ccb1b4
Yarik
Import beta
|
490
|
|
4428da8c
Yarik
Almost all databa...
|
491
|
if (!empty ( $variant_filters )) {
|
e8ccb1b4
Yarik
Import beta
|
492
|
$variants_options = $this->saveFilters($variant_filters, 1, $category_id);
|
d8c1a2e0
Yarik
Big commit artbox
|
493
|
}
|
e8ccb1b4
Yarik
Import beta
|
494
|
|
4428da8c
Yarik
Almost all databa...
|
495
|
if (isset( $variants_options ) && !empty( $variants_options )) {
|
d8c1a2e0
Yarik
Big commit artbox
|
496
497
|
$_productVariant->options = $variants_options;
}
|
b30494bf
Yarik
Import browser beta
|
498
|
|
e8ccb1b4
Yarik
Import beta
|
499
500
501
|
/**
* @todo set to false
*/
|
d8c1a2e0
Yarik
Big commit artbox
|
502
|
$_productVariant->save(false);
|
e8ccb1b4
Yarik
Import beta
|
503
|
|
4428da8c
Yarik
Almost all databa...
|
504
505
|
$MOD_ARRAY[] = $_productVariant->id;
$this->saveFotos([ $mod_image ], $product_id, $_productVariant->id);
|
e8ccb1b4
Yarik
Import beta
|
506
507
508
509
510
|
}
}
return $MOD_ARRAY;
}
|
772a3ca4
Yarik
Big commit
|
511
512
513
514
515
516
517
518
|
/**
* Perform product import
*
* @param int $from Begin row
* @param null $limit Row limit
*
* @return array|bool Array if OK, false if error
*/
|
4428da8c
Yarik
Almost all databa...
|
519
|
public function goProducts($from = 0, $limit = null)
|
e8ccb1b4
Yarik
Import beta
|
520
|
{
|
e8ccb1b4
Yarik
Import beta
|
521
522
|
set_time_limit(0);
|
4428da8c
Yarik
Almost all databa...
|
523
|
if (!( $handle = $this->getProductsFile('uploadFileProducts') )) {
|
e8ccb1b4
Yarik
Import beta
|
524
525
526
|
$this->errors[] = 'File not found';
return false;
}
|
b30494bf
Yarik
Import browser beta
|
527
|
|
e8ccb1b4
Yarik
Import beta
|
528
529
|
$filesize = filesize(Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFileProducts'));
|
4428da8c
Yarik
Almost all databa...
|
530
|
if ($from) {
|
e8ccb1b4
Yarik
Import beta
|
531
532
533
534
535
|
fseek($handle, $from);
}
$j = 0;
|
4428da8c
Yarik
Almost all databa...
|
536
537
538
539
540
541
542
543
544
545
|
$is_utf = ( preg_match(
'//u',
file_get_contents(
Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFileProducts'),
null,
null,
null,
1000000
)
) );
|
e8ccb1b4
Yarik
Import beta
|
546
547
548
|
$result_items = [];
|
4428da8c
Yarik
Almost all databa...
|
549
|
while (( empty( $limit ) || $j++ < $limit ) && ( $data = fgetcsv($handle, 10000, ";") ) !== false) {
|
e8ccb1b4
Yarik
Import beta
|
550
|
try {
|
af036678
Yarik
Image behaviors
|
551
|
|
4428da8c
Yarik
Almost all databa...
|
552
553
|
foreach ($data as &$value) {
if (!$is_utf) {
|
e8ccb1b4
Yarik
Import beta
|
554
555
556
557
558
|
$value = iconv('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value);
}
$value = trim($value);
}
// будет всегда 19 элементов
|
4428da8c
Yarik
Almost all databa...
|
559
560
561
|
for ($i = 0; $i <= 18; $i++) {
if (!isset ( $data[ $i ] )) {
$data[ $i ] = null;
|
e8ccb1b4
Yarik
Import beta
|
562
563
564
565
|
}
}
// 1 Группа (категория)
$catalog_names = explode(',', $data[ 0 ]);
|
4428da8c
Yarik
Almost all databa...
|
566
|
if (empty ( $catalog_names )) {
|
e8ccb1b4
Yarik
Import beta
|
567
568
569
570
571
572
573
574
575
576
577
578
579
|
$result_items[] = "Не указана категория (строка $j)";
continue;
}
// 2 Бренд
$brand_name = $data[ 1 ];
// if(empty ( $brand_name )) {
// $result_items[] = "Не указан бренд (строка $j)";
// continue;
// }
// 3 Название товара
$product_name = $data[ 2 ];
|
4428da8c
Yarik
Almost all databa...
|
580
|
if (empty ( $product_name )) {
|
e8ccb1b4
Yarik
Import beta
|
581
582
583
584
585
586
587
588
589
590
591
592
593
|
$result_items[] = "Не указано наименование товара (строка $j)";
continue;
}
// 5 Описание товара
$product_body = $data[ 3 ];
// 6 Фильтр
$filters = explode('*', $data[ 4 ]);
// 11 Цена акция
$product_cost_old = floatval($data[ 6 ]);
|
4428da8c
Yarik
Almost all databa...
|
594
|
$product_cost = null;
|
e8ccb1b4
Yarik
Import beta
|
595
|
// 10 Цена
|
4428da8c
Yarik
Almost all databa...
|
596
|
if ($product_cost_old) {
|
e8ccb1b4
Yarik
Import beta
|
597
598
599
600
601
|
$product_cost_old = floatval($data[ 5 ]);
$product_cost = floatval($data[ 6 ]);
}
// 12 Акция
|
4428da8c
Yarik
Almost all databa...
|
602
|
$product_discount = (bool) $data[ 7 ];
|
e8ccb1b4
Yarik
Import beta
|
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
|
// 13 Сопуд. Тов.
$similar = explode(',', $data[ 8 ]);
// 14 Новинки
$product_new = (bool) $data[ 9 ];
// 15 Топ продаж
$product_top = (bool) $data[ 10 ];
// 17 ВИДЕО КОД
$product_video = $data[ 11 ];
// 18 Галлерея фото
$fotos = [];
|
4428da8c
Yarik
Almost all databa...
|
618
|
if (trim($data[ 12 ])) {
|
e8ccb1b4
Yarik
Import beta
|
619
620
621
|
$fotos = explode(',', trim($data[ 12 ]));
}
|
8af13427
Yarik
For leha commit.
|
622
|
// $lang = \Yii::$app->session->get('export_lang', Language::getDefaultLanguage()->id);
|
b30494bf
Yarik
Import browser beta
|
623
624
625
626
|
// /**
// * @var Language $language
// */
// $language = Language::find()
|
8af13427
Yarik
For leha commit.
|
627
|
// ->where([ 'id' => $lang ])
|
b30494bf
Yarik
Import browser beta
|
628
629
|
// ->one();
// Language::setCurrent($language->url);
|
e8ccb1b4
Yarik
Import beta
|
630
|
$categories = $this->saveCatalog($catalog_names);
|
5c2eb7c8
Yarik
Big commit almost...
|
631
|
|
e8ccb1b4
Yarik
Import beta
|
632
|
$brand_id = $this->saveBrand($brand_name);
|
e8ccb1b4
Yarik
Import beta
|
633
634
|
$options = [];
|
4428da8c
Yarik
Almost all databa...
|
635
|
if (!empty ( $filters )) {
|
e8ccb1b4
Yarik
Import beta
|
636
|
$options = $this->saveFilters($filters, 0, $categories);
|
e8ccb1b4
Yarik
Import beta
|
637
638
639
640
641
|
}
$parsed_name = $this->parseName($product_name);
/**
* @var Product $_product
*/
|
4428da8c
Yarik
Almost all databa...
|
642
643
644
645
646
647
|
if (!empty( $parsed_name[ 'remote_id' ] ) && ( $_product = Product::find()
->joinWith('lang')
->andFilterWhere(
[ 'remote_id' => $parsed_name[ 'remote_id' ] ]
)
->one() ) !== null
|
e8ccb1b4
Yarik
Import beta
|
648
|
) {
|
4428da8c
Yarik
Almost all databa...
|
649
|
if (!empty( $_product->lang )) {
|
8af13427
Yarik
For leha commit.
|
650
|
$_product->lang->title = $parsed_name[ 'name' ];
|
e8ccb1b4
Yarik
Import beta
|
651
|
$_product->lang->description = $product_body;
|
7c4bd867
Yarik
Import browser be...
|
652
|
$_product->lang->save(false);
|
e8ccb1b4
Yarik
Import beta
|
653
|
} else {
|
4428da8c
Yarik
Almost all databa...
|
654
655
656
657
|
throw new \Exception(
'Product with ID ' . $_product->id . ' and lang ' . Language::getCurrent(
)->id . ' doesn\'t exist'
);
|
e8ccb1b4
Yarik
Import beta
|
658
659
660
661
|
}
} else {
$_product = new Product();
$_product->generateLangs();
|
8af13427
Yarik
For leha commit.
|
662
|
$product_langs = $_product->modelLangs;
|
4428da8c
Yarik
Almost all databa...
|
663
|
foreach ($product_langs as $product_lang) {
|
8af13427
Yarik
For leha commit.
|
664
|
$product_lang->title = $parsed_name[ 'name' ];
|
e8ccb1b4
Yarik
Import beta
|
665
666
667
|
$product_lang->description = $product_body;
}
}
|
b30494bf
Yarik
Import browser beta
|
668
|
|
8af13427
Yarik
For leha commit.
|
669
|
$is_new_product = empty( $_product->id );
|
e8ccb1b4
Yarik
Import beta
|
670
671
672
673
674
675
676
|
$_product->categories = $categories;
$_product->brand_id = $brand_id;
$_product->video = $product_video;
$_product->is_top = $product_top;
|
4428da8c
Yarik
Almost all databa...
|
677
|
$_product->is_discount = $product_discount;
|
e8ccb1b4
Yarik
Import beta
|
678
|
$_product->is_new = $product_new;
|
4428da8c
Yarik
Almost all databa...
|
679
|
if (!empty( $options )) {
|
9f8be5c9
Yarik
Import browser be...
|
680
681
|
$_product->options = $options;
}
|
5c2eb7c8
Yarik
Big commit almost...
|
682
|
|
4428da8c
Yarik
Almost all databa...
|
683
|
if (!empty( $_product->lang )) {
|
8af13427
Yarik
For leha commit.
|
684
|
$product_name_inserted = $_product->lang->title;
|
9f8be5c9
Yarik
Import browser be...
|
685
|
} else {
|
8af13427
Yarik
For leha commit.
|
686
|
$product_name_inserted = $_product->modelLangs[ Language::$current->id ]->title;
|
9f8be5c9
Yarik
Import browser be...
|
687
|
}
|
9f8be5c9
Yarik
Import browser be...
|
688
|
|
4428da8c
Yarik
Almost all databa...
|
689
|
if (( $_product->save(false) === false ) || !$_product->transactionStatus) {
|
e8ccb1b4
Yarik
Import beta
|
690
691
|
$result_items[] = 'Product #' . $product_name_inserted . ' not saved' . " (line $j)";
continue;
|
d8c1a2e0
Yarik
Big commit artbox
|
692
|
}
|
b30494bf
Yarik
Import browser beta
|
693
|
|
8af13427
Yarik
For leha commit.
|
694
|
$this->saveFotos($fotos, $_product->id);
|
e8ccb1b4
Yarik
Import beta
|
695
|
// нужно для проставления характеристик относящихся к модификациям
|
b30494bf
Yarik
Import browser beta
|
696
|
|
8af13427
Yarik
For leha commit.
|
697
|
$this->saveVariants($data, $product_cost_old, $_product->id, $_product->categories, $product_cost);
|
e8ccb1b4
Yarik
Import beta
|
698
|
|
5c2eb7c8
Yarik
Big commit almost...
|
699
|
// $_product->save(false);
|
e8ccb1b4
Yarik
Import beta
|
700
|
|
8af13427
Yarik
For leha commit.
|
701
|
$result_items[] = "Product {$product_name_inserted} #{$_product->id} saved (" . ( $is_new_product ? 'new product' : 'exists product' ) . ")" . " (line $j)";
|
e8ccb1b4
Yarik
Import beta
|
702
|
|
4428da8c
Yarik
Almost all databa...
|
703
|
} catch (\Exception $e) {
|
b30494bf
Yarik
Import browser beta
|
704
|
$result_items[] = $e->getMessage() . '(line ' . $j . ')';
|
d8c1a2e0
Yarik
Big commit artbox
|
705
|
}
|
e8ccb1b4
Yarik
Import beta
|
706
|
|
d8c1a2e0
Yarik
Big commit artbox
|
707
|
}
|
e8ccb1b4
Yarik
Import beta
|
708
709
710
711
712
713
714
|
$result = [
'end' => feof($handle),
'from' => ftell($handle),
'totalsize' => $filesize,
'items' => $result_items,
];
|
b30494bf
Yarik
Import browser beta
|
715
|
|
e8ccb1b4
Yarik
Import beta
|
716
|
fclose($handle);
|
b30494bf
Yarik
Import browser beta
|
717
|
|
4428da8c
Yarik
Almost all databa...
|
718
|
if ($result[ 'end' ]) {
|
b30494bf
Yarik
Import browser beta
|
719
|
// unlink(Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@uploadFileProducts'));
|
d8c1a2e0
Yarik
Big commit artbox
|
720
|
}
|
e8ccb1b4
Yarik
Import beta
|
721
722
|
return $result;
|
d8c1a2e0
Yarik
Big commit artbox
|
723
|
}
|
e8ccb1b4
Yarik
Import beta
|
724
|
|
772a3ca4
Yarik
Big commit
|
725
726
727
728
729
730
731
|
/**
* Get import file
*
* @param string $file_type
*
* @return bool|resource false if File not found and file resource if OK
*/
|
e8ccb1b4
Yarik
Import beta
|
732
733
734
|
private function getProductsFile($file_type)
{
$filename = Yii::getAlias('@uploadDir') . '/' . Yii::getAlias('@' . $file_type);
|
4428da8c
Yarik
Almost all databa...
|
735
|
if (!is_file($filename)) {
|
e8ccb1b4
Yarik
Import beta
|
736
737
|
$this->errors[] = "File $filename not found";
return false;
|
d8c1a2e0
Yarik
Big commit artbox
|
738
|
}
|
e8ccb1b4
Yarik
Import beta
|
739
740
741
742
|
return fopen($filename, 'r');
}
/**
|
772a3ca4
Yarik
Big commit
|
743
744
745
746
747
748
749
|
* Save filters
*
* @param array $filters array of filters like [['pol'='мужской'],['god' =
* '2013'],['volume'='25 л']*['size'='49 x 30 x
* 20см'],['composition'='600D полиэстер']]
* @param int $level 0 for products and 1 for product variant
* @param int[] $catalog_names array catalogs id
|
e8ccb1b4
Yarik
Import beta
|
750
751
752
753
754
755
756
|
*
* @return array
* @throws \Exception
*/
private function saveFilters(array $filters, int $level, array $catalog_names):array
{
$options = [];
|
4428da8c
Yarik
Almost all databa...
|
757
|
foreach ($filters as $filter) {
|
5c2eb7c8
Yarik
Big commit almost...
|
758
|
|
e8ccb1b4
Yarik
Import beta
|
759
|
preg_match_all('/\[(.*):(.*)\]/', $filter, $filter);
|
5c2eb7c8
Yarik
Big commit almost...
|
760
|
|
4428da8c
Yarik
Almost all databa...
|
761
|
if (empty( $filter[ 1 ][ 0 ] )) {
|
e8ccb1b4
Yarik
Import beta
|
762
763
764
765
|
continue;
}
$filter_name = trim($filter[ 1 ][ 0 ]);
$parsed_group_name = $this->parseName($filter_name);
|
5c2eb7c8
Yarik
Big commit almost...
|
766
|
|
e8ccb1b4
Yarik
Import beta
|
767
768
769
|
/**
* @var TaxGroup $taxGroup
*/
|
4428da8c
Yarik
Almost all databa...
|
770
771
772
773
774
775
|
if (!empty( $parsed_group_name[ 'remote_id' ] ) && ( $taxGroup = TaxGroup::find()
->joinWith('lang')
->andFilterWhere(
[ 'remote_id' => $parsed_group_name[ 'remote_id' ] ]
)
->one() ) !== null
|
b30494bf
Yarik
Import browser beta
|
776
|
) {
|
4428da8c
Yarik
Almost all databa...
|
777
|
if (!empty( $taxGroup->lang )) {
|
8af13427
Yarik
For leha commit.
|
778
|
$taxGroup->lang->title = $parsed_group_name[ 'name' ];
|
7c4bd867
Yarik
Import browser be...
|
779
|
$taxGroup->lang->save(false);
|
e8ccb1b4
Yarik
Import beta
|
780
|
} else {
|
4428da8c
Yarik
Almost all databa...
|
781
|
throw new \Exception(
|
c70f24ea
Yarik
For Leha commit.
|
782
|
'Tax group with ID ' . $taxGroup->id . ' and lang ' . Language::getCurrent(
|
4428da8c
Yarik
Almost all databa...
|
783
784
|
)->id . ' doesn\'t exist'
);
|
e8ccb1b4
Yarik
Import beta
|
785
786
787
788
|
}
} else {
$taxGroup = new TaxGroup();
$taxGroup->generateLangs();
|
8af13427
Yarik
For leha commit.
|
789
|
$tax_group_langs = $taxGroup->modelLangs;
|
4428da8c
Yarik
Almost all databa...
|
790
|
foreach ($tax_group_langs as $tax_group_lang) {
|
8af13427
Yarik
For leha commit.
|
791
|
$tax_group_lang->title = $parsed_group_name[ 'name' ];
|
e8ccb1b4
Yarik
Import beta
|
792
793
794
795
|
}
$taxGroup->level = $level;
$taxGroup->categories = $catalog_names;
$taxGroup->is_filter = false;
|
7c4bd867
Yarik
Import browser be...
|
796
|
$taxGroup->save(false);
|
e8ccb1b4
Yarik
Import beta
|
797
|
}
|
8c4b7f44
Yarik
Import browser be...
|
798
|
$filters_options = explode(',', $filter[ 2 ][ 0 ]);
|
4428da8c
Yarik
Almost all databa...
|
799
|
foreach ($filters_options as $filter_options) {
|
8c4b7f44
Yarik
Import browser be...
|
800
801
802
803
|
$parsed_option_name = $this->parseName($filter_options);
/**
* @var TaxOption $option
*/
|
5c2eb7c8
Yarik
Big commit almost...
|
804
|
|
4428da8c
Yarik
Almost all databa...
|
805
806
807
808
809
810
|
if (!empty( $parsed_option_name[ 'remote_id' ] ) && ( $option = TaxOption::find()
->joinWith('lang')
->andFilterWhere(
[ 'remote_id' => $parsed_option_name[ 'remote_id' ] ]
)
->andFilterWhere(
|
c70f24ea
Yarik
For Leha commit.
|
811
|
[ 'tax_group_id' => $taxGroup->id ]
|
4428da8c
Yarik
Almost all databa...
|
812
813
|
)
->one() ) !== null
|
8c4b7f44
Yarik
Import browser be...
|
814
|
) {
|
4428da8c
Yarik
Almost all databa...
|
815
|
if (!empty( $option->lang )) {
|
8c4b7f44
Yarik
Import browser be...
|
816
|
$option->lang->value = $parsed_option_name[ 'name' ];
|
7c4bd867
Yarik
Import browser be...
|
817
|
$option->lang->save(false);
|
8c4b7f44
Yarik
Import browser be...
|
818
|
} else {
|
4428da8c
Yarik
Almost all databa...
|
819
|
throw new \Exception(
|
c70f24ea
Yarik
For Leha commit.
|
820
|
'Tax option with ID ' . $option->id . ' and lang ' . Language::getCurrent(
|
4428da8c
Yarik
Almost all databa...
|
821
822
|
)->id . ' doesn\'t exist'
);
|
8c4b7f44
Yarik
Import browser be...
|
823
824
825
826
827
|
}
} else {
// Create option
$option = new TaxOption();
$option->generateLangs();
|
8af13427
Yarik
For leha commit.
|
828
|
$option_langs = $option->modelLangs;
|
4428da8c
Yarik
Almost all databa...
|
829
|
foreach ($option_langs as $option_lang) {
|
8c4b7f44
Yarik
Import browser be...
|
830
831
|
$option_lang->value = $parsed_option_name[ 'name' ];
}
|
c70f24ea
Yarik
For Leha commit.
|
832
|
$option->id = $taxGroup->id;
|
7c4bd867
Yarik
Import browser be...
|
833
|
$option->save(false);
|
8c4b7f44
Yarik
Import browser be...
|
834
|
}
|
c70f24ea
Yarik
For Leha commit.
|
835
|
$options[] = $option->id;
|
8c4b7f44
Yarik
Import browser be...
|
836
|
}
|
d8c1a2e0
Yarik
Big commit artbox
|
837
|
}
|
e8ccb1b4
Yarik
Import beta
|
838
|
return $options;
|
d8c1a2e0
Yarik
Big commit artbox
|
839
|
}
|
772a3ca4
Yarik
Big commit
|
840
841
|
}
|