d8c1a2e0
Yarik
Big commit artbox
|
1
|
<?php
|
36d1807a
Yarik
Big commit.
|
2
3
4
|
namespace common\modules\product\models;
|
96410438
Yarik
Project admin com...
|
5
|
use common\modules\language\models\Language;
|
72a992f5
Yarik
Import browser v1.0
|
6
|
use common\modules\rubrication\models\TaxOption;
|
36d1807a
Yarik
Big commit.
|
7
8
9
10
11
|
use yii\base\Model;
class Export extends Model
{
|
96410438
Yarik
Project admin com...
|
12
13
14
15
|
public $lang;
public $file;
|
36d1807a
Yarik
Big commit.
|
16
17
18
19
|
public $errors = [];
public $output = [];
|
96410438
Yarik
Project admin com...
|
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public function rules()
{
return [
[
'lang',
'integer',
],
[
'lang',
'default',
'value' => Language::getCurrent()->language_id,
],
];
}
public function process($filename = NULL, $from = 0)
|
d8c1a2e0
Yarik
Big commit artbox
|
36
|
{
|
96410438
Yarik
Project admin com...
|
37
38
39
|
$limit = 100;
if(empty( $filename )) {
|
36d1807a
Yarik
Big commit.
|
40
|
$filename = 'products_' . date('d_m_Y_H_i') . '.csv';
|
96410438
Yarik
Project admin com...
|
41
42
43
|
$handle = fopen(\Yii::getAlias('@storage/sync/') . $filename, "w");
} else {
$handle = fopen(\Yii::getAlias('@storage/sync/') . $filename, "a");
|
d8c1a2e0
Yarik
Big commit artbox
|
44
|
}
|
96410438
Yarik
Project admin com...
|
45
46
47
|
$language = Language::findOne(\Yii::$app->session->get('export_lang', Language::getDefaultLanguage()->language_id));
Language::setCurrent($language->url);
|
72a992f5
Yarik
Import browser v1.0
|
48
49
50
51
|
/**
* @var Product[] $products
*/
|
36d1807a
Yarik
Big commit.
|
52
|
$products = Product::find()
|
af036678
Yarik
Image behaviors
|
53
|
->with('variantsWithFilters', 'brand.lang', 'categories.lang', 'filters', 'images')
|
96410438
Yarik
Project admin com...
|
54
55
56
|
->joinWith('lang', true, 'INNER JOIN')
->limit($limit)
->offset($from)
|
36d1807a
Yarik
Big commit.
|
57
|
->all();
|
96410438
Yarik
Project admin com...
|
58
59
60
|
$filesize = Product::find()
->joinWith('lang', true, 'INNER JOIN')
->count();
|
36d1807a
Yarik
Big commit.
|
61
62
63
64
65
|
foreach($products as $product) {
$mods = [];
$filterString = $this->convertFilterToString($product->filters);
foreach($product->variantsWithFilters as $variant) {
|
72a992f5
Yarik
Import browser v1.0
|
66
67
68
|
/**
* @var ProductVariant $variant
*/
|
96410438
Yarik
Project admin com...
|
69
|
$color = $variant->lang->name;
|
72a992f5
Yarik
Import browser v1.0
|
70
|
$mods[] = $variant->sku.$this->generateID($variant->remote_id) . '=' . $this->convertFilterToString($variant->filters) . '=' . $color . '=' . ( ( !empty( $variant->image ) ) ? $variant->image->image : '' ) . '=' . $variant->stock;
|
36d1807a
Yarik
Big commit.
|
71
72
73
|
}
$fotos = [];
|
af036678
Yarik
Image behaviors
|
74
75
76
|
foreach($product->images as $image) {
$fotos[] = $image->image;
}
|
36d1807a
Yarik
Big commit.
|
77
78
79
|
$categories = [];
foreach($product->categories as $value) {
|
72a992f5
Yarik
Import browser v1.0
|
80
|
$categories[] = $value->lang->name.$this->generateID($value->remote_id);
|
36d1807a
Yarik
Big commit.
|
81
82
83
84
85
|
}
$categories = implode(',', $categories);
$list = [
|
af036678
Yarik
Image behaviors
|
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
$categories, //A - категории через запятую Название(remote_id)
( ( !empty( $product->brand ) ) ? $product->brand->lang->name.$this->generateID($product->brand->remote_id) : '' ), //B - бренд Название(remote_id)
$product->lang->name.$this->generateID($product->remote_id), //C - название товара Название(remote_id)
( ( !empty( $product->lang->description ) ) ? $product->lang->description : '' ), //D - описание товара Описание(remote_id)
$filterString, //E - характеристики товара. Структура: [Группа1(remote_id):Характеристика11(remote_id),Характеристика12(remote_id)]*[Группа2(remote_id):Характеристика21(remote_id),Характеристика22(remote_id)]
( !empty( $product->variant ) ) ? $product->variant->price_old : '', //F - страрая цена
( !empty( $product->variant ) ) ? $product->variant->price : '', //G - новая цена
intval($product->akciya), //H - товар акционный (1/0)
'', //I - пустой
intval($product->is_new), //J - товар новинка
intval($product->is_top), //K - товар в топе
$product->video, //L - ссылка на видео (iframe)
implode(',', $fotos), //M - название файлов через запятую, картинки должны хранится в /storage/sync/product_images
// Все последующие модификации: SKU(remote_id)=[Группа1(remote_id):Характеристика11(remote_id),Характеристика12(remote_id)]*[Группа2(remote_id):Характеристика21(remote_id),Характеристика22(remote_id)]=Название=Изображение=Остаток
|
36d1807a
Yarik
Big commit.
|
100
101
|
];
$to_write = array_merge($list, $mods);
|
36d1807a
Yarik
Big commit.
|
102
103
|
fputcsv($handle, $to_write, ';');
unset( $product );
|
d8c1a2e0
Yarik
Big commit artbox
|
104
|
}
|
36d1807a
Yarik
Big commit.
|
105
106
107
|
fclose($handle);
|
96410438
Yarik
Project admin com...
|
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
$from += $limit;
$end = false;
if($from > $filesize) {
$end = true;
}
$result = [
'end' => $end,
'from' => $from,
'totalsize' => $filesize,
'filename' => $filename,
];
if($end) {
$result = array_merge($result, [
'link' => '/storage/sync/' . $filename,
]);
}
return $result;
|
d8c1a2e0
Yarik
Big commit artbox
|
129
|
}
|
36d1807a
Yarik
Big commit.
|
130
131
132
133
|
public function convertFilterToString($filters)
{
$fittersArray = [];
|
72a992f5
Yarik
Import browser v1.0
|
134
135
136
|
/**
* @var TaxOption[] $filters
*/
|
36d1807a
Yarik
Big commit.
|
137
|
foreach($filters as $filter) {
|
72a992f5
Yarik
Import browser v1.0
|
138
|
$fittersArray[ $filter->taxGroup->lang->name.$this->generateID($filter->taxGroup->remote_id) ][] = $filter->lang->value.$this->generateID($filter->remote_id);
|
36d1807a
Yarik
Big commit.
|
139
140
141
142
143
144
145
146
|
}
$filterString = [];
foreach($fittersArray as $filterName => $filterRows) {
$row = implode(',', $filterRows);
$filterString[] = "[{$filterName}:{$row}]";
}
return implode('*', $filterString);
|
d8c1a2e0
Yarik
Big commit artbox
|
147
|
}
|
72a992f5
Yarik
Import browser v1.0
|
148
149
150
151
|
private function generateID(string $id):string {
return sprintf('(#%s#)', $id);
}
|
36d1807a
Yarik
Big commit.
|
152
|
}
|