Blame view

backend/controllers/ParserController.php 8.01 KB
58743b31   Mihail   init commit - bas...
1
2
3
4
5
  <?php
  namespace backend\controllers;
  
  use Yii;
  use yii\filters\AccessControl;
54ada04a   Mihail   add base classes ...
6
  use backend\components\base\BaseController;
58743b31   Mihail   init commit - bas...
7
  use yii\filters\VerbFilter;
febcec0b   Mihail   final version par...
8
  use backend\models\UploadFileParsingForm;
58743b31   Mihail   init commit - bas...
9
  use yii\web\UploadedFile;
9bfcfcaf   Mihail   parser csv v1
10
  use yii\data\ArrayDataProvider;
2a7a75b8   Mihail   add first version...
11
  use yii\multiparser\DynamicFormHelper;
7a80e74c   Mihail   add DynamicFormHe...
12
  use backend\components\parsers\CustomParserConfigurator;
d7f6bdbb   Mihail   add Importers fil...
13
14
15
  use backend\models\Details;
  use backend\models\ImporterFiles;
  use yii\base\ErrorException;
2509e17e   Administrator   JSON
16
  
02e174a3   Mihail   work with custome...
17
  use common\components\CustomVarDamp;
58743b31   Mihail   init commit - bas...
18
19
  
  /**
febcec0b   Mihail   final version par...
20
   * Parser controller
58743b31   Mihail   init commit - bas...
21
   */
54ada04a   Mihail   add base classes ...
22
  class ParserController extends BaseController
58743b31   Mihail   init commit - bas...
23
  {
2509e17e   Administrator   JSON
24
      public $layout = "/column";
d7f6bdbb   Mihail   add Importers fil...
25
  
58743b31   Mihail   init commit - bas...
26
27
28
29
30
31
32
33
34
35
      /**
       * @inheritdoc
       */
      public function behaviors()
      {
          return [
              'access' => [
                  'class' => AccessControl::className(),
                  'rules' => [
                      [
d7f6bdbb   Mihail   add Importers fil...
36
                          'actions' => ['index', 'results', 'write'],
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
51
52
53
54
55
56
57
58
59
60
61
62
          ];
      }
  
      /**
       * @inheritdoc
       */
      public function actions()
      {
          return [
              'error' => [
                  'class' => 'yii\web\ErrorAction',
              ],
          ];
      }
  
2509e17e   Administrator   JSON
63
  
58743b31   Mihail   init commit - bas...
64
65
      public function actionIndex()
      {
5be26bf2   Mihail   edit upload form
66
          $model = new UploadFileParsingForm();
58743b31   Mihail   init commit - bas...
67
  
2509e17e   Administrator   JSON
68
69
70
          return $this->render('index', ['model' => $model]);
      }
  
d7f6bdbb   Mihail   add Importers fil...
71
72
      public function actionResults()
      {
2509e17e   Administrator   JSON
73
74
  
          $model = new UploadFileParsingForm();
7a80e74c   Mihail   add DynamicFormHe...
75
          $data = [];
febcec0b   Mihail   final version par...
76
          if ($model->load(Yii::$app->request->post())) {
58743b31   Mihail   init commit - bas...
77
              $model->file = UploadedFile::getInstance($model, 'file');
d7f6bdbb   Mihail   add Importers fil...
78
              // первый проход - валидируем, сохраняем файл, ложим в кеш отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся)
165348a4   Mihail   draft commit
79
              if ($model->validate()) {
9bfcfcaf   Mihail   parser csv v1
80
                  $filePath = Yii::getAlias('@webroot') . '/uploads/' . $model->file->baseName . '.' . $model->file->extension;
2509e17e   Administrator   JSON
81
  
d7f6bdbb   Mihail   add Importers fil...
82
83
                  $model->file->saveAs($filePath);
                  //запускаем парсинг
2509e17e   Administrator   JSON
84
                  $data = $model->readFile($filePath);
d7f6bdbb   Mihail   add Importers fil...
85
86
87
88
                  // сохраняем в кеш отпарсенные даные
                  Yii::$app->getCache()->set('parser_data', json_encode($data));
                  // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
                  Yii::$app->getCache()->set('parser_configuration', serialize($model));
2509e17e   Administrator   JSON
89
  
2509e17e   Administrator   JSON
90
  
58743b31   Mihail   init commit - bas...
91
              }
d7f6bdbb   Mihail   add Importers fil...
92
93
              // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные
          } else if (Yii::$app->getCache()->get('parser_data')) {
2509e17e   Administrator   JSON
94
  
d7f6bdbb   Mihail   add Importers fil...
95
              $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
2509e17e   Administrator   JSON
96
  
58743b31   Mihail   init commit - bas...
97
98
          }
  
7a80e74c   Mihail   add DynamicFormHe...
99
100
101
102
103
104
105
          $provider = new ArrayDataProvider([
              'allModels' => $data,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
  
d7f6bdbb   Mihail   add Importers fil...
106
107
          //формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список)
          $header_model = DynamicFormHelper::CreateDynamicModel(count($data[0]));
7a80e74c   Mihail   add DynamicFormHe...
108
  
7a80e74c   Mihail   add DynamicFormHe...
109
110
111
          return $this->render('results',
              ['model' => $data,
                  'header_model' => $header_model,
d7f6bdbb   Mihail   add Importers fil...
112
113
                  // список колонок для выбора
                  'basic_column' => Yii::$app->multiparser->getConfiguration('csv', 'basic_column'),
7a80e74c   Mihail   add DynamicFormHe...
114
                  'dataProvider' => $provider]);
58743b31   Mihail   init commit - bas...
115
      }
7a80e74c   Mihail   add DynamicFormHe...
116
  
d7f6bdbb   Mihail   add Importers fil...
117
118
      public function actionWrite()
      {
7a80e74c   Mihail   add DynamicFormHe...
119
  
d7f6bdbb   Mihail   add Importers fil...
120
121
122
123
124
125
126
127
          //получим колонки которые выбрал пользователь
          $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...
128
  
d7f6bdbb   Mihail   add Importers fil...
129
130
          // провалидируем выбранные колонки
          if ($model->validate()) {
33d902b8   Mihail   add converter as ...
131
  
d7f6bdbb   Mihail   add Importers fil...
132
133
              // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
              $arr = $model->toArray();
492d8ac1   Mihail   finishing with co...
134
  
d7f6bdbb   Mihail   add Importers fil...
135
136
137
138
139
140
141
              // получим данные из кеша
              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('Ошибка кеша');
              }
7a80e74c   Mihail   add DynamicFormHe...
142
  
d7f6bdbb   Mihail   add Importers fil...
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
              // соотнесем отпарсенные данные с соответсивем полученным от пользователя
              // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
              $data = \Yii::$app->multiparser->convertToAssocArray($data, $arr, 'attr_');
  
  
              // запишем дату старта в таблицу файлов поставщика (ImportersFiles)
              $files_model = new ImporterFiles();
              // id поставщика получим из конфигурации
              $files_model->load(['ImporterFiles' => $configuration->toArray()]);
              if ($files_model->validate()) {
                  try {
                      $files_model->save();
                  } catch (ErrorException  $e) {
                      CustomVarDamp::dump($e->getMessage());
                  }
  
  
                  // запишем полученные данные в таблицу товаров (Details)
                  $details_model = new Details('web');
                  // проверим все ли обязательные колонки были указаны пользователем
                  $details_model->load(['Details' => $data[0]]);
                  if ($details_model->validate()) {
                      // проставим импортера
                      $data = $details_model->prepareData($data, $configuration);
  
                      try {
                          // попытаемся вставить данные в БД с апдейтом по ключам
                          $details_model->save($data);
  
                          // а также зафиксируем дату конца загрузки
                          $files_model->time_end = mktime(); // ошибка!!!!!!!!!!!!!!!!
                          $files_model->save();
  
                          // все прошло успешно - очищаем кеш
                          Yii::$app->getCache()->delete('parser_data');
                          Yii::$app->getCache()->delete('parser_configuration');
  
                          CustomVarDamp::dumpAndDie('!!!');
                      } 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));
                      }
  
                  }
7a80e74c   Mihail   add DynamicFormHe...
192
  
58743b31   Mihail   init commit - bas...
193
  
d7f6bdbb   Mihail   add Importers fil...
194
195
196
197
198
199
              }
  
  
          }
  
      }
58743b31   Mihail   init commit - bas...
200
201
  
  }