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
|
use yii\base\Model;
class Export extends Model
{
|
c70f24ea
Yarik
For Leha commit.
|
11
12
13
14
15
|
/**
* Language ID to export language tables
*
* @var int $lang
*/
|
96410438
Yarik
Project admin com...
|
16
17
18
19
|
public $lang;
public $file;
|
36d1807a
Yarik
Big commit.
|
20
21
22
23
|
public $errors = [];
public $output = [];
|
c70f24ea
Yarik
For Leha commit.
|
24
25
26
|
/**
* @inheritdoc
*/
|
96410438
Yarik
Project admin com...
|
27
28
29
30
31
32
33
34
35
36
|
public function rules()
{
return [
[
'lang',
'integer',
],
[
'lang',
'default',
|
8af13427
Yarik
For leha commit.
|
37
|
'value' => Language::getCurrent()->id,
|
96410438
Yarik
Project admin com...
|
38
39
40
41
|
],
];
}
|
c70f24ea
Yarik
For Leha commit.
|
42
43
44
45
46
47
48
49
|
/**
* Perform product export
*
* @param null|string $filename Export csv file name
* @param int $from Product start
*
* @return array
*/
|
4428da8c
Yarik
Almost all databa...
|
50
|
public function process($filename = null, $from = 0)
|
d8c1a2e0
Yarik
Big commit artbox
|
51
|
{
|
96410438
Yarik
Project admin com...
|
52
53
|
$limit = 100;
|
4428da8c
Yarik
Almost all databa...
|
54
|
if (empty( $filename )) {
|
36d1807a
Yarik
Big commit.
|
55
|
$filename = 'products_' . date('d_m_Y_H_i') . '.csv';
|
96410438
Yarik
Project admin com...
|
56
57
58
|
$handle = fopen(\Yii::getAlias('@storage/sync/') . $filename, "w");
} else {
$handle = fopen(\Yii::getAlias('@storage/sync/') . $filename, "a");
|
d8c1a2e0
Yarik
Big commit artbox
|
59
|
}
|
96410438
Yarik
Project admin com...
|
60
|
|
8af13427
Yarik
For leha commit.
|
61
|
$language = Language::findOne(\Yii::$app->session->get('export_lang', Language::getDefaultLanguage()->id));
|
96410438
Yarik
Project admin com...
|
62
|
Language::setCurrent($language->url);
|
5c2eb7c8
Yarik
Big commit almost...
|
63
|
|
72a992f5
Yarik
Import browser v1.0
|
64
65
66
|
/**
* @var Product[] $products
*/
|
36d1807a
Yarik
Big commit.
|
67
|
$products = Product::find()
|
af036678
Yarik
Image behaviors
|
68
|
->with('variantsWithFilters', 'brand.lang', 'categories.lang', 'filters', 'images')
|
96410438
Yarik
Project admin com...
|
69
70
71
|
->joinWith('lang', true, 'INNER JOIN')
->limit($limit)
->offset($from)
|
36d1807a
Yarik
Big commit.
|
72
|
->all();
|
96410438
Yarik
Project admin com...
|
73
74
75
|
$filesize = Product::find()
->joinWith('lang', true, 'INNER JOIN')
->count();
|
4428da8c
Yarik
Almost all databa...
|
76
|
foreach ($products as $product) {
|
36d1807a
Yarik
Big commit.
|
77
78
79
|
$mods = [];
$filterString = $this->convertFilterToString($product->filters);
|
4428da8c
Yarik
Almost all databa...
|
80
|
foreach ($product->variantsWithFilters as $variant) {
|
72a992f5
Yarik
Import browser v1.0
|
81
82
83
|
/**
* @var ProductVariant $variant
*/
|
8af13427
Yarik
For leha commit.
|
84
|
$color = $variant->lang->title;
|
4428da8c
Yarik
Almost all databa...
|
85
86
87
88
89
|
$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.
|
90
91
92
|
}
$fotos = [];
|
4428da8c
Yarik
Almost all databa...
|
93
|
foreach ($product->images as $image) {
|
af036678
Yarik
Image behaviors
|
94
95
|
$fotos[] = $image->image;
}
|
36d1807a
Yarik
Big commit.
|
96
97
|
$categories = [];
|
4428da8c
Yarik
Almost all databa...
|
98
|
foreach ($product->categories as $value) {
|
8af13427
Yarik
For leha commit.
|
99
|
$categories[] = $value->lang->title . $this->generateID($value->remote_id);
|
36d1807a
Yarik
Big commit.
|
100
101
102
103
104
|
}
$categories = implode(',', $categories);
$list = [
|
5c2eb7c8
Yarik
Big commit almost...
|
105
106
|
$categories,
//A - категории через запятую Название(remote_id)
|
4428da8c
Yarik
Almost all databa...
|
107
108
109
|
( ( !empty( $product->brand ) ) ? $product->brand->lang->title . $this->generateID(
$product->brand->remote_id
) : '' ),
|
5c2eb7c8
Yarik
Big commit almost...
|
110
|
//B - бренд Название(remote_id)
|
8af13427
Yarik
For leha commit.
|
111
|
$product->lang->title . $this->generateID($product->remote_id),
|
5c2eb7c8
Yarik
Big commit almost...
|
112
113
114
115
116
117
118
119
120
|
//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 - новая цена
|
4428da8c
Yarik
Almost all databa...
|
121
|
intval($product->is_discount),
|
5c2eb7c8
Yarik
Big commit almost...
|
122
123
124
125
126
127
128
129
130
131
132
|
//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
|
af036678
Yarik
Image behaviors
|
133
|
// Все последующие модификации: 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.
|
134
135
|
];
$to_write = array_merge($list, $mods);
|
36d1807a
Yarik
Big commit.
|
136
137
|
fputcsv($handle, $to_write, ';');
unset( $product );
|
d8c1a2e0
Yarik
Big commit artbox
|
138
|
}
|
36d1807a
Yarik
Big commit.
|
139
140
141
|
fclose($handle);
|
96410438
Yarik
Project admin com...
|
142
143
|
$from += $limit;
$end = false;
|
4428da8c
Yarik
Almost all databa...
|
144
|
if ($from > $filesize) {
|
96410438
Yarik
Project admin com...
|
145
146
147
148
149
150
151
152
153
154
|
$end = true;
}
$result = [
'end' => $end,
'from' => $from,
'totalsize' => $filesize,
'filename' => $filename,
];
|
4428da8c
Yarik
Almost all databa...
|
155
156
157
158
159
160
161
|
if ($end) {
$result = array_merge(
$result,
[
'link' => '/storage/sync/' . $filename,
]
);
|
96410438
Yarik
Project admin com...
|
162
163
164
|
}
return $result;
|
d8c1a2e0
Yarik
Big commit artbox
|
165
|
}
|
36d1807a
Yarik
Big commit.
|
166
|
|
c70f24ea
Yarik
For Leha commit.
|
167
168
169
170
171
172
173
174
|
/**
* Stringify filters for export
* * Result: [filterName1:filterValue11,filterValue12]*[filterName2:filterValue21,filterValue22]
*
* @param $filters
*
* @return string
*/
|
36d1807a
Yarik
Big commit.
|
175
176
|
public function convertFilterToString($filters)
{
|
c70f24ea
Yarik
For Leha commit.
|
177
|
$filtersArray = [];
|
72a992f5
Yarik
Import browser v1.0
|
178
179
180
|
/**
* @var TaxOption[] $filters
*/
|
4428da8c
Yarik
Almost all databa...
|
181
|
foreach ($filters as $filter) {
|
c70f24ea
Yarik
For Leha commit.
|
182
|
$filtersArray[ $filter->taxGroup->lang->title . $this->generateID(
|
4428da8c
Yarik
Almost all databa...
|
183
184
|
$filter->taxGroup->remote_id
) ][] = $filter->lang->value . $this->generateID($filter->remote_id);
|
36d1807a
Yarik
Big commit.
|
185
186
187
|
}
$filterString = [];
|
c70f24ea
Yarik
For Leha commit.
|
188
|
foreach ($filtersArray as $filterName => $filterRows) {
|
36d1807a
Yarik
Big commit.
|
189
190
191
192
|
$row = implode(',', $filterRows);
$filterString[] = "[{$filterName}:{$row}]";
}
return implode('*', $filterString);
|
d8c1a2e0
Yarik
Big commit artbox
|
193
|
}
|
72a992f5
Yarik
Import browser v1.0
|
194
|
|
c70f24ea
Yarik
For Leha commit.
|
195
196
197
198
199
200
201
|
/**
* Generate remote ID string
*
* @param string $id Remote ID
*
* @return string Formatted remote ID
*/
|
5c2eb7c8
Yarik
Big commit almost...
|
202
203
|
private function generateID(string $id):string
{
|
72a992f5
Yarik
Import browser v1.0
|
204
205
|
return sprintf('(#%s#)', $id);
}
|
c70f24ea
Yarik
For Leha commit.
|
206
207
|
}
|