CrossingUploadController.php 10.6 KB
<?php
/**
 * Created by PhpStorm.
 * User: Tsurkanov
 * Date: 15.10.2015
 * Time: 12:27
 */

namespace backend\controllers;

use backend\components\base\BaseController;
use common\components\CustomVarDamp;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use backend\models\UploadFileCrossingForm;
use backend\models\DetailsCrosses;
use yii\web\UploadedFile;
use \Yii;

class CrossingUploadController extends BaseController
{
    public $layout = "/column";


        /**
         * @inheritdoc
         */
        public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'error', 'download-photo','delete-image','result' ],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['logout', 'index','create','update','view','delete',],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }
    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }


    public function actionIndex()
    {
        $model = new UploadFileCrossingForm();
        return $this->render('index', ['model' => $model]);
    }

    public function actionResult()
    {
        $model = new UploadFileCrossingForm();
        $data = [];
        if ($model->load(Yii::$app->request->post())) {
            $model->file = UploadedFile::getInstance($model, 'file');

            if ($model->validate()) {
                $file_name = $model->file->name;
                $model->file_path = Yii::getAlias('@temp_upload') . '/' . $file_name;

                $model->file->saveAs($model->file_path);
                //запускаем парсинг
                // доп. опции для парсера - удаление префикса в артикулах
                $options['mode'] = 'crosses';
                $fields = [];
                if ($model->delete_prefix1) {
                    $fields[] = 'ARTICLE';
                }
                if ($model->delete_prefix2) {
                    $fields[] = 'CROSS_ARTICLE';
                }
                if ( $fields ) {
                    $options [ 'converter_conf' ] = [ 'configuration' => [ "article"   => $fields ,
                                                        "string"   => ['ARTICLE', 'CROSS_ARTICLE'],] ];
                } else {
                    $options [ 'converter_conf' ] = [ 'configuration' => [ "string"   => ['ARTICLE', 'CROSS_ARTICLE'], ] ];
                }

                $data = $model->readFile( $options );
                $crosses_model = new DetailsCrosses();
                $crosses_model->ManualInsertWithIgnore( $data );

                Yii::$app->session->setFlash('success', 'Файл кроссов успешно загружен');
                return $this->render('index', ['model' => $model]);
            }else{
                // не прошла валидация форма загрузки файлов
                $errors_str = '';
                foreach ($model->getErrors() as $error) {
                    $errors_str .= implode( array_values($error) );
                }
                throw new \ErrorException( $errors_str );
            }

        } else {
            throw new \ErrorException( 'Ошибка загрузки данных' );
        }
    }


//    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]);
//
//        }
//
//    }
}