Blame view

backend/controllers/RgGrupController.php 8.18 KB
fee08395   Mihail   add upload rg gro...
1
2
3
4
5
6
7
8
9
10
11
12
13
  <?php
  /**
   * Created by PhpStorm.
   * User: Tsurkanov
   * Date: 27.10.2015
   * Time: 15:22
   */
  
  namespace backend\controllers;
  
  use backend\components\base\BaseController;
  use backend\models\UploadFileRgForm;
  use common\components\CustomVarDamp;
ef87d54f   Mihail   add MailAttachmen...
14
  use common\components\parsers\MailAttachmentsSaver;
fee08395   Mihail   add upload rg gro...
15
16
17
18
19
20
21
22
23
  use common\models\Margins;
  use common\models\MarginsGroups;
  use yii\filters\AccessControl;
  use Yii;
  use yii\web\UploadedFile;
  use yii\data\ArrayDataProvider;
  use yii\multiparser\DynamicFormHelper;
  use common\components\CustomArrayHelper;
  
42078ac6   Mihail   add manual insert...
24
25
  class RgGrupController extends BaseController
  {
fee08395   Mihail   add upload rg gro...
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
      public $layout = "/column";
  
      /**
       * @inheritdoc
       */
      public function behaviors()
      {
          return [
              'access' => [
                  'class' => AccessControl::className(),
                  'rules' => [
                      [
                          'allow' => true,
                          'roles' => ['@'],
                      ],
                  ],
              ],
  //            'verbs' => [
  //                'class' => VerbFilter::className(),
  //                'actions' => [
  //                    'logout' => ['post'],
  //                ],
  //            ],
          ];
      }
  
      public function actionIndex()
      {
          $model = new UploadFileRgForm();
  
          return $this->render('index', ['model' => $model]);
      }
  
      public function actionResults()
      {
          $model = new UploadFileRgForm();
          $data = [];
  
          if ($model->load(Yii::$app->request->post())) {
              $model->file = UploadedFile::getInstance($model, 'file');
              // первый проход - валидируем, сохраняем файл, ложим в кеш  отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся)
              if ($model->validate()) {
  
                  $model->file_path = Yii::getAlias('@manual_upload') . '/' . $model->file->name;
                  $model->file->saveAs($model->file_path);
  
                  //запускаем парсинг
                  $data = $model->readFile();
                  // сохраняем в кеш отпарсенные даные
                  Yii::$app->getCache()->set('parser_data', json_encode($data));
                  // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
                  Yii::$app->getCache()->set('parser_configuration', serialize($model));
  
  
              } else {
                  // не прошла валидация форма загрузки файлов
                  $errors_str = '';
                  foreach ($model->getErrors() as $error) {
42078ac6   Mihail   add manual insert...
84
                      $errors_str .= implode(array_values($error));
fee08395   Mihail   add upload rg gro...
85
                  }
42078ac6   Mihail   add manual insert...
86
                  throw new \ErrorException($errors_str);
fee08395   Mihail   add upload rg gro...
87
88
89
90
91
92
93
94
95
96
97
98
99
              }
              // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные
          } else if (Yii::$app->getCache()->get('parser_data')) {
  
              $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
  
          }
          $provider = new ArrayDataProvider([
              'allModels' => $data,
              'pagination' => [
                  'pageSize' => 10,
              ],
          ]);
fee08395   Mihail   add upload rg gro...
100
          // создадим модель на столько реквизитов сколько колонок в отпарсенном файле
42078ac6   Mihail   add manual insert...
101
          $last_index = end(array_flip($data[0]));
fee08395   Mihail   add upload rg gro...
102
          $header_counts = $last_index + 1;
42078ac6   Mihail   add manual insert...
103
          $header_model = DynamicFormHelper::CreateDynamicModel($header_counts);
fee08395   Mihail   add upload rg gro...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  
          // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список)
          $header_array = Margins::getHeader();
  
          return $this->render('results',
              ['model' => $data,
                  'header_model' => $header_model,
                  // список колонок для выбора
                  'basic_column' => $header_array,
                  'dataProvider' => $provider]);
      }
  
      public function actionWrite()
      {
          //получим колонки которые выбрал пользователь
          $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(Margins::getHeader())]);
          }
  
          // провалидируем выбранные колонки
          if ($model->validate()) {
  
              // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
              $arr = $model->toArray();
  
              // получим данные из кеша
              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 {
                  throw new \ErrorException('Ошибка кеша');
              }
  
42078ac6   Mihail   add manual insert...
141
142
              array_walk($arr, function (&$val) {
                  $val = '!' . $val;
fee08395   Mihail   add upload rg gro...
143
144
145
146
              });
  
              // соотнесем отпарсенные данные с соответсивем полученным от пользователя
              // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
42078ac6   Mihail   add manual insert...
147
              $data = CustomArrayHelper::createAssocArray($data, $arr, 'attr_');
fee08395   Mihail   add upload rg gro...
148
149
150
151
  
              // в первой строке у нас заголовки - уберем
              unset($data[0]);
              // подготовим данные для записи в таблицу w_margins_groups
42078ac6   Mihail   add manual insert...
152
              $arr_values = [];
fee08395   Mihail   add upload rg gro...
153
154
155
156
157
158
159
160
161
162
163
164
165
              $group = '';
              $importer_id = $configuration['importer_id'];
              foreach ($data as $row_data) {
  
                  if (isset($row_data['!group'])) {
                      $group = $row_data['!group'];
                      unset($row_data['!group']);
                  }
                  if (isset($row_data['!_null'])) {
                      unset($row_data['!_null']);
                  }
  
                  foreach ($row_data as $key => $value) {
42078ac6   Mihail   add manual insert...
166
167
168
169
170
171
172
173
174
                      if ($group)
                          $row['group'] = trim($group);
  
                      $row['importer_id'] = trim($importer_id);
                      $row['margin_id'] = ltrim($key, '!');
                      $row['koef'] = \Yii::$app->converter->convertTo('float', $value);
  
                      $arr_values[] = $row;
  
fee08395   Mihail   add upload rg gro...
175
                  }
fee08395   Mihail   add upload rg gro...
176
  
42078ac6   Mihail   add manual insert...
177
178
179
              }
              // сохраним подготовленные данные
              MarginsGroups::ManualInsertWithUpdate( $arr_values, [ 'group','importer_id','margin_id' ] );
fee08395   Mihail   add upload rg gro...
180
  
fee08395   Mihail   add upload rg gro...
181
  
42078ac6   Mihail   add manual insert...
182
183
184
185
              Yii::$app->session->setFlash('success', "Файл  {$configuration['file']} успешно загружен");
              // все прошло успешно - очищаем кеш
              Yii::$app->getCache()->delete('parser_data');
              Yii::$app->getCache()->delete('parser_configuration');
fee08395   Mihail   add upload rg gro...
186
  
42078ac6   Mihail   add manual insert...
187
188
              if (file_exists($configuration['file_path']))
                  unlink($configuration['file_path']);
fee08395   Mihail   add upload rg gro...
189
  
42078ac6   Mihail   add manual insert...
190
              return $this->render('index', ['model' => $configuration]);
fee08395   Mihail   add upload rg gro...
191
  
fee08395   Mihail   add upload rg gro...
192
193
194
          }
  
      }
ef87d54f   Mihail   add MailAttachmen...
195
196
197
  
      public function actionMail()
      {
8b0defd0   Mihail   add mails classes
198
199
          $mail_saver = new MailAttachmentsSaver('{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'tsurkanovm@gmail.com', 'Wtvr@2000');
          //$mail_saver = new MailAttachmentsSaver('{imap.gmail.com:993/imap/ssl/novalidate-cert}', 'price@italauto.com.ua', '67853562');
ef87d54f   Mihail   add MailAttachmen...
200
201
202
203
          $mail_saver->saveAttachmentsTo();
      }
  
  }