Blame view

backend/controllers/ParserController.php 12.5 KB
3cf42f5c   Mihail   init commit - bas...
1
2
3
4
  <?php
  namespace backend\controllers;
  
  use Yii;
dd60c760   Mihail   add menu and chec...
5
  use yii\data\ActiveDataProvider;
3cf42f5c   Mihail   init commit - bas...
6
  use yii\filters\AccessControl;
693c46cb   Mihail   add base classes ...
7
  use backend\components\base\BaseController;
3cf42f5c   Mihail   init commit - bas...
8
  use yii\filters\VerbFilter;
b13b1c83   Mihail   final version par...
9
  use backend\models\UploadFileParsingForm;
3cf42f5c   Mihail   init commit - bas...
10
  use yii\web\UploadedFile;
fcd9278e   Mihail   parser csv v1
11
  use yii\data\ArrayDataProvider;
74072a2a   Mihail   add first version...
12
  use yii\multiparser\DynamicFormHelper;
474f35bf   Mihail   add DynamicFormHe...
13
  use backend\components\parsers\CustomParserConfigurator;
8894c93a   Mihail   add Importers fil...
14
15
  use backend\models\Details;
  use backend\models\ImporterFiles;
9dd0fbe4   Mihail   add writing data ...
16
  use backend\models\Importer;
8894c93a   Mihail   add Importers fil...
17
  use yii\base\ErrorException;
dd60c760   Mihail   add menu and chec...
18
  use yii\db\Query;
500b481a   Administrator   JSON
19
  
e774f057   Mihail   work with custome...
20
  use common\components\CustomVarDamp;
3cf42f5c   Mihail   init commit - bas...
21
22
  
  /**
b13b1c83   Mihail   final version par...
23
   * Parser controller
3cf42f5c   Mihail   init commit - bas...
24
   */
693c46cb   Mihail   add base classes ...
25
  class ParserController extends BaseController
3cf42f5c   Mihail   init commit - bas...
26
  {
500b481a   Administrator   JSON
27
      public $layout = "/column";
8894c93a   Mihail   add Importers fil...
28
  
3cf42f5c   Mihail   init commit - bas...
29
30
31
32
33
34
35
36
37
38
      /**
       * @inheritdoc
       */
      public function behaviors()
      {
          return [
              'access' => [
                  'class' => AccessControl::className(),
                  'rules' => [
                      [
3cf42f5c   Mihail   init commit - bas...
39
40
41
42
43
                          'allow' => true,
                          'roles' => ['@'],
                      ],
                  ],
              ],
e774f057   Mihail   work with custome...
44
45
46
47
48
49
  //            'verbs' => [
  //                'class' => VerbFilter::className(),
  //                'actions' => [
  //                    'logout' => ['post'],
  //                ],
  //            ],
3cf42f5c   Mihail   init commit - bas...
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
          ];
      }
  
      /**
       * @inheritdoc
       */
      public function actions()
      {
          return [
              'error' => [
                  'class' => 'yii\web\ErrorAction',
              ],
          ];
      }
  
500b481a   Administrator   JSON
65
  
9e481998   Mihail   add auto upload a...
66
      public function actionIndex($mode = 0)
3cf42f5c   Mihail   init commit - bas...
67
      {
77422ce3   Mihail   edit upload form
68
          $model = new UploadFileParsingForm();
9e481998   Mihail   add auto upload a...
69
70
          // установим режим, 0 - ручная загрузка, 1 - автозагрузка
          $model->mode = $mode;
3cf42f5c   Mihail   init commit - bas...
71
  
500b481a   Administrator   JSON
72
73
74
          return $this->render('index', ['model' => $model]);
      }
  
9e481998   Mihail   add auto upload a...
75
      public function actionResults($mode = 0)
8894c93a   Mihail   add Importers fil...
76
      {
9e481998   Mihail   add auto upload a...
77
78
  
          $model = new UploadFileParsingForm(['mode' => $mode]);
474f35bf   Mihail   add DynamicFormHe...
79
          $data = [];
b13b1c83   Mihail   final version par...
80
          if ($model->load(Yii::$app->request->post())) {
3cf42f5c   Mihail   init commit - bas...
81
              $model->file = UploadedFile::getInstance($model, 'file');
9e481998   Mihail   add auto upload a...
82
              // первый проход - валидируем, сохраняем файл, ложим в кеш (для ручной загрузки) отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся)
3663f570   Mihail   draft commit
83
              if ($model->validate()) {
9e481998   Mihail   add auto upload a...
84
85
86
87
88
89
90
91
92
93
                  // запишем дату загрузки файла в таблицу файлов поставщика (ImportersFiles)
                  $files_model = new ImporterFiles();
                  // id поставщика получим из конфигурации
                  $files_model->load(['ImporterFiles' => $model->toArray()]);
                  try {
                      $files_model->save();
                  } catch (ErrorException  $e) {
                      CustomVarDamp::dump($e->getMessage());
                  }
                  // получим id только что записанной записи - его запишем в название файла
01746976   Mihail   fix errors with w...
94
                  $model->record_id = $files_model->find()
9e481998   Mihail   add auto upload a...
95
96
97
98
99
                      ->where(['importer_id' => $files_model->importer_id])
                      ->orderBy(['id' => SORT_DESC])
                      ->one()
                      ->id;
  
01746976   Mihail   fix errors with w...
100
                  $file_name = $model->record_id . '.' . $model->file->extension;
9e481998   Mihail   add auto upload a...
101
102
103
104
105
106
  
                  if ($model->mode) {
                      $model->file_path = Yii::getAlias('@auto_upload') . '/' . $file_name;
                  } else {
                      $model->file_path = Yii::getAlias('@manual_upload') . '/' . $file_name;
                  }
500b481a   Administrator   JSON
107
  
dd60c760   Mihail   add menu and chec...
108
                  $model->file->saveAs($model->file_path);
9e481998   Mihail   add auto upload a...
109
110
111
112
113
114
115
116
  
                  // для авто загрузки, обработка завершена
                  if ($model->mode) {
                      $model->success = true;
                      return $this->render('index', ['model' => $model]);
                  }
  
                  // === ручная загрузка ===========
8894c93a   Mihail   add Importers fil...
117
                  //запускаем парсинг
dd60c760   Mihail   add menu and chec...
118
                  $data = $model->readFile();
8894c93a   Mihail   add Importers fil...
119
120
121
122
                  // сохраняем в кеш отпарсенные даные
                  Yii::$app->getCache()->set('parser_data', json_encode($data));
                  // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
                  Yii::$app->getCache()->set('parser_configuration', serialize($model));
500b481a   Administrator   JSON
123
  
500b481a   Administrator   JSON
124
  
9e481998   Mihail   add auto upload a...
125
126
127
128
129
130
131
132
              } else {
                  // не прошла валидация форма загрузки файлов
                  //@todo - отправка на страницу ошибок
                  $errors_arr = $model->getErrors();
                  foreach ($errors_arr as $error) {
                      CustomVarDamp::dump(array_values($error));
                  }
                  die;
3cf42f5c   Mihail   init commit - bas...
133
              }
8894c93a   Mihail   add Importers fil...
134
135
              // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные
          } else if (Yii::$app->getCache()->get('parser_data')) {
500b481a   Administrator   JSON
136
  
8894c93a   Mihail   add Importers fil...
137
              $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
500b481a   Administrator   JSON
138
  
3cf42f5c   Mihail   init commit - bas...
139
140
          }
  
474f35bf   Mihail   add DynamicFormHe...
141
142
143
144
145
146
147
          $provider = new ArrayDataProvider([
              'allModels' => $data,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
  
8894c93a   Mihail   add Importers fil...
148
149
          //формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список)
          $header_model = DynamicFormHelper::CreateDynamicModel(count($data[0]));
474f35bf   Mihail   add DynamicFormHe...
150
  
474f35bf   Mihail   add DynamicFormHe...
151
152
153
          return $this->render('results',
              ['model' => $data,
                  'header_model' => $header_model,
8894c93a   Mihail   add Importers fil...
154
155
                  // список колонок для выбора
                  'basic_column' => Yii::$app->multiparser->getConfiguration('csv', 'basic_column'),
474f35bf   Mihail   add DynamicFormHe...
156
                  'dataProvider' => $provider]);
3cf42f5c   Mihail   init commit - bas...
157
      }
474f35bf   Mihail   add DynamicFormHe...
158
  
8894c93a   Mihail   add Importers fil...
159
160
      public function actionWrite()
      {
8894c93a   Mihail   add Importers fil...
161
162
163
164
165
166
167
168
          //получим колонки которые выбрал пользователь
          $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...
169
  
8894c93a   Mihail   add Importers fil...
170
171
          // провалидируем выбранные колонки
          if ($model->validate()) {
28253169   Mihail   add converter as ...
172
  
8894c93a   Mihail   add Importers fil...
173
174
              // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
              $arr = $model->toArray();
aa518ad3   Mihail   finishing with co...
175
  
8894c93a   Mihail   add Importers fil...
176
177
178
179
180
181
182
              // получим данные из кеша
              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 {
                  CustomVarDamp::dumpAndDie('Ошибка кеша');
              }
474f35bf   Mihail   add DynamicFormHe...
183
  
8894c93a   Mihail   add Importers fil...
184
185
186
187
188
              // соотнесем отпарсенные данные с соответсивем полученным от пользователя
              // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
              $data = \Yii::$app->multiparser->convertToAssocArray($data, $arr, 'attr_');
  
  
9dd0fbe4   Mihail   add writing data ...
189
              // 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
01746976   Mihail   fix errors with w...
190
191
              // id  загруженного файла получим из конфигурации
              $files_model = ImporterFiles::findOne( $configuration->record_id );
9e481998   Mihail   add auto upload a...
192
  
01746976   Mihail   fix errors with w...
193
              //$files_model->load(['ImporterFiles' => $configuration->toArray()]);
9e481998   Mihail   add auto upload a...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
              $update_date = date('Y-m-d H:i:s');
              $files_model->time_start = $update_date;
              // запишем дату начала загрузки
              if (!$files_model->save()) {
                  CustomVarDamp::dumpAndDie($files_model->getErrors());
              }
  
  
              // 2. запишем полученные данные в таблицу товаров (Details)
              $details_model = new Details();
              // проверим все ли обязательные колонки были указаны пользователем
              $details_model->load(['Details' => $data[0]]);
              if ($details_model->validate()) {
                  // дополним данные значением импортера и даты обновления цены
01746976   Mihail   fix errors with w...
208
                  $data = \Yii::$app->multiparser->addColumns($data, ['IMPORT_ID' => $configuration->importer_id, 'timestamp' => $update_date]);
9e481998   Mihail   add auto upload a...
209
  
8894c93a   Mihail   add Importers fil...
210
                  try {
9e481998   Mihail   add auto upload a...
211
212
213
                      //@todo add transaction
                      // попытаемся вставить данные в БД с апдейтом по ключам
                      $details_model->ManualInsert($data);
8894c93a   Mihail   add Importers fil...
214
  
9e481998   Mihail   add auto upload a...
215
                      // 3. зафиксируем дату конца загрузки в файлах поставщика
8894c93a   Mihail   add Importers fil...
216
  
9e481998   Mihail   add auto upload a...
217
218
219
220
                      $files_model->time_end = date('Y-m-d H:i:s');
                      // CustomVarDamp::dumpAndDie($files_model);
                      if (!$files_model->save()) {
                          CustomVarDamp::dumpAndDie($files_model->getErrors());
8894c93a   Mihail   add Importers fil...
221
                      }
9e481998   Mihail   add auto upload a...
222
223
224
225
226
227
228
  
                      // 4. зафиксируем дату загрузки в таблице поставщиков
                      $imp_model = Importer::findOne($configuration['importer_id']);
                      $imp_model->price_date_update = $update_date;
  
                      if (!$imp_model->save()) {
                          CustomVarDamp::dumpAndDie($imp_model->getErrors());
8894c93a   Mihail   add Importers fil...
229
                      }
9e481998   Mihail   add auto upload a...
230
231
232
233
                      $configuration['success'] = true;
                      // все прошло успешно - очищаем кеш
                      Yii::$app->getCache()->delete('parser_data');
                      Yii::$app->getCache()->delete('parser_configuration');
8894c93a   Mihail   add Importers fil...
234
  
9e481998   Mihail   add auto upload a...
235
                      unlink($configuration['file_path']);
9e481998   Mihail   add auto upload a...
236
237
238
239
240
241
242
243
244
245
246
                      return $this->render('index', ['model' => $configuration]);
  
                  } catch (ErrorException  $e) {
                      CustomVarDamp::dump($e->getMessage());
                  }
              }
              if ($details_model->hasErrors()) {
                  $errors_arr = $details_model->getErrors();
                  foreach ($errors_arr as $error) {
                      CustomVarDamp::dump(array_values($error));
                  }
3cf42f5c   Mihail   init commit - bas...
247
  
8894c93a   Mihail   add Importers fil...
248
249
250
251
252
253
              }
  
  
          }
  
      }
3cf42f5c   Mihail   init commit - bas...
254
  
9e481998   Mihail   add auto upload a...
255
256
      public function actionAutoUpload()
      {
9e481998   Mihail   add auto upload a...
257
258
259
260
261
262
263
264
265
266
267
268
          $query = Importer::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]);
  
          $provider = new ActiveDataProvider([
              'query' => $query,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
          return $this->render('check_price',
              [
                  'dataProvider' => $provider]);
      }
9075f464   Mihail   add action and vi...
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
  
      public function actionServerFiles ()
      {
          $arr_id = [];
          // получим список файлов которые ожидают к загрузке
          foreach (glob(Yii::getAlias('@auto_upload') . '/*') as $server_file) {
              $file_id = basename($server_file,".csv");
              $arr_id[] = (int) $file_id;
          }
  
          $query = ImporterFiles::find()->where(['in', 'id', $arr_id])->orderBy(['upload_time' => SORT_DESC]);
  
          $provider = new ActiveDataProvider([
              'query' => $query,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
          return $this->render('server-files',
              [
                  'dataProvider' => $provider]);
      }
  
      public function actionDelete ($id)
      {
          if(Yii::$app->request->isAjax){
              CustomVarDamp::dumpAndDie(1);
          }
  
          $files_model = new ImporterFiles();
          try {
  
              $files_model->delete($id);
              unlink(Yii::getAlias('@auto_upload') . '/' . $id . '.csv' );
  
          } catch (ErrorException  $e) {
  
              CustomVarDamp::dump($e->getMessage());
  
          }
  
          $this->redirect('server-files');
      }
3cf42f5c   Mihail   init commit - bas...
312
  }