3cf42f5c
Mihail
init commit - bas...
|
1
2
3
|
<?php
namespace backend\controllers;
|
209dad04
Mihail
add validator for...
|
4
|
use backend\models\Details;
|
4f3f27e8
Mihail
temp commit - tes...
|
5
6
7
|
use common\components\archives\ArchiveCreator;
use common\components\mail\ImapMailReader;
use common\components\mail\MailAttachmentsSaver;
|
209dad04
Mihail
add validator for...
|
8
|
use common\components\ModelArrayValidator;
|
1cc27986
Mihail
merge with server
|
9
|
use common\components\parsers\MailParser;
|
3cf42f5c
Mihail
init commit - bas...
|
10
|
use Yii;
|
dd60c760
Mihail
add menu and chec...
|
11
|
use yii\data\ActiveDataProvider;
|
3cf42f5c
Mihail
init commit - bas...
|
12
|
use yii\filters\AccessControl;
|
693c46cb
Mihail
add base classes ...
|
13
|
use backend\components\base\BaseController;
|
3cf42f5c
Mihail
init commit - bas...
|
14
|
use yii\filters\VerbFilter;
|
b13b1c83
Mihail
final version par...
|
15
|
use backend\models\UploadFileParsingForm;
|
3cf42f5c
Mihail
init commit - bas...
|
16
|
use yii\web\UploadedFile;
|
fcd9278e
Mihail
parser csv v1
|
17
|
use yii\data\ArrayDataProvider;
|
ad2e91f7
Mihail
move multyparser ...
|
18
|
use common\components\parsers\DynamicFormHelper;
|
1967135b
Mihail
adapt project to ...
|
19
20
|
use backend\models\ImportersFiles;
use backend\models\Importers;
|
8894c93a
Mihail
add Importers fil...
|
21
|
use yii\base\ErrorException;
|
2edfb901
Mihail
add PriceWriter a...
|
22
|
use common\components\PriceWriter;
|
e774f057
Mihail
work with custome...
|
23
|
use common\components\CustomVarDamp;
|
6215a30d
Mihail
add converter int...
|
24
|
use common\components\CustomArrayHelper;
|
3cf42f5c
Mihail
init commit - bas...
|
25
26
|
/**
|
b13b1c83
Mihail
final version par...
|
27
|
* Parser controller
|
3cf42f5c
Mihail
init commit - bas...
|
28
|
*/
|
693c46cb
Mihail
add base classes ...
|
29
|
class ParserController extends BaseController
|
3cf42f5c
Mihail
init commit - bas...
|
30
|
{
|
500b481a
Administrator
JSON
|
31
|
public $layout = "/column";
|
8894c93a
Mihail
add Importers fil...
|
32
|
|
3cf42f5c
Mihail
init commit - bas...
|
33
34
35
36
37
38
39
40
41
42
|
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
|
3cf42f5c
Mihail
init commit - bas...
|
43
44
45
46
47
|
'allow' => true,
'roles' => ['@'],
],
],
],
|
9755cb59
Mihail
fixed permissions...
|
48
49
50
51
52
53
|
// 'verbs' => [
// 'class' => VerbFilter::className(),
// 'actions' => [
// 'logout' => ['post'],
// ],
// ],
|
3cf42f5c
Mihail
init commit - bas...
|
54
55
56
|
];
}
|
3cf42f5c
Mihail
init commit - bas...
|
57
|
|
500b481a
Administrator
JSON
|
58
|
|
9e481998
Mihail
add auto upload a...
|
59
|
public function actionIndex($mode = 0)
|
3cf42f5c
Mihail
init commit - bas...
|
60
|
{
|
77422ce3
Mihail
edit upload form
|
61
|
$model = new UploadFileParsingForm();
|
9e481998
Mihail
add auto upload a...
|
62
63
|
// установим режим, 0 - ручная загрузка, 1 - автозагрузка
$model->mode = $mode;
|
500b481a
Administrator
JSON
|
64
65
66
|
return $this->render('index', ['model' => $model]);
}
|
2edfb901
Mihail
add PriceWriter a...
|
67
68
69
70
71
72
73
|
public function actionError()
{
$exception = Yii::$app->errorHandler->exception;
if ($exception !== null) {
return $this->render('error', ['message' => $exception->getMessage()]);
}
}
|
9d57a9ea
Mihail
try organize ini ...
|
74
|
|
9e481998
Mihail
add auto upload a...
|
75
|
public function actionResults($mode = 0)
|
8894c93a
Mihail
add Importers fil...
|
76
|
{
|
209dad04
Mihail
add validator for...
|
77
|
set_time_limit(600);
|
78641da2
Mihail
rewrite parser wr...
|
78
|
$model = new UploadFileParsingForm( ['mode' => $mode] );
|
474f35bf
Mihail
add DynamicFormHe...
|
79
|
$data = [];
|
78641da2
Mihail
rewrite parser wr...
|
80
|
if ( $model->load(Yii::$app->request->post()) ) {
|
209dad04
Mihail
add validator for...
|
81
82
|
$model->file = UploadedFile::getInstance( $model, 'file' );
// первый проход - валидируем, сохраняем файл,
|
78641da2
Mihail
rewrite parser wr...
|
83
|
// ложим в кеш (для ручной загрузки) отпарсенные данные и параметры модели
|
78641da2
Mihail
rewrite parser wr...
|
84
85
86
|
if ( $model->validate() ) {
// сохраним файл и создадим модель - ImportersFiles
$files_model = $this->saveParserFile($model);
|
9e481998
Mihail
add auto upload a...
|
87
|
// для авто загрузки, обработка завершена
|
78641da2
Mihail
rewrite parser wr...
|
88
|
if ( $model->mode ) {
|
9e481998
Mihail
add auto upload a...
|
89
|
$model->success = true;
|
9e481998
Mihail
add auto upload a...
|
90
91
92
93
|
return $this->render('index', ['model' => $model]);
}
// === ручная загрузка ===========
|
8894c93a
Mihail
add Importers fil...
|
94
|
//запускаем парсинг
|
78641da2
Mihail
rewrite parser wr...
|
95
|
$data = $this->parseDataFromFile( $files_model, $model );
|
500b481a
Administrator
JSON
|
96
|
|
9e481998
Mihail
add auto upload a...
|
97
98
|
} else {
// не прошла валидация форма загрузки файлов
|
209dad04
Mihail
add validator for...
|
99
100
101
102
103
|
$errors_str = '';
foreach ($model->getErrors() as $error) {
$errors_str .= implode( array_values($error) );
}
throw new ErrorException( $errors_str );
|
3cf42f5c
Mihail
init commit - bas...
|
104
|
}
|
8894c93a
Mihail
add Importers fil...
|
105
|
// листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные
|
78641da2
Mihail
rewrite parser wr...
|
106
|
} else if ( Yii::$app->getCache()->get('parser_data') ) {
|
500b481a
Administrator
JSON
|
107
|
|
8894c93a
Mihail
add Importers fil...
|
108
|
$data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
|
500b481a
Administrator
JSON
|
109
|
|
3cf42f5c
Mihail
init commit - bas...
|
110
111
|
}
|
474f35bf
Mihail
add DynamicFormHe...
|
112
113
114
115
116
117
118
|
$provider = new ArrayDataProvider([
'allModels' => $data,
'pagination' => [
'pageSize' => 10,
],
]);
|
38a1a201
Mihail
add delete func i...
|
119
120
|
$last_index = end( array_flip( $data[0] ) );
$header_counts = $last_index + 1;
|
8894c93a
Mihail
add Importers fil...
|
121
|
//формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список)
|
38a1a201
Mihail
add delete func i...
|
122
|
$header_model = DynamicFormHelper::CreateDynamicModel( $header_counts );
|
474f35bf
Mihail
add DynamicFormHe...
|
123
|
|
474f35bf
Mihail
add DynamicFormHe...
|
124
125
126
|
return $this->render('results',
['model' => $data,
'header_model' => $header_model,
|
8894c93a
Mihail
add Importers fil...
|
127
128
|
// список колонок для выбора
'basic_column' => Yii::$app->multiparser->getConfiguration('csv', 'basic_column'),
|
474f35bf
Mihail
add DynamicFormHe...
|
129
|
'dataProvider' => $provider]);
|
3cf42f5c
Mihail
init commit - bas...
|
130
|
}
|
474f35bf
Mihail
add DynamicFormHe...
|
131
|
|
8894c93a
Mihail
add Importers fil...
|
132
133
|
public function actionWrite()
{
|
8894c93a
Mihail
add Importers fil...
|
134
135
136
137
|
//получим колонки которые выбрал пользователь
$arr_attributes = Yii::$app->request->post()['DynamicModel'];
//соберем модель по полученным данным
$model = DynamicFormHelper::CreateDynamicModel($arr_attributes);
|
209dad04
Mihail
add validator for...
|
138
|
$details_model = new Details();
|
8894c93a
Mihail
add Importers fil...
|
139
140
141
142
|
//добавим правила валидации (колонки должны быть те что указаны в конфиге)
foreach ($arr_attributes as $key => $value) {
$model->addRule($key, 'in', ['range' => array_keys(Yii::$app->multiparser->getConfiguration('csv', 'basic_column'))]);
}
|
474f35bf
Mihail
add DynamicFormHe...
|
143
|
|
209dad04
Mihail
add validator for...
|
144
145
146
|
// установим режим проверки обязательных полей
$details_model->setScenario('form_upload_validation');
$model_validator = new ModelArrayValidator( $details_model );
|
8894c93a
Mihail
add Importers fil...
|
147
|
// провалидируем выбранные колонки
|
209dad04
Mihail
add validator for...
|
148
|
if ( $model->validate() && $model_validator->validateRow( array_flip( $arr_attributes ) ) ) {
|
28253169
Mihail
add converter as ...
|
149
|
|
8894c93a
Mihail
add Importers fil...
|
150
151
|
// валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
$arr = $model->toArray();
|
aa518ad3
Mihail
finishing with co...
|
152
|
|
8894c93a
Mihail
add Importers fil...
|
153
|
// получим данные из кеша
|
78641da2
Mihail
rewrite parser wr...
|
154
|
$this->parserCacheHandler( 0, $data, $configuration );
|
474f35bf
Mihail
add DynamicFormHe...
|
155
|
|
8894c93a
Mihail
add Importers fil...
|
156
157
|
// соотнесем отпарсенные данные с соответсивем полученным от пользователя
// для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
|
6215a30d
Mihail
add converter int...
|
158
|
$data = CustomArrayHelper::createAssocArray( $data, $arr , 'attr_' );
|
8894c93a
Mihail
add Importers fil...
|
159
|
|
2edfb901
Mihail
add PriceWriter a...
|
160
161
|
// запустим специальный класс который запишет данные в таблицы связанные с прайсами
$writer = new PriceWriter();
|
40acb401
Mihail
add delete price ...
|
162
163
164
165
|
$writer->setConfiguration( $configuration );
$writer->setData($data);
$writer->setMode(0); //web-режим
if ( $writer->writePriceToDB() ) {
|
8894c93a
Mihail
add Importers fil...
|
166
|
|
78641da2
Mihail
rewrite parser wr...
|
167
|
$this->parserCacheHandler( 2 );
|
9e481998
Mihail
add auto upload a...
|
168
|
|
3da8b25f
Mihail
fixed issues with...
|
169
170
|
if( file_exists($configuration['file_path']) )
unlink($configuration['file_path']);
|
209dad04
Mihail
add validator for...
|
171
172
|
$validated_type_msg = $writer->hasValidationError() ? 'warning' : 'success';
Yii::$app->session->setFlash( $validated_type_msg, $writer->getValidatedMsg() );
|
2edfb901
Mihail
add PriceWriter a...
|
173
|
return $this->render('index', ['model' => $configuration]);
|
8894c93a
Mihail
add Importers fil...
|
174
|
|
2edfb901
Mihail
add PriceWriter a...
|
175
|
};
|
8894c93a
Mihail
add Importers fil...
|
176
|
|
209dad04
Mihail
add validator for...
|
177
178
179
180
181
182
183
184
185
|
} else {
// не прошла валидация формы загрузки файлов
$errors_str = "Ошибка валидации формы загрузки файлов. ";
foreach ( $details_model->getErrors() as $error ) {
$errors_str .= implode(array_values($error));
}
throw new \ErrorException($errors_str);
|
8894c93a
Mihail
add Importers fil...
|
186
187
188
|
}
}
|
3cf42f5c
Mihail
init commit - bas...
|
189
|
|
9e481998
Mihail
add auto upload a...
|
190
191
|
public function actionAutoUpload()
{
|
1967135b
Mihail
adapt project to ...
|
192
|
$query = Importers::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]);
|
9e481998
Mihail
add auto upload a...
|
193
194
195
196
197
198
199
200
201
202
203
|
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
],
]);
return $this->render('check_price',
[
'dataProvider' => $provider]);
}
|
9075f464
Mihail
add action and vi...
|
204
205
206
|
public function actionServerFiles ()
{
|
34d480b7
Mihail
temp commit - wor...
|
207
208
|
$arr_id_files = [];
|
9075f464
Mihail
add action and vi...
|
209
|
// получим список файлов которые ожидают к загрузке
|
df629228
Mihail
console csv parsing
|
210
|
foreach ( glob(Yii::getAlias('@temp_upload') . '/*.csv' ) as $server_file ) {
|
9075f464
Mihail
add action and vi...
|
211
|
$file_id = basename($server_file,".csv");
|
ae27b007
Mihail
add ajax handler ...
|
212
|
$arr_id_files[] = (int) $file_id;
|
9075f464
Mihail
add action and vi...
|
213
|
}
|
98533894
Mihail
merge with server
|
214
|
|
209dad04
Mihail
add validator for...
|
215
|
$query = ImportersFiles::find()->where(['in', 'id', $arr_id_files])->orderBy( ['upload_time' => SORT_DESC] );
|
9075f464
Mihail
add action and vi...
|
216
217
218
219
220
221
222
223
224
225
226
227
|
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 10,
],
]);
return $this->render('server-files',
[
'dataProvider' => $provider]);
}
|
ae27b007
Mihail
add ajax handler ...
|
228
|
public function actionDelete ()
|
9075f464
Mihail
add action and vi...
|
229
|
{
|
ae27b007
Mihail
add ajax handler ...
|
230
|
if ( Yii::$app->request->isAjax ) {
|
9075f464
Mihail
add action and vi...
|
231
|
|
1967135b
Mihail
adapt project to ...
|
232
|
$files_model = new ImportersFiles();
|
ae27b007
Mihail
add ajax handler ...
|
233
234
235
236
|
if ( isset(Yii::$app->request->post()['id'] )) {
$id = Yii::$app->request->post()['id'];
try {
$files_model->delete($id);
|
34d480b7
Mihail
temp commit - wor...
|
237
|
unlink(Yii::getAlias('@temp_upload') . '/' . $id . '.csv' );
|
ae27b007
Mihail
add ajax handler ...
|
238
239
240
|
// сообщим скрипту что все ОК
echo 1;
} catch (ErrorException $e) {
|
9075f464
Mihail
add action and vi...
|
241
|
|
93e39994
Mihail
fixed parser and ...
|
242
|
throw $e;
|
9075f464
Mihail
add action and vi...
|
243
|
|
ae27b007
Mihail
add ajax handler ...
|
244
245
|
}
}
|
9075f464
Mihail
add action and vi...
|
246
247
|
}
|
9075f464
Mihail
add action and vi...
|
248
|
}
|
93e39994
Mihail
fixed parser and ...
|
249
|
|
34d480b7
Mihail
temp commit - wor...
|
250
251
|
public function actionLaunchCroneUploads ()
{
|
34d480b7
Mihail
temp commit - wor...
|
252
|
foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) {
|
93e39994
Mihail
fixed parser and ...
|
253
|
|
34d480b7
Mihail
temp commit - wor...
|
254
|
$file_name = basename($server_file,".csv");
|
df629228
Mihail
console csv parsing
|
255
|
copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' );
|
34d480b7
Mihail
temp commit - wor...
|
256
257
|
}
|
d3cf6647
Mihail
add multiply pric...
|
258
|
|
df629228
Mihail
console csv parsing
|
259
260
|
Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' );
$this->redirect('server-files');
|
93e39994
Mihail
fixed parser and ...
|
261
|
|
d3cf6647
Mihail
add multiply pric...
|
262
263
|
// $csv = new \console\controllers\ParserController( 'parse-csv', $this->module );
// $csv->actionParseCsv();
|
0bec979b
Mihail
finish with xml a...
|
264
|
}
|
93e39994
Mihail
fixed parser and ...
|
265
|
|
34d480b7
Mihail
temp commit - wor...
|
266
|
|
78641da2
Mihail
rewrite parser wr...
|
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
307
308
309
310
311
312
313
314
|
/**
* сохраняет файл на диск и регистрирует в ImportersFiles
* @param $model - модель с настройками
* @return ImportersFiles
* @throws ErrorException
* @throws \Exception
*/
protected function saveParserFile ($model)
{
$files_model = new ImportersFiles();
// id поставщика получим из конфигурации
$files_model->load(['ImportersFiles' => $model->toArray()]);
try {
$files_model->save();
} catch (ErrorException $e) {
throw $e;
}
// получим id только что записанной записи - его запишем в название файла
$model->record_id = $files_model->id;
$file_name = $model->record_id . '.' . $model->file->extension;
if ($model->mode) {
$model->file_path = Yii::getAlias('@temp_upload') . '/' . $file_name;
} else {
$model->file_path = Yii::getAlias('@manual_upload') . '/' . $file_name;
}
$model->file->saveAs($model->file_path);
return $files_model;
}
protected function parseDataFromFile ( $files_model, $model )
{
// доп. опции для парсера
$options = ['converter_conf' =>
['importer_id' => $files_model->importer_id]
];
if( ! $model->action ) // обработка с кастомным разделителем
$options['$delimiter'] = $model->delimiter;
$data = $model->readFile( $options );
// сохраняем в кеш отпарсенные даные
$this->parserCacheHandler( 1, $data, $model );
return $data;
}
|
1fae1653
Mihail
fixed errors with...
|
315
|
|
3cf42f5c
Mihail
init commit - bas...
|
316
|
}
|