UploadFileParsingForm.php 3.17 KB
<?php
namespace backend\models;

use yii\base\ErrorException;
use yii\base\Model;
use yii\web\UploadedFile;
use Yii;
use common\components\CustomVarDamp;

/**
 * UploadForm is the model behind the upload form.
 */
class UploadFileParsingForm extends Model
{
    /**
     * @var UploadedFile file attribute
     */
    // атрибуты формы
    public $file;
    public $importer_id;
    public $action;
    public $delimiter;
    public $delete_price;
    public $delete_prefix;

    // служебные атрибуты
    public $file_path;
    public $success;
    public $mode; //0 - режим ручной загрузки, 1 - режим автозагрузки
    public $record_id; // id таблицы в которую записывается информация о файле

    /**
     * @return array the validation rules.
     */
    public function __construct($config = [])
    {
        parent::__construct($config);
        if ( $this->mode ) {
            // автозагрузка, проставим сценарий
            $this->scenario = 'auto';
        }

    }


    public function rules()
    {
        return [
            ['importer_id', 'required', 'message' => 'Не указан поставщик!' ],
            ['file', 'required', 'message' => 'Не выбран файл!' ],
            [['file'], 'file', 'extensions' => ['csv', 'xml'], 'checkExtensionByMimeType'=>false ],
            ['importer_id', 'integer','max' => 999999, 'min' => 0 ],
            [['action','delete_prefix', 'delete_price', 'success'], 'boolean', 'except' => 'auto' ], // только для ручной загрузки
            ['delimiter', 'string', 'max' => 1],
            [['mode','record_id'], 'safe'],
            ['delimiter', 'default', 'value' => ';'],
            [ 'success', 'default', 'value' => false]

        ];
    }

    public function attributeLabels()
    {
        return [
            'file' => Yii::t('app', 'Источник'),
            'importer_id' => Yii::t('app', 'Поставщик'),
            'delimiter' => Yii::t('app', 'Разделитель'),
        ];
    }

    public function readFile( $options = [] ){

        $data = Yii::$app->multiparser->parse( $this->file_path, $options );
        CustomVarDamp::dumpAndDie($data);
        if( !is_array( $data ) || count($data) == 0 ){
            throw new ErrorException("Ошибка чтения из файла прайса {$this->file_path}");
        }
        // файл больше не нужен - данные прочитаны и сохранены в кеш
        if( file_exists($this->file_path) )
            //@ todo - перестало работать - нет доступа на удалениев этом сеансе, в следующем - файл удаляется - разобраться
            //unlink( $this->file_path );

        return $data;
    }

    public function fields()
    {
        return [

            'importer_id',
            'delimiter',
            'delete_price',
            'delete_prefix',
            'file_path',
            // id записи таблицы ImportersFiles,
          //  'id' => 'record_id',
        ];
    }


}