[ '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), 1800); // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных Yii::$app->getCache()->set('parser_configuration', serialize($model), 1800); } else { // не прошла валидация форма загрузки файлов $errors_str = ''; foreach ($model->getErrors() as $error) { $errors_str .= implode(array_values($error)); } throw new \ErrorException($errors_str); } // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные } 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, ], ]); // создадим модель на столько реквизитов сколько колонок в отпарсенном файле $last_index = end(array_flip($data[0])); $header_counts = $last_index + 1; $header_model = DynamicFormHelper::CreateDynamicModel($header_counts); // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список) $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('Ошибка кеша'); } array_walk($arr, function (&$val) { $val = '!' . $val; }); // соотнесем отпарсенные данные с соответсивем полученным от пользователя // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию $data = CustomArrayHelper::createAssocArray($data, $arr, 'attr_'); // в первой строке у нас заголовки - уберем unset( $data[0] ); // подготовим данные для записи в таблицу w_margins_groups $arr_values = []; $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) { 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, ['precision' => 6]); $arr_values[] = $row; } } // сохраним подготовленные данные MarginsGroups::ManualInsertWithUpdate( $arr_values, [ 'group','importer_id','margin_id' ] ); Yii::$app->session->setFlash('success', "Файл {$configuration['file']} успешно загружен"); // все прошло успешно - очищаем кеш Yii::$app->getCache()->delete('parser_data'); Yii::$app->getCache()->delete('parser_configuration'); if (file_exists($configuration['file_path'])) unlink($configuration['file_path']); return $this->render('index', ['model' => $configuration]); } } // public function actionMail() // { // $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'); // $mail_saver->saveAttachmentsTo(); // } }