Blame view

backend/controllers/CrossingUploadController.php 8.69 KB
706a1491   Mihail   add form, model a...
1
2
3
4
5
6
7
8
9
10
  <?php
  /**
   * Created by PhpStorm.
   * User: Tsurkanov
   * Date: 15.10.2015
   * Time: 12:27
   */
  
  namespace backend\controllers;
  
706a1491   Mihail   add form, model a...
11
  use backend\components\base\BaseController;
4702bfa7   Mihail   change writing cr...
12
  use common\components\CustomArrayHelper;
1e337311   Mihail   add parser trait ...
13
14
  use common\components\exceptions\CrossParsingException;
  use yii\base\Exception;
59eedf0c   Mihail   add form result f...
15
  use yii\data\ArrayDataProvider;
f5b3baf1   Administrator   access in admin
16
  use yii\filters\VerbFilter;
706a1491   Mihail   add form, model a...
17
18
19
  use yii\filters\AccessControl;
  use backend\models\UploadFileCrossingForm;
  use backend\models\DetailsCrosses;
ad2e91f7   Mihail   move multyparser ...
20
  use common\components\parsers\DynamicFormHelper;
706a1491   Mihail   add form, model a...
21
  use yii\web\UploadedFile;
c2ef0939   Mihail   add array model v...
22
  use common\components\ModelArrayValidator;
706a1491   Mihail   add form, model a...
23
  use \Yii;
1e337311   Mihail   add parser trait ...
24
  use backend\components\traits\ParserTrait;
706a1491   Mihail   add form, model a...
25
26
27
  
  class CrossingUploadController extends BaseController
  {
1e337311   Mihail   add parser trait ...
28
      use ParserTrait;
706a1491   Mihail   add form, model a...
29
30
      public $layout = "/column";
  
4702bfa7   Mihail   change writing cr...
31
32
33
34
      /**
       * @inheritdoc
       */
      public function behaviors()
706a1491   Mihail   add form, model a...
35
36
37
38
39
40
      {
          return [
              'access' => [
                  'class' => AccessControl::className(),
                  'rules' => [
                      [
1e337311   Mihail   add parser trait ...
41
                          'actions' => ['result', 'index', 'write', 'error'],
706a1491   Mihail   add form, model a...
42
43
44
45
46
                          'allow' => true,
                          'roles' => ['@'],
                      ],
                  ],
              ],
f5b3baf1   Administrator   access in admin
47
48
49
50
51
52
              'verbs' => [
                  'class' => VerbFilter::className(),
                  'actions' => [
                      'logout' => ['post'],
                  ],
              ],
706a1491   Mihail   add form, model a...
53
54
          ];
      }
4702bfa7   Mihail   change writing cr...
55
  
706a1491   Mihail   add form, model a...
56
57
58
59
60
61
62
  
      public function actionIndex()
      {
          $model = new UploadFileCrossingForm();
          return $this->render('index', ['model' => $model]);
      }
  
1e337311   Mihail   add parser trait ...
63
  
706a1491   Mihail   add form, model a...
64
65
66
67
      public function actionResult()
      {
          $model = new UploadFileCrossingForm();
          $data = [];
1e337311   Mihail   add parser trait ...
68
          if ( $model->load(Yii::$app->request->post()) ) {
706a1491   Mihail   add form, model a...
69
              $model->file = UploadedFile::getInstance($model, 'file');
1e337311   Mihail   add parser trait ...
70
71
  
              if ( $model->validate() ) {
706a1491   Mihail   add form, model a...
72
73
                  $file_name = $model->file->name;
                  $model->file_path = Yii::getAlias('@temp_upload') . '/' . $file_name;
706a1491   Mihail   add form, model a...
74
75
                  $model->file->saveAs($model->file_path);
                  //запускаем парсинг
2d4b1514   Mihail   adapted xls parser
76
77
                  $options['mode'] = 'crosses';
                  $data = $model->readFile($options);
59eedf0c   Mihail   add form result f...
78
                  // сохраняем в кеш отпарсенные даные
1e337311   Mihail   add parser trait ...
79
80
81
82
83
                  $this->parserCacheHandler( 1, $data, $model );
              } else {
                  // не прошла валидация формы загрузки файлов
                  $errors_str = "Ошибка загрузки файла. ";
                  $this->throwStringErrorException( $model , new CrossParsingException( $errors_str ) );
59eedf0c   Mihail   add form result f...
84
              }
1e337311   Mihail   add parser trait ...
85
86
87
88
89
  
          } else if ( Yii::$app->getCache()->get('parser_data') ) {
  
              $data = json_decode( Yii::$app->getCache()->get('parser_data'), true );
  
59eedf0c   Mihail   add form result f...
90
          }
1e337311   Mihail   add parser trait ...
91
92
          // сборка динамической модели и её рендеринг
          return $this->renderResultView( $data );
59eedf0c   Mihail   add form result f...
93
94
      }
  
59eedf0c   Mihail   add form result f...
95
96
      public function actionWrite()
      {
1e337311   Mihail   add parser trait ...
97
          set_time_limit(600);
59eedf0c   Mihail   add form result f...
98
99
100
101
          //получим колонки которые выбрал пользователь
          $arr_attributes = Yii::$app->request->post()['DynamicModel'];
          //соберем модель по полученным данным
          $model = DynamicFormHelper::CreateDynamicModel($arr_attributes);
209dad04   Mihail   add validator for...
102
          $crosses_model = new DetailsCrosses();
1e337311   Mihail   add parser trait ...
103
          $arr_keys = array_keys($this->getBasicColumns());
59eedf0c   Mihail   add form result f...
104
105
          //добавим правила валидации (колонки должны быть те что в модели)
          foreach ($arr_attributes as $key => $value) {
1e337311   Mihail   add parser trait ...
106
              $model->addRule($key, 'in', ['range' => $arr_keys]);
59eedf0c   Mihail   add form result f...
107
          }
209dad04   Mihail   add validator for...
108
109
          // установим режим проверки обязательных полей
          $crosses_model->setScenario('form_upload_validation');
1e337311   Mihail   add parser trait ...
110
          $model_validator = new ModelArrayValidator($crosses_model);
59eedf0c   Mihail   add form result f...
111
          // провалидируем выбранные колонки
1e337311   Mihail   add parser trait ...
112
          if ( $model->validate() && $model_validator->validateRow( array_flip( $arr_attributes ) ) ) {
59eedf0c   Mihail   add form result f...
113
114
115
116
117
  
              // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
              $arr = $model->toArray();
  
              // получим данные из кеша
78641da2   Mihail   rewrite parser wr...
118
              $this->parserCacheHandler( 0, $data, $configuration );
59eedf0c   Mihail   add form result f...
119
120
121
  
              // соотнесем отпарсенные данные с соответствием полученным от пользователя
              // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
1e337311   Mihail   add parser trait ...
122
              $data = CustomArrayHelper::createAssocArray( $data, $arr, 'attr_' );
59eedf0c   Mihail   add form result f...
123
  
4702bfa7   Mihail   change writing cr...
124
125
              // запустим конвертер над над данными
              $data = $this->convertDataByConfiguration( $data, $configuration );
59eedf0c   Mihail   add form result f...
126
  
c2ef0939   Mihail   add array model v...
127
              // валидируем отпарсенные данные моделью в которую будем записывать
209dad04   Mihail   add validator for...
128
              $crosses_model->setScenario('default');
c2ef0939   Mihail   add array model v...
129
130
              $data = $model_validator->validate( $data );
              $msg = $model_validator->getMassage();
1e337311   Mihail   add parser trait ...
131
              $type_msg = $model_validator->hasError() ? 'warning' : 'success';
c2ef0939   Mihail   add array model v...
132
133
              $model_validator->close();
  
1e337311   Mihail   add parser trait ...
134
135
136
137
              $data = $this->reverseCrosses($data);
  
              try {
                  if ($crosses_model->ManualInsertWithIgnore( $data )) {
59eedf0c   Mihail   add form result f...
138
  
1e337311   Mihail   add parser trait ...
139
140
                      // очистим кеш
                      $this->parserCacheHandler(2);
9755cb59   Mihail   fixed permissions...
141
  
1e337311   Mihail   add parser trait ...
142
143
                      if (file_exists($configuration['file_path']))
                          unlink($configuration['file_path']);
78641da2   Mihail   rewrite parser wr...
144
  
1e337311   Mihail   add parser trait ...
145
146
                      Yii::$app->session->setFlash($type_msg, $msg);
                      return $this->render('index', ['model' => $configuration]);
9755cb59   Mihail   fixed permissions...
147
  
1e337311   Mihail   add parser trait ...
148
149
                  }
              } catch (Exception $e) {
9755cb59   Mihail   fixed permissions...
150
  
1e337311   Mihail   add parser trait ...
151
                  new CrossParsingException( $e->getMessage() );
9755cb59   Mihail   fixed permissions...
152
              }
59eedf0c   Mihail   add form result f...
153
  
4702bfa7   Mihail   change writing cr...
154
          } else {
884c04ad   Mihail   fixed issues with...
155
              // не прошла валидация формы загрузки файлов
209dad04   Mihail   add validator for...
156
              $errors_str = "Ошибка валидации формы загрузки файлов. ";
1e337311   Mihail   add parser trait ...
157
              $this->throwStringErrorException( $crosses_model , 'common\components\exceptions\CrossParsingException',  $errors_str );
4702bfa7   Mihail   change writing cr...
158
159
160
161
162
163
164
165
166
167
          }
      }
  
      protected function getBasicColumns()
      {
          $basicColumns_array = Yii::$app->multiparser->getConfiguration('csv', 'crosses');
          if (isset($basicColumns_array['basic_column'])) {
              return $basicColumns_array['basic_column'];
          } else {
              throw new \ErrorException('Ошибка конфигурационного файла кроссов. Не указаны базовые колнки для пользовательской формы выбора.');
706a1491   Mihail   add form, model a...
168
          }
59eedf0c   Mihail   add form result f...
169
  
706a1491   Mihail   add form, model a...
170
      }
a80ff469   Mihail   add expiration ti...
171
  
1e337311   Mihail   add parser trait ...
172
173
      protected function convertDataByConfiguration($data, $configuration)
      {
4702bfa7   Mihail   change writing cr...
174
175
176
177
178
179
180
181
182
183
          // доп. опции для парсера - удаление префикса в артикулах
          $options['mode'] = 'crosses';
          $fields = [];
          if ($configuration['delete_prefix1']) {
              $fields[] = 'ARTICLE';
          }
          if ($configuration['delete_prefix2']) {
              $fields[] = 'CROSS_ARTICLE';
          }
          if ($fields) {
1e337311   Mihail   add parser trait ...
184
              $options ['converter_conf']['configuration'] = ["article" => $fields,
4702bfa7   Mihail   change writing cr...
185
186
                  "string" => ['ARTICLE', 'CROSS_ARTICLE'],];
          } else {
1e337311   Mihail   add parser trait ...
187
              $options ['converter_conf']['configuration'] = ["string" => ['ARTICLE', 'CROSS_ARTICLE'],];
4702bfa7   Mihail   change writing cr...
188
189
          }
  
884c04ad   Mihail   fixed issues with...
190
          // получим базовую конфигурацию и объеденим её с той что образовалась после выбора пользователем настроек
1e337311   Mihail   add parser trait ...
191
192
          $basic_options = Yii::$app->multiparser->getConfiguration('csv', 'crosses');
          $options = array_merge_recursive($options, $basic_options);
884c04ad   Mihail   fixed issues with...
193
  
1e337311   Mihail   add parser trait ...
194
195
          foreach ($data as &$row) {
              $row = Yii::$app->converter->convertByConfiguration($row, $options['converter_conf']);
4702bfa7   Mihail   change writing cr...
196
197
          }
  
4702bfa7   Mihail   change writing cr...
198
          return $data;
4702bfa7   Mihail   change writing cr...
199
200
      }
  
1e337311   Mihail   add parser trait ...
201
      protected function reverseCrosses($data)
c2ef0939   Mihail   add array model v...
202
203
      {
          // для доп массива обратных строк
1e337311   Mihail   add parser trait ...
204
          $i = count($data) - 1;
c2ef0939   Mihail   add array model v...
205
          $reverse_data = [];
1e337311   Mihail   add parser trait ...
206
          foreach ($data as &$row) {
c2ef0939   Mihail   add array model v...
207
              // нужно добавить обратную строку по кроссам
1e337311   Mihail   add parser trait ...
208
209
210
211
              $reverse_data[$i]['ARTICLE'] = $row['CROSS_ARTICLE'];
              $reverse_data[$i]['CROSS_ARTICLE'] = $row['ARTICLE'];
              $reverse_data[$i]['BRAND'] = $row['CROSS_BRAND'];
              $reverse_data[$i]['CROSS_BRAND'] = $row['BRAND'];
c2ef0939   Mihail   add array model v...
212
213
              $i++;
          }
1e337311   Mihail   add parser trait ...
214
          $data = array_merge($data, $reverse_data);
c2ef0939   Mihail   add array model v...
215
216
217
218
  
          return $data;
      }
  
706a1491   Mihail   add form, model a...
219
  }