Blame view

backend/controllers/ParserController.php 11.9 KB
58743b31   Mihail   init commit - bas...
1
2
3
  <?php
  namespace backend\controllers;
  
7c1201d1   Mihail   add validator for...
4
  use backend\models\Details;
c4da20f0   Mihail   temp commit - tes...
5
6
7
  use common\components\archives\ArchiveCreator;
  use common\components\mail\ImapMailReader;
  use common\components\mail\MailAttachmentsSaver;
7c1201d1   Mihail   add validator for...
8
  use common\components\ModelArrayValidator;
91fdff80   Mihail   merge with server
9
  use common\components\parsers\MailParser;
58743b31   Mihail   init commit - bas...
10
  use Yii;
2fb5a757   Mihail   add menu and chec...
11
  use yii\data\ActiveDataProvider;
58743b31   Mihail   init commit - bas...
12
  use yii\filters\AccessControl;
54ada04a   Mihail   add base classes ...
13
  use backend\components\base\BaseController;
58743b31   Mihail   init commit - bas...
14
  use yii\filters\VerbFilter;
febcec0b   Mihail   final version par...
15
  use backend\models\UploadFileParsingForm;
58743b31   Mihail   init commit - bas...
16
  use yii\web\UploadedFile;
9bfcfcaf   Mihail   parser csv v1
17
  use yii\data\ArrayDataProvider;
e8be11d4   Mihail   move multyparser ...
18
  use common\components\parsers\DynamicFormHelper;
942bad48   Mihail   adapt project to ...
19
20
  use backend\models\ImportersFiles;
  use backend\models\Importers;
d7f6bdbb   Mihail   add Importers fil...
21
  use yii\base\ErrorException;
f0dbd829   Mihail   add PriceWriter a...
22
  use common\components\PriceWriter;
02e174a3   Mihail   work with custome...
23
  use common\components\CustomVarDamp;
67adc788   Mihail   add converter int...
24
  use common\components\CustomArrayHelper;
58743b31   Mihail   init commit - bas...
25
26
  
  /**
febcec0b   Mihail   final version par...
27
   * Parser controller
58743b31   Mihail   init commit - bas...
28
   */
54ada04a   Mihail   add base classes ...
29
  class ParserController extends BaseController
58743b31   Mihail   init commit - bas...
30
  {
2509e17e   Administrator   JSON
31
      public $layout = "/column";
d7f6bdbb   Mihail   add Importers fil...
32
  
58743b31   Mihail   init commit - bas...
33
34
35
36
37
38
39
40
41
42
      /**
       * @inheritdoc
       */
      public function behaviors()
      {
          return [
              'access' => [
                  'class' => AccessControl::className(),
                  'rules' => [
                      [
58743b31   Mihail   init commit - bas...
43
44
45
46
47
                          'allow' => true,
                          'roles' => ['@'],
                      ],
                  ],
              ],
d11ec8b2   Mihail   fixed permissions...
48
49
50
51
52
53
  //            'verbs' => [
  //                'class' => VerbFilter::className(),
  //                'actions' => [
  //                    'logout' => ['post'],
  //                ],
  //            ],
58743b31   Mihail   init commit - bas...
54
55
56
          ];
      }
  
58743b31   Mihail   init commit - bas...
57
  
2509e17e   Administrator   JSON
58
  
1fa22312   Mihail   add auto upload a...
59
      public function actionIndex($mode = 0)
58743b31   Mihail   init commit - bas...
60
      {
5be26bf2   Mihail   edit upload form
61
          $model = new UploadFileParsingForm();
1fa22312   Mihail   add auto upload a...
62
63
          // установим режим, 0 - ручная загрузка, 1 - автозагрузка
          $model->mode = $mode;
2509e17e   Administrator   JSON
64
65
66
          return $this->render('index', ['model' => $model]);
      }
  
f0dbd829   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()]);
          }
      }
55cc05aa   Mihail   try organize ini ...
74
  
1fa22312   Mihail   add auto upload a...
75
      public function actionResults($mode = 0)
d7f6bdbb   Mihail   add Importers fil...
76
      {
7c1201d1   Mihail   add validator for...
77
          set_time_limit(600);
b6247a0e   Mihail   rewrite parser wr...
78
          $model = new UploadFileParsingForm( ['mode' => $mode] );
7a80e74c   Mihail   add DynamicFormHe...
79
          $data = [];
b6247a0e   Mihail   rewrite parser wr...
80
          if ( $model->load(Yii::$app->request->post()) ) {
7c1201d1   Mihail   add validator for...
81
82
              $model->file = UploadedFile::getInstance( $model, 'file' );
              // первый проход - валидируем, сохраняем файл,
b6247a0e   Mihail   rewrite parser wr...
83
              // ложим в кеш (для ручной загрузки) отпарсенные данные и параметры модели
b6247a0e   Mihail   rewrite parser wr...
84
85
86
              if ( $model->validate() ) {
                  // сохраним файл и создадим модель - ImportersFiles
                  $files_model = $this->saveParserFile($model);
1fa22312   Mihail   add auto upload a...
87
                  // для авто загрузки, обработка завершена
b6247a0e   Mihail   rewrite parser wr...
88
                  if ( $model->mode ) {
1fa22312   Mihail   add auto upload a...
89
                      $model->success = true;
1fa22312   Mihail   add auto upload a...
90
91
92
93
                      return $this->render('index', ['model' => $model]);
                  }
  
                  // === ручная загрузка ===========
d7f6bdbb   Mihail   add Importers fil...
94
                  //запускаем парсинг
b6247a0e   Mihail   rewrite parser wr...
95
                 $data = $this->parseDataFromFile( $files_model, $model );
2509e17e   Administrator   JSON
96
  
1fa22312   Mihail   add auto upload a...
97
98
              } else {
                  // не прошла валидация форма загрузки файлов
7c1201d1   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 );
58743b31   Mihail   init commit - bas...
104
              }
d7f6bdbb   Mihail   add Importers fil...
105
              // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные
b6247a0e   Mihail   rewrite parser wr...
106
          } else if ( Yii::$app->getCache()->get('parser_data') ) {
2509e17e   Administrator   JSON
107
  
d7f6bdbb   Mihail   add Importers fil...
108
              $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
2509e17e   Administrator   JSON
109
  
58743b31   Mihail   init commit - bas...
110
111
          }
  
7a80e74c   Mihail   add DynamicFormHe...
112
113
114
115
116
117
118
          $provider = new ArrayDataProvider([
              'allModels' => $data,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
  
40cac1b6   Mihail   add delete func i...
119
120
          $last_index = end( array_flip( $data[0] ) );
          $header_counts = $last_index + 1;
d7f6bdbb   Mihail   add Importers fil...
121
          //формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список)
40cac1b6   Mihail   add delete func i...
122
          $header_model = DynamicFormHelper::CreateDynamicModel( $header_counts );
7a80e74c   Mihail   add DynamicFormHe...
123
  
7a80e74c   Mihail   add DynamicFormHe...
124
125
126
          return $this->render('results',
              ['model' => $data,
                  'header_model' => $header_model,
d7f6bdbb   Mihail   add Importers fil...
127
128
                  // список колонок для выбора
                  'basic_column' => Yii::$app->multiparser->getConfiguration('csv', 'basic_column'),
7a80e74c   Mihail   add DynamicFormHe...
129
                  'dataProvider' => $provider]);
58743b31   Mihail   init commit - bas...
130
      }
7a80e74c   Mihail   add DynamicFormHe...
131
  
d7f6bdbb   Mihail   add Importers fil...
132
133
      public function actionWrite()
      {
d7f6bdbb   Mihail   add Importers fil...
134
135
136
137
          //получим колонки которые выбрал пользователь
          $arr_attributes = Yii::$app->request->post()['DynamicModel'];
          //соберем модель по полученным данным
          $model = DynamicFormHelper::CreateDynamicModel($arr_attributes);
7c1201d1   Mihail   add validator for...
138
          $details_model = new Details();
d7f6bdbb   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'))]);
          }
7a80e74c   Mihail   add DynamicFormHe...
143
  
7c1201d1   Mihail   add validator for...
144
145
146
          // установим режим проверки обязательных полей
          $details_model->setScenario('form_upload_validation');
          $model_validator = new ModelArrayValidator( $details_model );
d7f6bdbb   Mihail   add Importers fil...
147
          // провалидируем выбранные колонки
7c1201d1   Mihail   add validator for...
148
          if ( $model->validate() &&  $model_validator->validateRow( array_flip( $arr_attributes ) ) ) {
33d902b8   Mihail   add converter as ...
149
  
d7f6bdbb   Mihail   add Importers fil...
150
151
              // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
              $arr = $model->toArray();
492d8ac1   Mihail   finishing with co...
152
  
d7f6bdbb   Mihail   add Importers fil...
153
              // получим данные из кеша
b6247a0e   Mihail   rewrite parser wr...
154
              $this->parserCacheHandler( 0, $data, $configuration );
7a80e74c   Mihail   add DynamicFormHe...
155
  
d7f6bdbb   Mihail   add Importers fil...
156
157
              // соотнесем отпарсенные данные с соответсивем полученным от пользователя
              // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
67adc788   Mihail   add converter int...
158
              $data = CustomArrayHelper::createAssocArray( $data, $arr , 'attr_' );
d7f6bdbb   Mihail   add Importers fil...
159
  
f0dbd829   Mihail   add PriceWriter a...
160
161
              // запустим специальный класс который запишет данные в таблицы связанные с прайсами
              $writer = new PriceWriter();
edfa67b1   Mihail   add delete price ...
162
163
164
165
              $writer->setConfiguration( $configuration );
              $writer->setData($data);
              $writer->setMode(0); //web-режим
              if ( $writer->writePriceToDB() ) {
d7f6bdbb   Mihail   add Importers fil...
166
  
b6247a0e   Mihail   rewrite parser wr...
167
                  $this->parserCacheHandler( 2 );
1fa22312   Mihail   add auto upload a...
168
  
3be5e214   Mihail   fixed issues with...
169
170
                  if( file_exists($configuration['file_path']) )
                      unlink($configuration['file_path']);
7c1201d1   Mihail   add validator for...
171
172
                  $validated_type_msg =  $writer->hasValidationError() ?  'warning' : 'success';
                  Yii::$app->session->setFlash( $validated_type_msg, $writer->getValidatedMsg() );
f0dbd829   Mihail   add PriceWriter a...
173
                  return $this->render('index', ['model' => $configuration]);
d7f6bdbb   Mihail   add Importers fil...
174
  
f0dbd829   Mihail   add PriceWriter a...
175
              };
d7f6bdbb   Mihail   add Importers fil...
176
  
7c1201d1   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);
d7f6bdbb   Mihail   add Importers fil...
186
187
188
          }
  
      }
58743b31   Mihail   init commit - bas...
189
  
1fa22312   Mihail   add auto upload a...
190
191
      public function actionAutoUpload()
      {
942bad48   Mihail   adapt project to ...
192
          $query = Importers::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]);
1fa22312   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]);
      }
35764921   Mihail   add action and vi...
204
205
206
  
      public function actionServerFiles ()
      {
ef41533d   Mihail   temp commit - wor...
207
208
              $arr_id_files = [];
  
35764921   Mihail   add action and vi...
209
          // получим список файлов которые ожидают к загрузке
ea4ecf3d   Mihail   console csv parsing
210
          foreach ( glob(Yii::getAlias('@temp_upload') . '/*.csv' ) as $server_file ) {
35764921   Mihail   add action and vi...
211
              $file_id = basename($server_file,".csv");
0ade45a9   Mihail   add ajax handler ...
212
              $arr_id_files[] = (int) $file_id;
35764921   Mihail   add action and vi...
213
          }
181d3f16   Mihail   merge with server
214
  
7c1201d1   Mihail   add validator for...
215
          $query = ImportersFiles::find()->where(['in', 'id', $arr_id_files])->orderBy( ['upload_time' => SORT_DESC] );
35764921   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]);
      }
  
0ade45a9   Mihail   add ajax handler ...
228
      public function actionDelete ()
35764921   Mihail   add action and vi...
229
      {
0ade45a9   Mihail   add ajax handler ...
230
          if ( Yii::$app->request->isAjax ) {
35764921   Mihail   add action and vi...
231
  
942bad48   Mihail   adapt project to ...
232
              $files_model = new ImportersFiles();
0ade45a9   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);
ef41533d   Mihail   temp commit - wor...
237
                      unlink(Yii::getAlias('@temp_upload') . '/' . $id . '.csv' );
0ade45a9   Mihail   add ajax handler ...
238
239
240
                      // сообщим скрипту что все ОК
                      echo 1;
                  } catch (ErrorException  $e) {
35764921   Mihail   add action and vi...
241
  
1fe29bbe   Mihail   fixed parser and ...
242
                      throw $e;
35764921   Mihail   add action and vi...
243
  
0ade45a9   Mihail   add ajax handler ...
244
245
                  }
              }
35764921   Mihail   add action and vi...
246
247
          }
  
35764921   Mihail   add action and vi...
248
      }
1fe29bbe   Mihail   fixed parser and ...
249
  
ef41533d   Mihail   temp commit - wor...
250
251
      public function actionLaunchCroneUploads ()
      {
ef41533d   Mihail   temp commit - wor...
252
          foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) {
1fe29bbe   Mihail   fixed parser and ...
253
  
ef41533d   Mihail   temp commit - wor...
254
              $file_name = basename($server_file,".csv");
ea4ecf3d   Mihail   console csv parsing
255
              copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' );
ef41533d   Mihail   temp commit - wor...
256
257
  
          }
78684ed4   Mihail   add multiply pric...
258
  
ea4ecf3d   Mihail   console csv parsing
259
260
          Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' );
          $this->redirect('server-files');
1fe29bbe   Mihail   fixed parser and ...
261
  
78684ed4   Mihail   add multiply pric...
262
263
  //        $csv = new \console\controllers\ParserController( 'parse-csv', $this->module );
  //        $csv->actionParseCsv();
48b58a13   Mihail   finish with xml a...
264
      }
1fe29bbe   Mihail   fixed parser and ...
265
  
ef41533d   Mihail   temp commit - wor...
266
  
b6247a0e   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;
      }
1fd14fc9   Mihail   fixed errors with...
315
  
58743b31   Mihail   init commit - bas...
316
  }