Blame view

backend/controllers/ParserController.php 11.5 KB
58743b31   Mihail   init commit - bas...
1
2
3
  <?php
  namespace backend\controllers;
  
7c1201d1   Mihail   add validator for...
4
  use backend\models\Details;
25473a0d   Mihail   add parser trait ...
5
6
7
  use common\components\exceptions\CrossParsingException;
  use common\components\exceptions\PriceParsingException;
  use common\components\exceptions\RgParsingException;
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;
67adc788   Mihail   add converter int...
23
  use common\components\CustomArrayHelper;
25473a0d   Mihail   add parser trait ...
24
  use backend\components\traits\ParserTrait;
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
  {
25473a0d   Mihail   add parser trait ...
31
      use ParserTrait;
2509e17e   Administrator   JSON
32
      public $layout = "/column";
d7f6bdbb   Mihail   add Importers fil...
33
  
58743b31   Mihail   init commit - bas...
34
35
36
37
38
39
40
41
42
43
      /**
       * @inheritdoc
       */
      public function behaviors()
      {
          return [
              'access' => [
                  'class' => AccessControl::className(),
                  'rules' => [
                      [
58743b31   Mihail   init commit - bas...
44
45
46
47
48
                          'allow' => true,
                          'roles' => ['@'],
                      ],
                  ],
              ],
d11ec8b2   Mihail   fixed permissions...
49
50
51
52
53
54
  //            'verbs' => [
  //                'class' => VerbFilter::className(),
  //                'actions' => [
  //                    'logout' => ['post'],
  //                ],
  //            ],
58743b31   Mihail   init commit - bas...
55
56
57
          ];
      }
  
58743b31   Mihail   init commit - bas...
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
      public function actionError()
      {
          $exception = Yii::$app->errorHandler->exception;
25473a0d   Mihail   add parser trait ...
70
71
72
73
74
75
76
77
78
79
80
81
82
          $action_name = '';
  
          if ( $exception instanceof CrossParsingException ) {
              $action_name = ['crossing-upload/result'];
          }elseif ( $exception instanceof PriceParsingException ) {
              $action_name = ['results'];
          }elseif ( $exception instanceof RgParsingException ) {
              $action_name = ['rg-grup/results'];
          }
  
          if ( $exception !== null ) {
             $msg = $exception->getMessage();
              return $this->render( 'error', [ 'message' => $msg, 'action_name' => $action_name  ] );
f0dbd829   Mihail   add PriceWriter a...
83
84
          }
      }
55cc05aa   Mihail   try organize ini ...
85
  
1fa22312   Mihail   add auto upload a...
86
      public function actionResults($mode = 0)
d7f6bdbb   Mihail   add Importers fil...
87
      {
7c1201d1   Mihail   add validator for...
88
          set_time_limit(600);
b6247a0e   Mihail   rewrite parser wr...
89
          $model = new UploadFileParsingForm( ['mode' => $mode] );
7a80e74c   Mihail   add DynamicFormHe...
90
          $data = [];
b6247a0e   Mihail   rewrite parser wr...
91
          if ( $model->load(Yii::$app->request->post()) ) {
7c1201d1   Mihail   add validator for...
92
93
              $model->file = UploadedFile::getInstance( $model, 'file' );
              // первый проход - валидируем, сохраняем файл,
b6247a0e   Mihail   rewrite parser wr...
94
              // ложим в кеш (для ручной загрузки) отпарсенные данные и параметры модели
b6247a0e   Mihail   rewrite parser wr...
95
96
97
              if ( $model->validate() ) {
                  // сохраним файл и создадим модель - ImportersFiles
                  $files_model = $this->saveParserFile($model);
1fa22312   Mihail   add auto upload a...
98
                  // для авто загрузки, обработка завершена
b6247a0e   Mihail   rewrite parser wr...
99
                  if ( $model->mode ) {
1fa22312   Mihail   add auto upload a...
100
                      $model->success = true;
1fa22312   Mihail   add auto upload a...
101
102
                      return $this->render('index', ['model' => $model]);
                  }
1fa22312   Mihail   add auto upload a...
103
                  // === ручная загрузка ===========
d7f6bdbb   Mihail   add Importers fil...
104
                  //запускаем парсинг
b6247a0e   Mihail   rewrite parser wr...
105
                 $data = $this->parseDataFromFile( $files_model, $model );
2509e17e   Administrator   JSON
106
  
1fa22312   Mihail   add auto upload a...
107
108
              } else {
                  // не прошла валидация форма загрузки файлов
25473a0d   Mihail   add parser trait ...
109
                  $this->throwStringErrorException( $model , 'common\components\exceptions\PriceParsingException' );
58743b31   Mihail   init commit - bas...
110
              }
d7f6bdbb   Mihail   add Importers fil...
111
              // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные
b6247a0e   Mihail   rewrite parser wr...
112
          } else if ( Yii::$app->getCache()->get('parser_data') ) {
d7f6bdbb   Mihail   add Importers fil...
113
              $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
58743b31   Mihail   init commit - bas...
114
          }
25473a0d   Mihail   add parser trait ...
115
          return $this->renderResultView( $data );
58743b31   Mihail   init commit - bas...
116
      }
7a80e74c   Mihail   add DynamicFormHe...
117
  
d7f6bdbb   Mihail   add Importers fil...
118
119
      public function actionWrite()
      {
d7f6bdbb   Mihail   add Importers fil...
120
121
122
123
          //получим колонки которые выбрал пользователь
          $arr_attributes = Yii::$app->request->post()['DynamicModel'];
          //соберем модель по полученным данным
          $model = DynamicFormHelper::CreateDynamicModel($arr_attributes);
7c1201d1   Mihail   add validator for...
124
          $details_model = new Details();
d7f6bdbb   Mihail   add Importers fil...
125
126
127
128
          //добавим правила валидации (колонки должны быть те что указаны в конфиге)
          foreach ($arr_attributes as $key => $value) {
              $model->addRule($key, 'in', ['range' => array_keys(Yii::$app->multiparser->getConfiguration('csv', 'basic_column'))]);
          }
7a80e74c   Mihail   add DynamicFormHe...
129
  
7c1201d1   Mihail   add validator for...
130
131
132
          // установим режим проверки обязательных полей
          $details_model->setScenario('form_upload_validation');
          $model_validator = new ModelArrayValidator( $details_model );
d7f6bdbb   Mihail   add Importers fil...
133
          // провалидируем выбранные колонки
7c1201d1   Mihail   add validator for...
134
          if ( $model->validate() &&  $model_validator->validateRow( array_flip( $arr_attributes ) ) ) {
33d902b8   Mihail   add converter as ...
135
  
d7f6bdbb   Mihail   add Importers fil...
136
137
              // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
              $arr = $model->toArray();
492d8ac1   Mihail   finishing with co...
138
  
d7f6bdbb   Mihail   add Importers fil...
139
              // получим данные из кеша
b6247a0e   Mihail   rewrite parser wr...
140
              $this->parserCacheHandler( 0, $data, $configuration );
7a80e74c   Mihail   add DynamicFormHe...
141
  
d7f6bdbb   Mihail   add Importers fil...
142
143
              // соотнесем отпарсенные данные с соответсивем полученным от пользователя
              // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
67adc788   Mihail   add converter int...
144
              $data = CustomArrayHelper::createAssocArray( $data, $arr , 'attr_' );
d7f6bdbb   Mihail   add Importers fil...
145
  
f0dbd829   Mihail   add PriceWriter a...
146
147
              // запустим специальный класс который запишет данные в таблицы связанные с прайсами
              $writer = new PriceWriter();
edfa67b1   Mihail   add delete price ...
148
149
150
151
              $writer->setConfiguration( $configuration );
              $writer->setData($data);
              $writer->setMode(0); //web-режим
              if ( $writer->writePriceToDB() ) {
d7f6bdbb   Mihail   add Importers fil...
152
  
b6247a0e   Mihail   rewrite parser wr...
153
                  $this->parserCacheHandler( 2 );
1fa22312   Mihail   add auto upload a...
154
  
3be5e214   Mihail   fixed issues with...
155
156
                  if( file_exists($configuration['file_path']) )
                      unlink($configuration['file_path']);
7c1201d1   Mihail   add validator for...
157
158
                  $validated_type_msg =  $writer->hasValidationError() ?  'warning' : 'success';
                  Yii::$app->session->setFlash( $validated_type_msg, $writer->getValidatedMsg() );
25473a0d   Mihail   add parser trait ...
159
                 return $this->render('index', ['model' => $configuration]);
d7f6bdbb   Mihail   add Importers fil...
160
  
f0dbd829   Mihail   add PriceWriter a...
161
              };
d7f6bdbb   Mihail   add Importers fil...
162
  
7c1201d1   Mihail   add validator for...
163
164
165
          } else {
              // не прошла валидация формы загрузки файлов
              $errors_str = "Ошибка валидации формы загрузки файлов. ";
25473a0d   Mihail   add parser trait ...
166
              $this->throwStringErrorException( $details_model , 'common\components\exceptions\PriceParsingException', $errors_str );
d7f6bdbb   Mihail   add Importers fil...
167
168
169
          }
  
      }
58743b31   Mihail   init commit - bas...
170
  
1fa22312   Mihail   add auto upload a...
171
172
      public function actionAutoUpload()
      {
942bad48   Mihail   adapt project to ...
173
          $query = Importers::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]);
1fa22312   Mihail   add auto upload a...
174
175
176
177
178
179
180
181
182
183
184
  
          $provider = new ActiveDataProvider([
              'query' => $query,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
          return $this->render('check_price',
              [
                  'dataProvider' => $provider]);
      }
35764921   Mihail   add action and vi...
185
186
187
  
      public function actionServerFiles ()
      {
ef41533d   Mihail   temp commit - wor...
188
189
              $arr_id_files = [];
  
35764921   Mihail   add action and vi...
190
          // получим список файлов которые ожидают к загрузке
ea4ecf3d   Mihail   console csv parsing
191
          foreach ( glob(Yii::getAlias('@temp_upload') . '/*.csv' ) as $server_file ) {
35764921   Mihail   add action and vi...
192
              $file_id = basename($server_file,".csv");
0ade45a9   Mihail   add ajax handler ...
193
              $arr_id_files[] = (int) $file_id;
35764921   Mihail   add action and vi...
194
          }
181d3f16   Mihail   merge with server
195
  
7c1201d1   Mihail   add validator for...
196
          $query = ImportersFiles::find()->where(['in', 'id', $arr_id_files])->orderBy( ['upload_time' => SORT_DESC] );
35764921   Mihail   add action and vi...
197
198
199
200
201
202
203
204
205
206
207
208
  
          $provider = new ActiveDataProvider([
              'query' => $query,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
          return $this->render('server-files',
              [
                  'dataProvider' => $provider]);
      }
  
0ade45a9   Mihail   add ajax handler ...
209
      public function actionDelete ()
35764921   Mihail   add action and vi...
210
      {
0ade45a9   Mihail   add ajax handler ...
211
          if ( Yii::$app->request->isAjax ) {
35764921   Mihail   add action and vi...
212
  
942bad48   Mihail   adapt project to ...
213
              $files_model = new ImportersFiles();
0ade45a9   Mihail   add ajax handler ...
214
215
216
217
              if ( isset(Yii::$app->request->post()['id'] )) {
                  $id = Yii::$app->request->post()['id'];
                  try {
                      $files_model->delete($id);
ef41533d   Mihail   temp commit - wor...
218
                      unlink(Yii::getAlias('@temp_upload') . '/' . $id . '.csv' );
0ade45a9   Mihail   add ajax handler ...
219
220
221
                      // сообщим скрипту что все ОК
                      echo 1;
                  } catch (ErrorException  $e) {
35764921   Mihail   add action and vi...
222
  
1fe29bbe   Mihail   fixed parser and ...
223
                      throw $e;
35764921   Mihail   add action and vi...
224
  
0ade45a9   Mihail   add ajax handler ...
225
226
                  }
              }
35764921   Mihail   add action and vi...
227
228
          }
  
35764921   Mihail   add action and vi...
229
      }
1fe29bbe   Mihail   fixed parser and ...
230
  
ef41533d   Mihail   temp commit - wor...
231
232
      public function actionLaunchCroneUploads ()
      {
ef41533d   Mihail   temp commit - wor...
233
          foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) {
1fe29bbe   Mihail   fixed parser and ...
234
  
ef41533d   Mihail   temp commit - wor...
235
              $file_name = basename($server_file,".csv");
ea4ecf3d   Mihail   console csv parsing
236
              copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' );
ef41533d   Mihail   temp commit - wor...
237
238
  
          }
78684ed4   Mihail   add multiply pric...
239
  
ea4ecf3d   Mihail   console csv parsing
240
241
          Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' );
          $this->redirect('server-files');
1fe29bbe   Mihail   fixed parser and ...
242
  
78684ed4   Mihail   add multiply pric...
243
244
  //        $csv = new \console\controllers\ParserController( 'parse-csv', $this->module );
  //        $csv->actionParseCsv();
48b58a13   Mihail   finish with xml a...
245
      }
1fe29bbe   Mihail   fixed parser and ...
246
  
ef41533d   Mihail   temp commit - wor...
247
  
b6247a0e   Mihail   rewrite parser wr...
248
249
250
251
252
253
254
255
256
257
258
259
260
261
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
      /**
       * сохраняет файл на диск и регистрирует в 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...
296
  
25473a0d   Mihail   add parser trait ...
297
298
299
300
301
      protected function getBasicColumns()
      {
          return Yii::$app->multiparser->getConfiguration('csv', 'basic_column');
  
      }
58743b31   Mihail   init commit - bas...
302
  }