58743b31
Mihail
init commit - bas...
|
1
2
3
4
|
<?php
namespace backend\controllers;
use Yii;
|
2fb5a757
Mihail
add menu and chec...
|
5
|
use yii\data\ActiveDataProvider;
|
58743b31
Mihail
init commit - bas...
|
6
|
use yii\filters\AccessControl;
|
54ada04a
Mihail
add base classes ...
|
7
|
use backend\components\base\BaseController;
|
58743b31
Mihail
init commit - bas...
|
8
|
use yii\filters\VerbFilter;
|
febcec0b
Mihail
final version par...
|
9
|
use backend\models\UploadFileParsingForm;
|
58743b31
Mihail
init commit - bas...
|
10
|
use yii\web\UploadedFile;
|
9bfcfcaf
Mihail
parser csv v1
|
11
|
use yii\data\ArrayDataProvider;
|
2a7a75b8
Mihail
add first version...
|
12
|
use yii\multiparser\DynamicFormHelper;
|
7a80e74c
Mihail
add DynamicFormHe...
|
13
|
use backend\components\parsers\CustomParserConfigurator;
|
4828b892
Mihail
after merge with ...
|
14
15
|
use backend\models\ImportersFiles;
use backend\models\Importers;
|
d7f6bdbb
Mihail
add Importers fil...
|
16
|
use yii\base\ErrorException;
|
4828b892
Mihail
after merge with ...
|
17
|
use common\components\PriceWriter;
|
02e174a3
Mihail
work with custome...
|
18
|
use common\components\CustomVarDamp;
|
58743b31
Mihail
init commit - bas...
|
19
20
|
/**
|
febcec0b
Mihail
final version par...
|
21
|
* Parser controller
|
58743b31
Mihail
init commit - bas...
|
22
|
*/
|
54ada04a
Mihail
add base classes ...
|
23
|
class ParserController extends BaseController
|
58743b31
Mihail
init commit - bas...
|
24
|
{
|
2509e17e
Administrator
JSON
|
25
|
public $layout = "/column";
|
d7f6bdbb
Mihail
add Importers fil...
|
26
|
|
58743b31
Mihail
init commit - bas...
|
27
28
29
30
31
32
33
34
35
36
|
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
|
58743b31
Mihail
init commit - bas...
|
37
38
39
40
41
|
'allow' => true,
'roles' => ['@'],
],
],
],
|
02e174a3
Mihail
work with custome...
|
42
43
44
45
46
47
|
// 'verbs' => [
// 'class' => VerbFilter::className(),
// 'actions' => [
// 'logout' => ['post'],
// ],
// ],
|
58743b31
Mihail
init commit - bas...
|
48
49
50
|
];
}
|
58743b31
Mihail
init commit - bas...
|
51
|
|
2509e17e
Administrator
JSON
|
52
|
|
1fa22312
Mihail
add auto upload a...
|
53
|
public function actionIndex($mode = 0)
|
58743b31
Mihail
init commit - bas...
|
54
|
{
|
5be26bf2
Mihail
edit upload form
|
55
|
$model = new UploadFileParsingForm();
|
1fa22312
Mihail
add auto upload a...
|
56
57
|
// установим режим, 0 - ручная загрузка, 1 - автозагрузка
$model->mode = $mode;
|
4828b892
Mihail
after merge with ...
|
58
|
//CustomVarDamp::dumpAndDie(phpinfo());
|
2509e17e
Administrator
JSON
|
59
60
61
|
return $this->render('index', ['model' => $model]);
}
|
4828b892
Mihail
after merge with ...
|
62
|
public function actionError()
|
d7f6bdbb
Mihail
add Importers fil...
|
63
|
{
|
4828b892
Mihail
after merge with ...
|
64
65
66
67
68
|
$exception = Yii::$app->errorHandler->exception;
if ($exception !== null) {
return $this->render('error', ['message' => $exception->getMessage()]);
}
}
|
1fa22312
Mihail
add auto upload a...
|
69
|
|
4828b892
Mihail
after merge with ...
|
70
71
|
public function actionResults($mode = 0)
{
|
1fa22312
Mihail
add auto upload a...
|
72
|
$model = new UploadFileParsingForm(['mode' => $mode]);
|
7a80e74c
Mihail
add DynamicFormHe...
|
73
|
$data = [];
|
febcec0b
Mihail
final version par...
|
74
|
if ($model->load(Yii::$app->request->post())) {
|
58743b31
Mihail
init commit - bas...
|
75
|
$model->file = UploadedFile::getInstance($model, 'file');
|
1fa22312
Mihail
add auto upload a...
|
76
|
// первый проход - валидируем, сохраняем файл, ложим в кеш (для ручной загрузки) отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся)
|
165348a4
Mihail
draft commit
|
77
|
if ($model->validate()) {
|
1fa22312
Mihail
add auto upload a...
|
78
|
// запишем дату загрузки файла в таблицу файлов поставщика (ImportersFiles)
|
4828b892
Mihail
after merge with ...
|
79
|
$files_model = new ImportersFiles();
|
1fa22312
Mihail
add auto upload a...
|
80
|
// id поставщика получим из конфигурации
|
4828b892
Mihail
after merge with ...
|
81
|
$files_model->load(['ImportersFiles' => $model->toArray()]);
|
1fa22312
Mihail
add auto upload a...
|
82
83
84
|
try {
$files_model->save();
} catch (ErrorException $e) {
|
4828b892
Mihail
after merge with ...
|
85
86
|
// CustomVarDamp::dump($e->getMessage());
throw $e;
|
1fa22312
Mihail
add auto upload a...
|
87
88
|
}
// получим id только что записанной записи - его запишем в название файла
|
0b2baee3
Mihail
fix errors with w...
|
89
|
$model->record_id = $files_model->find()
|
1fa22312
Mihail
add auto upload a...
|
90
91
92
93
94
|
->where(['importer_id' => $files_model->importer_id])
->orderBy(['id' => SORT_DESC])
->one()
->id;
|
0b2baee3
Mihail
fix errors with w...
|
95
|
$file_name = $model->record_id . '.' . $model->file->extension;
|
1fa22312
Mihail
add auto upload a...
|
96
97
98
99
100
101
|
if ($model->mode) {
$model->file_path = Yii::getAlias('@auto_upload') . '/' . $file_name;
} else {
$model->file_path = Yii::getAlias('@manual_upload') . '/' . $file_name;
}
|
2509e17e
Administrator
JSON
|
102
|
|
2fb5a757
Mihail
add menu and chec...
|
103
|
$model->file->saveAs($model->file_path);
|
1fa22312
Mihail
add auto upload a...
|
104
105
106
107
108
109
110
111
|
// для авто загрузки, обработка завершена
if ($model->mode) {
$model->success = true;
return $this->render('index', ['model' => $model]);
}
// === ручная загрузка ===========
|
d7f6bdbb
Mihail
add Importers fil...
|
112
|
//запускаем парсинг
|
2fb5a757
Mihail
add menu and chec...
|
113
|
$data = $model->readFile();
|
d7f6bdbb
Mihail
add Importers fil...
|
114
115
116
117
|
// сохраняем в кеш отпарсенные даные
Yii::$app->getCache()->set('parser_data', json_encode($data));
// сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
Yii::$app->getCache()->set('parser_configuration', serialize($model));
|
2509e17e
Administrator
JSON
|
118
|
|
2509e17e
Administrator
JSON
|
119
|
|
1fa22312
Mihail
add auto upload a...
|
120
121
122
123
124
125
126
127
|
} else {
// не прошла валидация форма загрузки файлов
//@todo - отправка на страницу ошибок
$errors_arr = $model->getErrors();
foreach ($errors_arr as $error) {
CustomVarDamp::dump(array_values($error));
}
die;
|
58743b31
Mihail
init commit - bas...
|
128
|
}
|
d7f6bdbb
Mihail
add Importers fil...
|
129
130
|
// листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные
} else if (Yii::$app->getCache()->get('parser_data')) {
|
2509e17e
Administrator
JSON
|
131
|
|
d7f6bdbb
Mihail
add Importers fil...
|
132
|
$data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
|
2509e17e
Administrator
JSON
|
133
|
|
58743b31
Mihail
init commit - bas...
|
134
135
|
}
|
7a80e74c
Mihail
add DynamicFormHe...
|
136
137
138
139
140
141
142
|
$provider = new ArrayDataProvider([
'allModels' => $data,
'pagination' => [
'pageSize' => 10,
],
]);
|
d7f6bdbb
Mihail
add Importers fil...
|
143
144
|
//формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список)
$header_model = DynamicFormHelper::CreateDynamicModel(count($data[0]));
|
7a80e74c
Mihail
add DynamicFormHe...
|
145
|
|
7a80e74c
Mihail
add DynamicFormHe...
|
146
147
148
|
return $this->render('results',
['model' => $data,
'header_model' => $header_model,
|
d7f6bdbb
Mihail
add Importers fil...
|
149
150
|
// список колонок для выбора
'basic_column' => Yii::$app->multiparser->getConfiguration('csv', 'basic_column'),
|
7a80e74c
Mihail
add DynamicFormHe...
|
151
|
'dataProvider' => $provider]);
|
58743b31
Mihail
init commit - bas...
|
152
|
}
|
7a80e74c
Mihail
add DynamicFormHe...
|
153
|
|
d7f6bdbb
Mihail
add Importers fil...
|
154
155
|
public function actionWrite()
{
|
d7f6bdbb
Mihail
add Importers fil...
|
156
157
158
159
160
161
162
163
|
//получим колонки которые выбрал пользователь
$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'))]);
}
|
7a80e74c
Mihail
add DynamicFormHe...
|
164
|
|
d7f6bdbb
Mihail
add Importers fil...
|
165
166
|
// провалидируем выбранные колонки
if ($model->validate()) {
|
33d902b8
Mihail
add converter as ...
|
167
|
|
d7f6bdbb
Mihail
add Importers fil...
|
168
169
|
// валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
$arr = $model->toArray();
|
492d8ac1
Mihail
finishing with co...
|
170
|
|
d7f6bdbb
Mihail
add Importers fil...
|
171
172
173
174
175
|
// получим данные из кеша
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 {
|
4828b892
Mihail
after merge with ...
|
176
|
throw new \ErrorException('Ошибка кеша');
|
d7f6bdbb
Mihail
add Importers fil...
|
177
|
}
|
7a80e74c
Mihail
add DynamicFormHe...
|
178
|
|
d7f6bdbb
Mihail
add Importers fil...
|
179
180
181
182
|
// соотнесем отпарсенные данные с соответсивем полученным от пользователя
// для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
$data = \Yii::$app->multiparser->convertToAssocArray($data, $arr, 'attr_');
|
4828b892
Mihail
after merge with ...
|
183
184
185
186
187
188
|
// запустим специальный класс который запишет данные в таблицы связанные с прайсами
$writer = new PriceWriter();
$writer->configuration = $configuration;
$writer->data = $data;
$writer->mode = 0; //web-режим
if ( $writer->writeDataToDB() ) {
|
d7f6bdbb
Mihail
add Importers fil...
|
189
|
|
4828b892
Mihail
after merge with ...
|
190
191
192
193
|
$configuration['success'] = true;
// все прошло успешно - очищаем кеш
Yii::$app->getCache()->delete('parser_data');
Yii::$app->getCache()->delete('parser_configuration');
|
1fa22312
Mihail
add auto upload a...
|
194
|
|
4828b892
Mihail
after merge with ...
|
195
196
|
unlink($configuration['file_path']);
return $this->render('index', ['model' => $configuration]);
|
1fa22312
Mihail
add auto upload a...
|
197
|
|
4828b892
Mihail
after merge with ...
|
198
|
};
|
d7f6bdbb
Mihail
add Importers fil...
|
199
200
201
202
|
}
}
|
58743b31
Mihail
init commit - bas...
|
203
|
|
1fa22312
Mihail
add auto upload a...
|
204
205
|
public function actionAutoUpload()
{
|
4828b892
Mihail
after merge with ...
|
206
|
$query = Importers::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]);
|
1fa22312
Mihail
add auto upload a...
|
207
208
209
210
211
212
213
214
215
216
217
|
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
],
]);
return $this->render('check_price',
[
'dataProvider' => $provider]);
}
|
35764921
Mihail
add action and vi...
|
218
219
220
|
public function actionServerFiles ()
{
|
0ade45a9
Mihail
add ajax handler ...
|
221
|
$arr_id_files = [];
|
35764921
Mihail
add action and vi...
|
222
223
224
|
// получим список файлов которые ожидают к загрузке
foreach (glob(Yii::getAlias('@auto_upload') . '/*') as $server_file) {
$file_id = basename($server_file,".csv");
|
0ade45a9
Mihail
add ajax handler ...
|
225
|
$arr_id_files[] = (int) $file_id;
|
35764921
Mihail
add action and vi...
|
226
|
}
|
4828b892
Mihail
after merge with ...
|
227
|
$query = ImportersFiles::find()->where(['in', 'id', $arr_id_files])->orderBy(['upload_time' => SORT_DESC]);
|
35764921
Mihail
add action and vi...
|
228
229
230
231
232
233
234
235
236
237
238
239
|
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
],
]);
return $this->render('server-files',
[
'dataProvider' => $provider]);
}
|
0ade45a9
Mihail
add ajax handler ...
|
240
|
public function actionDelete ()
|
35764921
Mihail
add action and vi...
|
241
|
{
|
0ade45a9
Mihail
add ajax handler ...
|
242
|
if ( Yii::$app->request->isAjax ) {
|
35764921
Mihail
add action and vi...
|
243
|
|
4828b892
Mihail
after merge with ...
|
244
|
$files_model = new ImportersFiles();
|
0ade45a9
Mihail
add ajax handler ...
|
245
246
247
248
249
250
|
if ( isset(Yii::$app->request->post()['id'] )) {
$id = Yii::$app->request->post()['id'];
try {
$files_model->delete($id);
unlink(Yii::getAlias('@auto_upload') . '/' . $id . '.csv' );
|
0ade45a9
Mihail
add ajax handler ...
|
251
252
253
|
// сообщим скрипту что все ОК
echo 1;
} catch (ErrorException $e) {
|
35764921
Mihail
add action and vi...
|
254
|
|
4828b892
Mihail
after merge with ...
|
255
|
throw $e;
|
35764921
Mihail
add action and vi...
|
256
|
|
0ade45a9
Mihail
add ajax handler ...
|
257
258
|
}
}
|
35764921
Mihail
add action and vi...
|
259
260
|
}
|
35764921
Mihail
add action and vi...
|
261
|
}
|
4828b892
Mihail
after merge with ...
|
262
263
264
265
266
267
268
269
270
271
272
273
274
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
|
public function actionParse ()
{
foreach (glob(Yii::getAlias('@auto_upload') . '/*') as $file_path) {
$file_id = basename($file_path,".csv");
$importer_id = ImportersFiles::findOne(['id' => $file_id])->importer_id;
$keys = Importers::findOne( ['id' => $importer_id] )->keys;
$config = ['record_id' => $file_id,
'importer_id' => $importer_id,
'parser_config' => ['keys' => $keys,
'mode' => 'console']
];
if( $this->parseFileConsole( $file_path, $config ) ){
unlink( $file_path );
}
}
return $this->redirect('serverFiles');
}
protected function parseFileConsole( $file_path, $configuration ){
$parser_config = [];
if ( isset( $configuration['parser_config'] ) ) {
$parser_config = $configuration['parser_config'];
}
$data = Yii::$app->multiparser->parse( $file_path, $parser_config );
CustomVarDamp::dumpAndDie($data);
$writer = new PriceWriter();
$writer->configuration = $configuration;
$writer->data = $data;
$writer->mode = 1; //console-режим
if ( $writer->writeDataToDB() ){
//Console::output('It is working');
return true;
}
return false;
}
|
58743b31
Mihail
init commit - bas...
|
307
|
}
|