Blame view

backend/controllers/ParserController.php 11.2 KB
3cf42f5c   Mihail   init commit - bas...
1
2
3
  <?php
  namespace backend\controllers;
  
4f3f27e8   Mihail   temp commit - tes...
4
5
6
  use common\components\archives\ArchiveCreator;
  use common\components\mail\ImapMailReader;
  use common\components\mail\MailAttachmentsSaver;
1cc27986   Mihail   merge with server
7
  use common\components\parsers\MailParser;
3cf42f5c   Mihail   init commit - bas...
8
  use Yii;
dd60c760   Mihail   add menu and chec...
9
  use yii\data\ActiveDataProvider;
3cf42f5c   Mihail   init commit - bas...
10
  use yii\filters\AccessControl;
693c46cb   Mihail   add base classes ...
11
  use backend\components\base\BaseController;
3cf42f5c   Mihail   init commit - bas...
12
  use yii\filters\VerbFilter;
b13b1c83   Mihail   final version par...
13
  use backend\models\UploadFileParsingForm;
3cf42f5c   Mihail   init commit - bas...
14
  use yii\web\UploadedFile;
fcd9278e   Mihail   parser csv v1
15
  use yii\data\ArrayDataProvider;
74072a2a   Mihail   add first version...
16
  use yii\multiparser\DynamicFormHelper;
1967135b   Mihail   adapt project to ...
17
18
  use backend\models\ImportersFiles;
  use backend\models\Importers;
8894c93a   Mihail   add Importers fil...
19
  use yii\base\ErrorException;
2edfb901   Mihail   add PriceWriter a...
20
  use common\components\PriceWriter;
e774f057   Mihail   work with custome...
21
  use common\components\CustomVarDamp;
6215a30d   Mihail   add converter int...
22
  use common\components\CustomArrayHelper;
3cf42f5c   Mihail   init commit - bas...
23
24
  
  /**
b13b1c83   Mihail   final version par...
25
   * Parser controller
3cf42f5c   Mihail   init commit - bas...
26
   */
693c46cb   Mihail   add base classes ...
27
  class ParserController extends BaseController
3cf42f5c   Mihail   init commit - bas...
28
  {
500b481a   Administrator   JSON
29
      public $layout = "/column";
8894c93a   Mihail   add Importers fil...
30
  
3cf42f5c   Mihail   init commit - bas...
31
32
33
34
35
36
37
38
39
40
      /**
       * @inheritdoc
       */
      public function behaviors()
      {
          return [
              'access' => [
                  'class' => AccessControl::className(),
                  'rules' => [
                      [
3cf42f5c   Mihail   init commit - bas...
41
42
43
44
45
                          'allow' => true,
                          'roles' => ['@'],
                      ],
                  ],
              ],
9755cb59   Mihail   fixed permissions...
46
47
48
49
50
51
  //            'verbs' => [
  //                'class' => VerbFilter::className(),
  //                'actions' => [
  //                    'logout' => ['post'],
  //                ],
  //            ],
3cf42f5c   Mihail   init commit - bas...
52
53
54
          ];
      }
  
3cf42f5c   Mihail   init commit - bas...
55
  
500b481a   Administrator   JSON
56
  
9e481998   Mihail   add auto upload a...
57
      public function actionIndex($mode = 0)
3cf42f5c   Mihail   init commit - bas...
58
      {
77422ce3   Mihail   edit upload form
59
          $model = new UploadFileParsingForm();
9e481998   Mihail   add auto upload a...
60
61
          // установим режим, 0 - ручная загрузка, 1 - автозагрузка
          $model->mode = $mode;
500b481a   Administrator   JSON
62
63
64
          return $this->render('index', ['model' => $model]);
      }
  
2edfb901   Mihail   add PriceWriter a...
65
66
67
68
69
70
71
      public function actionError()
      {
          $exception = Yii::$app->errorHandler->exception;
          if ($exception !== null) {
              return $this->render('error', ['message' => $exception->getMessage()]);
          }
      }
9d57a9ea   Mihail   try organize ini ...
72
  
9e481998   Mihail   add auto upload a...
73
      public function actionResults($mode = 0)
8894c93a   Mihail   add Importers fil...
74
      {
78641da2   Mihail   rewrite parser wr...
75
          $model = new UploadFileParsingForm( ['mode' => $mode] );
474f35bf   Mihail   add DynamicFormHe...
76
          $data = [];
78641da2   Mihail   rewrite parser wr...
77
          if ( $model->load(Yii::$app->request->post()) ) {
3cf42f5c   Mihail   init commit - bas...
78
              $model->file = UploadedFile::getInstance($model, 'file');
78641da2   Mihail   rewrite parser wr...
79
80
81
82
83
84
85
              // первый проход - валидируем,
              // сохраняем файл,
              // ложим в кеш (для ручной загрузки) отпарсенные данные и параметры модели
              // (потом при записи в базу данных они пригодятся)
              if ( $model->validate() ) {
                  // сохраним файл и создадим модель - ImportersFiles
                  $files_model = $this->saveParserFile($model);
9e481998   Mihail   add auto upload a...
86
                  // для авто загрузки, обработка завершена
78641da2   Mihail   rewrite parser wr...
87
                  if ( $model->mode ) {
9e481998   Mihail   add auto upload a...
88
                      $model->success = true;
9e481998   Mihail   add auto upload a...
89
90
91
92
                      return $this->render('index', ['model' => $model]);
                  }
  
                  // === ручная загрузка ===========
8894c93a   Mihail   add Importers fil...
93
                  //запускаем парсинг
78641da2   Mihail   rewrite parser wr...
94
                 $data = $this->parseDataFromFile( $files_model, $model );
500b481a   Administrator   JSON
95
  
9e481998   Mihail   add auto upload a...
96
97
              } else {
                  // не прошла валидация форма загрузки файлов
4f3f27e8   Mihail   temp commit - tes...
98
99
100
101
102
103
  //                $errors_str = '';
  //                foreach ($model->getErrors() as $error) {
  //                    $errors_str .= implode( array_values($error) );
  //                }
  //               throw new ErrorException( $errors_str );
                  $model->throwStringErrorException();
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
138
139
140
141
          //получим колонки которые выбрал пользователь
          $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'))]);
          }
474f35bf   Mihail   add DynamicFormHe...
142
  
8894c93a   Mihail   add Importers fil...
143
144
          // провалидируем выбранные колонки
          if ($model->validate()) {
28253169   Mihail   add converter as ...
145
  
8894c93a   Mihail   add Importers fil...
146
147
              // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
              $arr = $model->toArray();
aa518ad3   Mihail   finishing with co...
148
  
8894c93a   Mihail   add Importers fil...
149
              // получим данные из кеша
78641da2   Mihail   rewrite parser wr...
150
              $this->parserCacheHandler( 0, $data, $configuration );
474f35bf   Mihail   add DynamicFormHe...
151
  
8894c93a   Mihail   add Importers fil...
152
153
              // соотнесем отпарсенные данные с соответсивем полученным от пользователя
              // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
6215a30d   Mihail   add converter int...
154
              $data = CustomArrayHelper::createAssocArray( $data, $arr , 'attr_' );
8894c93a   Mihail   add Importers fil...
155
  
2edfb901   Mihail   add PriceWriter a...
156
157
              // запустим специальный класс который запишет данные в таблицы связанные с прайсами
              $writer = new PriceWriter();
40acb401   Mihail   add delete price ...
158
159
160
161
              $writer->setConfiguration( $configuration );
              $writer->setData($data);
              $writer->setMode(0); //web-режим
              if ( $writer->writePriceToDB() ) {
8894c93a   Mihail   add Importers fil...
162
  
78641da2   Mihail   rewrite parser wr...
163
                  $this->parserCacheHandler( 2 );
9e481998   Mihail   add auto upload a...
164
  
3da8b25f   Mihail   fixed issues with...
165
166
167
                  if( file_exists($configuration['file_path']) )
                      unlink($configuration['file_path']);
  
78641da2   Mihail   rewrite parser wr...
168
                  Yii::$app->session->setFlash( $writer->getValidatedTypeMsg(), $writer->getValidatedMsg() );
2edfb901   Mihail   add PriceWriter a...
169
                  return $this->render('index', ['model' => $configuration]);
8894c93a   Mihail   add Importers fil...
170
  
2edfb901   Mihail   add PriceWriter a...
171
              };
8894c93a   Mihail   add Importers fil...
172
173
174
175
  
          }
  
      }
3cf42f5c   Mihail   init commit - bas...
176
  
9e481998   Mihail   add auto upload a...
177
178
      public function actionAutoUpload()
      {
1967135b   Mihail   adapt project to ...
179
          $query = Importers::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]);
9e481998   Mihail   add auto upload a...
180
181
182
183
184
185
186
187
188
189
190
  
          $provider = new ActiveDataProvider([
              'query' => $query,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
          return $this->render('check_price',
              [
                  'dataProvider' => $provider]);
      }
9075f464   Mihail   add action and vi...
191
192
193
  
      public function actionServerFiles ()
      {
34d480b7   Mihail   temp commit - wor...
194
195
              $arr_id_files = [];
  
9075f464   Mihail   add action and vi...
196
          // получим список файлов которые ожидают к загрузке
df629228   Mihail   console csv parsing
197
          foreach ( glob(Yii::getAlias('@temp_upload') . '/*.csv' ) as $server_file ) {
9075f464   Mihail   add action and vi...
198
              $file_id = basename($server_file,".csv");
ae27b007   Mihail   add ajax handler ...
199
              $arr_id_files[] = (int) $file_id;
9075f464   Mihail   add action and vi...
200
          }
98533894   Mihail   merge with server
201
  
1967135b   Mihail   adapt project to ...
202
          $query = ImportersFiles::find()->where(['in', 'id', $arr_id_files])->orderBy(['upload_time' => SORT_DESC]);
9075f464   Mihail   add action and vi...
203
204
205
206
207
208
209
210
211
212
213
214
  
          $provider = new ActiveDataProvider([
              'query' => $query,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
          return $this->render('server-files',
              [
                  'dataProvider' => $provider]);
      }
  
ae27b007   Mihail   add ajax handler ...
215
      public function actionDelete ()
9075f464   Mihail   add action and vi...
216
      {
ae27b007   Mihail   add ajax handler ...
217
          if ( Yii::$app->request->isAjax ) {
9075f464   Mihail   add action and vi...
218
  
1967135b   Mihail   adapt project to ...
219
              $files_model = new ImportersFiles();
ae27b007   Mihail   add ajax handler ...
220
221
222
223
              if ( isset(Yii::$app->request->post()['id'] )) {
                  $id = Yii::$app->request->post()['id'];
                  try {
                      $files_model->delete($id);
34d480b7   Mihail   temp commit - wor...
224
                      unlink(Yii::getAlias('@temp_upload') . '/' . $id . '.csv' );
ae27b007   Mihail   add ajax handler ...
225
226
227
                      // сообщим скрипту что все ОК
                      echo 1;
                  } catch (ErrorException  $e) {
9075f464   Mihail   add action and vi...
228
  
93e39994   Mihail   fixed parser and ...
229
                      throw $e;
9075f464   Mihail   add action and vi...
230
  
ae27b007   Mihail   add ajax handler ...
231
232
                  }
              }
9075f464   Mihail   add action and vi...
233
234
          }
  
9075f464   Mihail   add action and vi...
235
      }
93e39994   Mihail   fixed parser and ...
236
  
34d480b7   Mihail   temp commit - wor...
237
238
      public function actionLaunchCroneUploads ()
      {
34d480b7   Mihail   temp commit - wor...
239
          foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) {
93e39994   Mihail   fixed parser and ...
240
  
34d480b7   Mihail   temp commit - wor...
241
              $file_name = basename($server_file,".csv");
df629228   Mihail   console csv parsing
242
              copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' );
34d480b7   Mihail   temp commit - wor...
243
244
  
          }
d3cf6647   Mihail   add multiply pric...
245
  
df629228   Mihail   console csv parsing
246
247
          Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' );
          $this->redirect('server-files');
93e39994   Mihail   fixed parser and ...
248
  
d3cf6647   Mihail   add multiply pric...
249
250
  //        $csv = new \console\controllers\ParserController( 'parse-csv', $this->module );
  //        $csv->actionParseCsv();
0bec979b   Mihail   finish with xml a...
251
      }
93e39994   Mihail   fixed parser and ...
252
  
34d480b7   Mihail   temp commit - wor...
253
  
78641da2   Mihail   rewrite parser wr...
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
296
297
298
299
300
301
      /**
       * сохраняет файл на диск и регистрирует в 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...
302
  
3cf42f5c   Mihail   init commit - bas...
303
  }