3cf42f5c
Mihail
init commit - bas...
|
1
2
3
4
|
<?php
namespace backend\controllers;
use Yii;
|
dd60c760
Mihail
add menu and chec...
|
5
|
use yii\data\ActiveDataProvider;
|
3cf42f5c
Mihail
init commit - bas...
|
6
|
use yii\filters\AccessControl;
|
693c46cb
Mihail
add base classes ...
|
7
|
use backend\components\base\BaseController;
|
3cf42f5c
Mihail
init commit - bas...
|
8
|
use yii\filters\VerbFilter;
|
b13b1c83
Mihail
final version par...
|
9
|
use backend\models\UploadFileParsingForm;
|
3cf42f5c
Mihail
init commit - bas...
|
10
|
use yii\web\UploadedFile;
|
fcd9278e
Mihail
parser csv v1
|
11
|
use yii\data\ArrayDataProvider;
|
74072a2a
Mihail
add first version...
|
12
|
use yii\multiparser\DynamicFormHelper;
|
474f35bf
Mihail
add DynamicFormHe...
|
13
|
use backend\components\parsers\CustomParserConfigurator;
|
8894c93a
Mihail
add Importers fil...
|
14
15
|
use backend\models\Details;
use backend\models\ImporterFiles;
|
9dd0fbe4
Mihail
add writing data ...
|
16
|
use backend\models\Importer;
|
8894c93a
Mihail
add Importers fil...
|
17
|
use yii\base\ErrorException;
|
dd60c760
Mihail
add menu and chec...
|
18
|
use yii\db\Query;
|
500b481a
Administrator
JSON
|
19
|
|
e774f057
Mihail
work with custome...
|
20
|
use common\components\CustomVarDamp;
|
3cf42f5c
Mihail
init commit - bas...
|
21
22
|
/**
|
b13b1c83
Mihail
final version par...
|
23
|
* Parser controller
|
3cf42f5c
Mihail
init commit - bas...
|
24
|
*/
|
693c46cb
Mihail
add base classes ...
|
25
|
class ParserController extends BaseController
|
3cf42f5c
Mihail
init commit - bas...
|
26
|
{
|
500b481a
Administrator
JSON
|
27
|
public $layout = "/column";
|
8894c93a
Mihail
add Importers fil...
|
28
|
|
3cf42f5c
Mihail
init commit - bas...
|
29
30
31
32
33
34
35
36
37
38
|
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
|
3cf42f5c
Mihail
init commit - bas...
|
39
40
41
42
43
|
'allow' => true,
'roles' => ['@'],
],
],
],
|
e774f057
Mihail
work with custome...
|
44
45
46
47
48
49
|
// 'verbs' => [
// 'class' => VerbFilter::className(),
// 'actions' => [
// 'logout' => ['post'],
// ],
// ],
|
3cf42f5c
Mihail
init commit - bas...
|
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
];
}
/**
* @inheritdoc
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
|
500b481a
Administrator
JSON
|
65
|
|
9e481998
Mihail
add auto upload a...
|
66
|
public function actionIndex($mode = 0)
|
3cf42f5c
Mihail
init commit - bas...
|
67
|
{
|
77422ce3
Mihail
edit upload form
|
68
|
$model = new UploadFileParsingForm();
|
9e481998
Mihail
add auto upload a...
|
69
70
|
// установим режим, 0 - ручная загрузка, 1 - автозагрузка
$model->mode = $mode;
|
9d57a9ea
Mihail
try organize ini ...
|
71
|
//CustomVarDamp::dumpAndDie(phpinfo());
|
500b481a
Administrator
JSON
|
72
73
74
|
return $this->render('index', ['model' => $model]);
}
|
9d57a9ea
Mihail
try organize ini ...
|
75
76
77
78
79
80
81
|
// public function beforeAction($action)
// {
// if($action->actionMethod ='actionResults'){
// CustomVarDamp::dumpAndDie(phpinfo());
// }
// }
|
9e481998
Mihail
add auto upload a...
|
82
|
public function actionResults($mode = 0)
|
8894c93a
Mihail
add Importers fil...
|
83
|
{
|
9e481998
Mihail
add auto upload a...
|
84
|
$model = new UploadFileParsingForm(['mode' => $mode]);
|
474f35bf
Mihail
add DynamicFormHe...
|
85
|
$data = [];
|
b13b1c83
Mihail
final version par...
|
86
|
if ($model->load(Yii::$app->request->post())) {
|
3cf42f5c
Mihail
init commit - bas...
|
87
|
$model->file = UploadedFile::getInstance($model, 'file');
|
9e481998
Mihail
add auto upload a...
|
88
|
// первый проход - валидируем, сохраняем файл, ложим в кеш (для ручной загрузки) отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся)
|
3663f570
Mihail
draft commit
|
89
|
if ($model->validate()) {
|
9e481998
Mihail
add auto upload a...
|
90
91
92
93
94
95
96
97
98
99
|
// запишем дату загрузки файла в таблицу файлов поставщика (ImportersFiles)
$files_model = new ImporterFiles();
// id поставщика получим из конфигурации
$files_model->load(['ImporterFiles' => $model->toArray()]);
try {
$files_model->save();
} catch (ErrorException $e) {
CustomVarDamp::dump($e->getMessage());
}
// получим id только что записанной записи - его запишем в название файла
|
01746976
Mihail
fix errors with w...
|
100
|
$model->record_id = $files_model->find()
|
9e481998
Mihail
add auto upload a...
|
101
102
103
104
105
|
->where(['importer_id' => $files_model->importer_id])
->orderBy(['id' => SORT_DESC])
->one()
->id;
|
01746976
Mihail
fix errors with w...
|
106
|
$file_name = $model->record_id . '.' . $model->file->extension;
|
9e481998
Mihail
add auto upload a...
|
107
108
109
110
111
112
|
if ($model->mode) {
$model->file_path = Yii::getAlias('@auto_upload') . '/' . $file_name;
} else {
$model->file_path = Yii::getAlias('@manual_upload') . '/' . $file_name;
}
|
500b481a
Administrator
JSON
|
113
|
|
dd60c760
Mihail
add menu and chec...
|
114
|
$model->file->saveAs($model->file_path);
|
9e481998
Mihail
add auto upload a...
|
115
116
117
118
119
120
121
122
|
// для авто загрузки, обработка завершена
if ($model->mode) {
$model->success = true;
return $this->render('index', ['model' => $model]);
}
// === ручная загрузка ===========
|
8894c93a
Mihail
add Importers fil...
|
123
|
//запускаем парсинг
|
dd60c760
Mihail
add menu and chec...
|
124
|
$data = $model->readFile();
|
8894c93a
Mihail
add Importers fil...
|
125
126
127
128
|
// сохраняем в кеш отпарсенные даные
Yii::$app->getCache()->set('parser_data', json_encode($data));
// сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
Yii::$app->getCache()->set('parser_configuration', serialize($model));
|
500b481a
Administrator
JSON
|
129
|
|
500b481a
Administrator
JSON
|
130
|
|
9e481998
Mihail
add auto upload a...
|
131
132
133
134
135
136
137
138
|
} else {
// не прошла валидация форма загрузки файлов
//@todo - отправка на страницу ошибок
$errors_arr = $model->getErrors();
foreach ($errors_arr as $error) {
CustomVarDamp::dump(array_values($error));
}
die;
|
3cf42f5c
Mihail
init commit - bas...
|
139
|
}
|
8894c93a
Mihail
add Importers fil...
|
140
141
|
// листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные
} else if (Yii::$app->getCache()->get('parser_data')) {
|
500b481a
Administrator
JSON
|
142
|
|
8894c93a
Mihail
add Importers fil...
|
143
|
$data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
|
500b481a
Administrator
JSON
|
144
|
|
3cf42f5c
Mihail
init commit - bas...
|
145
146
|
}
|
474f35bf
Mihail
add DynamicFormHe...
|
147
148
149
150
151
152
153
|
$provider = new ArrayDataProvider([
'allModels' => $data,
'pagination' => [
'pageSize' => 10,
],
]);
|
8894c93a
Mihail
add Importers fil...
|
154
155
|
//формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список)
$header_model = DynamicFormHelper::CreateDynamicModel(count($data[0]));
|
474f35bf
Mihail
add DynamicFormHe...
|
156
|
|
474f35bf
Mihail
add DynamicFormHe...
|
157
158
159
|
return $this->render('results',
['model' => $data,
'header_model' => $header_model,
|
8894c93a
Mihail
add Importers fil...
|
160
161
|
// список колонок для выбора
'basic_column' => Yii::$app->multiparser->getConfiguration('csv', 'basic_column'),
|
474f35bf
Mihail
add DynamicFormHe...
|
162
|
'dataProvider' => $provider]);
|
3cf42f5c
Mihail
init commit - bas...
|
163
|
}
|
474f35bf
Mihail
add DynamicFormHe...
|
164
|
|
8894c93a
Mihail
add Importers fil...
|
165
166
|
public function actionWrite()
{
|
8894c93a
Mihail
add Importers fil...
|
167
168
169
170
171
172
173
174
|
//получим колонки которые выбрал пользователь
$arr_attributes = Yii::$app->request->post()['DynamicModel'];
//соберем модель по полученным данным
$model = DynamicFormHelper::CreateDynamicModel($arr_attributes);
//добавим правила валидации (колонки должны быть те что указаны в конфиге)
foreach ($arr_attributes as $key => $value) {
$model->addRule($key, 'in', ['range' => array_keys(Yii::$app->multiparser->getConfiguration('csv', 'basic_column'))]);
}
|
474f35bf
Mihail
add DynamicFormHe...
|
175
|
|
8894c93a
Mihail
add Importers fil...
|
176
177
|
// провалидируем выбранные колонки
if ($model->validate()) {
|
28253169
Mihail
add converter as ...
|
178
|
|
8894c93a
Mihail
add Importers fil...
|
179
180
|
// валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
$arr = $model->toArray();
|
aa518ad3
Mihail
finishing with co...
|
181
|
|
8894c93a
Mihail
add Importers fil...
|
182
183
184
185
186
187
188
|
// получим данные из кеша
if (Yii::$app->getCache()->get('parser_data') && Yii::$app->getCache()->get('parser_configuration')) {
$data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
$configuration = unserialize(Yii::$app->getCache()->get('parser_configuration'));
} else {
CustomVarDamp::dumpAndDie('Ошибка кеша');
}
|
474f35bf
Mihail
add DynamicFormHe...
|
189
|
|
8894c93a
Mihail
add Importers fil...
|
190
191
192
193
194
|
// соотнесем отпарсенные данные с соответсивем полученным от пользователя
// для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
$data = \Yii::$app->multiparser->convertToAssocArray($data, $arr, 'attr_');
|
9dd0fbe4
Mihail
add writing data ...
|
195
|
// 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
|
01746976
Mihail
fix errors with w...
|
196
197
|
// id загруженного файла получим из конфигурации
$files_model = ImporterFiles::findOne( $configuration->record_id );
|
9e481998
Mihail
add auto upload a...
|
198
|
|
01746976
Mihail
fix errors with w...
|
199
|
//$files_model->load(['ImporterFiles' => $configuration->toArray()]);
|
9e481998
Mihail
add auto upload a...
|
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
$update_date = date('Y-m-d H:i:s');
$files_model->time_start = $update_date;
// запишем дату начала загрузки
if (!$files_model->save()) {
CustomVarDamp::dumpAndDie($files_model->getErrors());
}
// 2. запишем полученные данные в таблицу товаров (Details)
$details_model = new Details();
// проверим все ли обязательные колонки были указаны пользователем
$details_model->load(['Details' => $data[0]]);
if ($details_model->validate()) {
// дополним данные значением импортера и даты обновления цены
|
01746976
Mihail
fix errors with w...
|
214
|
$data = \Yii::$app->multiparser->addColumns($data, ['IMPORT_ID' => $configuration->importer_id, 'timestamp' => $update_date]);
|
9e481998
Mihail
add auto upload a...
|
215
|
|
8894c93a
Mihail
add Importers fil...
|
216
|
try {
|
9e481998
Mihail
add auto upload a...
|
217
218
219
|
//@todo add transaction
// попытаемся вставить данные в БД с апдейтом по ключам
$details_model->ManualInsert($data);
|
8894c93a
Mihail
add Importers fil...
|
220
|
|
9e481998
Mihail
add auto upload a...
|
221
|
// 3. зафиксируем дату конца загрузки в файлах поставщика
|
8894c93a
Mihail
add Importers fil...
|
222
|
|
9e481998
Mihail
add auto upload a...
|
223
224
225
226
|
$files_model->time_end = date('Y-m-d H:i:s');
// CustomVarDamp::dumpAndDie($files_model);
if (!$files_model->save()) {
CustomVarDamp::dumpAndDie($files_model->getErrors());
|
8894c93a
Mihail
add Importers fil...
|
227
|
}
|
9e481998
Mihail
add auto upload a...
|
228
229
230
231
232
233
234
|
// 4. зафиксируем дату загрузки в таблице поставщиков
$imp_model = Importer::findOne($configuration['importer_id']);
$imp_model->price_date_update = $update_date;
if (!$imp_model->save()) {
CustomVarDamp::dumpAndDie($imp_model->getErrors());
|
8894c93a
Mihail
add Importers fil...
|
235
|
}
|
9e481998
Mihail
add auto upload a...
|
236
237
238
239
|
$configuration['success'] = true;
// все прошло успешно - очищаем кеш
Yii::$app->getCache()->delete('parser_data');
Yii::$app->getCache()->delete('parser_configuration');
|
8894c93a
Mihail
add Importers fil...
|
240
|
|
9e481998
Mihail
add auto upload a...
|
241
|
unlink($configuration['file_path']);
|
9e481998
Mihail
add auto upload a...
|
242
243
244
245
246
247
248
249
250
251
252
|
return $this->render('index', ['model' => $configuration]);
} catch (ErrorException $e) {
CustomVarDamp::dump($e->getMessage());
}
}
if ($details_model->hasErrors()) {
$errors_arr = $details_model->getErrors();
foreach ($errors_arr as $error) {
CustomVarDamp::dump(array_values($error));
}
|
3cf42f5c
Mihail
init commit - bas...
|
253
|
|
8894c93a
Mihail
add Importers fil...
|
254
255
256
257
258
259
|
}
}
}
|
3cf42f5c
Mihail
init commit - bas...
|
260
|
|
9e481998
Mihail
add auto upload a...
|
261
262
|
public function actionAutoUpload()
{
|
9e481998
Mihail
add auto upload a...
|
263
264
265
266
267
268
269
270
271
272
273
274
|
$query = Importer::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]);
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
],
]);
return $this->render('check_price',
[
'dataProvider' => $provider]);
}
|
9075f464
Mihail
add action and vi...
|
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
|
public function actionServerFiles ()
{
$arr_id = [];
// получим список файлов которые ожидают к загрузке
foreach (glob(Yii::getAlias('@auto_upload') . '/*') as $server_file) {
$file_id = basename($server_file,".csv");
$arr_id[] = (int) $file_id;
}
$query = ImporterFiles::find()->where(['in', 'id', $arr_id])->orderBy(['upload_time' => SORT_DESC]);
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
],
]);
return $this->render('server-files',
[
'dataProvider' => $provider]);
}
public function actionDelete ($id)
{
if(Yii::$app->request->isAjax){
CustomVarDamp::dumpAndDie(1);
}
$files_model = new ImporterFiles();
try {
$files_model->delete($id);
unlink(Yii::getAlias('@auto_upload') . '/' . $id . '.csv' );
} catch (ErrorException $e) {
CustomVarDamp::dump($e->getMessage());
}
$this->redirect('server-files');
}
|
3cf42f5c
Mihail
init commit - bas...
|
318
|
}
|