Blame view

backend/controllers/ParserController.php 12.9 KB
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;
942bad48   Mihail   adapt project to ...
14
15
  use backend\models\ImportersFiles;
  use backend\models\Importers;
d7f6bdbb   Mihail   add Importers fil...
16
  use yii\base\ErrorException;
f0dbd829   Mihail   add PriceWriter a...
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;
55cc05aa   Mihail   try organize ini ...
58
          //CustomVarDamp::dumpAndDie(phpinfo());
2509e17e   Administrator   JSON
59
60
61
          return $this->render('index', ['model' => $model]);
      }
  
f0dbd829   Mihail   add PriceWriter a...
62
63
64
65
66
67
68
      public function actionError()
      {
          $exception = Yii::$app->errorHandler->exception;
          if ($exception !== null) {
              return $this->render('error', ['message' => $exception->getMessage()]);
          }
      }
55cc05aa   Mihail   try organize ini ...
69
  
1fa22312   Mihail   add auto upload a...
70
      public function actionResults($mode = 0)
d7f6bdbb   Mihail   add Importers fil...
71
      {
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)
942bad48   Mihail   adapt project to ...
79
                  $files_model = new ImportersFiles();
1fa22312   Mihail   add auto upload a...
80
                  // id поставщика получим из конфигурации
942bad48   Mihail   adapt project to ...
81
                  $files_model->load(['ImportersFiles' => $model->toArray()]);
1fa22312   Mihail   add auto upload a...
82
83
84
                  try {
                      $files_model->save();
                  } catch (ErrorException  $e) {
f0dbd829   Mihail   add PriceWriter a...
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
  
                  if ($model->mode) {
ef41533d   Mihail   temp commit - wor...
98
                      $model->file_path = Yii::getAlias('@temp_upload') . '/' . $file_name;
1fa22312   Mihail   add auto upload a...
99
100
101
                  } 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
  
                  // для авто загрузки, обработка завершена
                  if ($model->mode) {
                      $model->success = true;
ef41533d   Mihail   temp commit - wor...
108
  
1fa22312   Mihail   add auto upload a...
109
110
111
112
                      return $this->render('index', ['model' => $model]);
                  }
  
                  // === ручная загрузка ===========
d7f6bdbb   Mihail   add Importers fil...
113
                  //запускаем парсинг
2fb5a757   Mihail   add menu and chec...
114
                  $data = $model->readFile();
d7f6bdbb   Mihail   add Importers fil...
115
116
117
118
                  // сохраняем в кеш отпарсенные даные
                  Yii::$app->getCache()->set('parser_data', json_encode($data));
                  // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
                  Yii::$app->getCache()->set('parser_configuration', serialize($model));
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 {
f0dbd829   Mihail   add PriceWriter a...
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_');
  
f0dbd829   Mihail   add PriceWriter a...
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
  
f0dbd829   Mihail   add PriceWriter a...
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
  
f0dbd829   Mihail   add PriceWriter a...
195
196
                  unlink($configuration['file_path']);
                  return $this->render('index', ['model' => $configuration]);
d7f6bdbb   Mihail   add Importers fil...
197
  
f0dbd829   Mihail   add PriceWriter a...
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()
      {
942bad48   Mihail   adapt project to ...
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 ()
      {
ef41533d   Mihail   temp commit - wor...
221
222
              $arr_id_files = [];
  
35764921   Mihail   add action and vi...
223
          // получим список файлов которые ожидают к загрузке
ea4ecf3d   Mihail   console csv parsing
224
          foreach ( glob(Yii::getAlias('@temp_upload') . '/*.csv' ) as $server_file ) {
35764921   Mihail   add action and vi...
225
              $file_id = basename($server_file,".csv");
0ade45a9   Mihail   add ajax handler ...
226
              $arr_id_files[] = (int) $file_id;
35764921   Mihail   add action and vi...
227
          }
181d3f16   Mihail   merge with server
228
  
942bad48   Mihail   adapt project to ...
229
          $query = ImportersFiles::find()->where(['in', 'id', $arr_id_files])->orderBy(['upload_time' => SORT_DESC]);
35764921   Mihail   add action and vi...
230
231
232
233
234
235
236
237
238
239
240
241
  
          $provider = new ActiveDataProvider([
              'query' => $query,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
          return $this->render('server-files',
              [
                  'dataProvider' => $provider]);
      }
  
0ade45a9   Mihail   add ajax handler ...
242
      public function actionDelete ()
35764921   Mihail   add action and vi...
243
      {
0ade45a9   Mihail   add ajax handler ...
244
          if ( Yii::$app->request->isAjax ) {
35764921   Mihail   add action and vi...
245
  
942bad48   Mihail   adapt project to ...
246
              $files_model = new ImportersFiles();
0ade45a9   Mihail   add ajax handler ...
247
248
249
250
              if ( isset(Yii::$app->request->post()['id'] )) {
                  $id = Yii::$app->request->post()['id'];
                  try {
                      $files_model->delete($id);
ef41533d   Mihail   temp commit - wor...
251
                      unlink(Yii::getAlias('@temp_upload') . '/' . $id . '.csv' );
0ade45a9   Mihail   add ajax handler ...
252
253
254
                      // сообщим скрипту что все ОК
                      echo 1;
                  } catch (ErrorException  $e) {
35764921   Mihail   add action and vi...
255
  
1fe29bbe   Mihail   fixed parser and ...
256
                      throw $e;
35764921   Mihail   add action and vi...
257
  
0ade45a9   Mihail   add ajax handler ...
258
259
                  }
              }
35764921   Mihail   add action and vi...
260
261
          }
  
35764921   Mihail   add action and vi...
262
      }
1fe29bbe   Mihail   fixed parser and ...
263
  
ef41533d   Mihail   temp commit - wor...
264
265
      public function actionLaunchCroneUploads ()
      {
99ab22f3   Mihail   fixed convert to ...
266
267
268
269
270
271
272
273
274
275
  //        foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) {
  //
  //            $file_name = basename($server_file,".csv");
  //           // rename( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv');
  //            copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' );
  //
  //        }
  //        Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' );
  //        $this->redirect('server-files');
          $this->actionParseXml();
1fe29bbe   Mihail   fixed parser and ...
276
  
99ab22f3   Mihail   fixed convert to ...
277
278
279
      }
  
      protected function parseFileConsole( $file_path, $configuration ){
ef41533d   Mihail   temp commit - wor...
280
  
99ab22f3   Mihail   fixed convert to ...
281
282
283
284
285
286
          if( !file_exists( $file_path ) )
              throw new ErrorException("$file_path - файл не найден!");
  
          $parser_config = [];
          if ( isset( $configuration['parser_config'] ) ) {
              $parser_config = $configuration['parser_config'];
ef41533d   Mihail   temp commit - wor...
287
          }
99ab22f3   Mihail   fixed convert to ...
288
289
290
291
292
293
294
295
296
297
298
299
          $data = \Yii::$app->multiparser->parse( $file_path, $parser_config );
          if (! $data) {
              // @todo переделать, что бы ошибка автоматически останавливала сценарий
              return false;
          }
  
          $writer = new PriceWriter();
          $writer->configuration = $configuration;
          $writer->data = $data;
          $writer->mode = 1; //console-режим
  
          if ( $writer->writeDataToDB() ){
1fe29bbe   Mihail   fixed parser and ...
300
  
99ab22f3   Mihail   fixed convert to ...
301
302
303
304
305
              return true;
          }
  
          return false;
      }
1fe29bbe   Mihail   fixed parser and ...
306
  
99ab22f3   Mihail   fixed convert to ...
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
      public function actionParseXml ()
      {
         // \Yii::info('Начало загрузки файлов прайсов xml','parser');
          foreach (glob( \Yii::getAlias('@auto_upload') . '/*.xml' ) as $file_path) {
              $file_name = basename( $file_path,".xml" );
          //    \Yii::info("Обработка файла - $file_path",'parser');
  
              $config = ['record_id' => $file_name,
                  'importer_id' => 1,
                  'parser_config' => [
                      'mode' => 'console']
              ];
              if( $this->parseFileConsole( $file_path, $config ) ){
                  unlink( \Yii::getAlias('@auto_upload') . '/' . $file_name . '.xml' );
          //        \Yii::info("Загрузка файла - $file_path успешно завершена",'parser');
              } else{
          //        \Yii::error( "Загрузка файла - $file_path завершена с ошибкой", 'parser' );
              }
          }
      }
ef41533d   Mihail   temp commit - wor...
327
  
58743b31   Mihail   init commit - bas...
328
  }