RgGrupController.php 8.07 KB
<?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;
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;

class RgGrupController extends BaseController {
    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) {
                    $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 );

                    // сохраним подготовленные данные
                    $margins_groups = new MarginsGroups();
                    $margins_groups->attributes = $row;

                    if ( !$margins_groups->save() ) {
                        $errors_str = '';
                        foreach ($margins_groups->getErrors() as $error) {
                            $errors_str .= implode( array_values($error) );
                        }
                        throw new \ErrorException( $errors_str );
                }
            }

               Yii::$app->session->setFlash('success');
                // все прошло успешно - очищаем кеш
                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]);



            }

        }

    }
}