706a1491
Mihail
add form, model a...
|
1
2
3
4
5
6
7
8
9
10
|
<?php
/**
* Created by PhpStorm.
* User: Tsurkanov
* Date: 15.10.2015
* Time: 12:27
*/
namespace backend\controllers;
|
706a1491
Mihail
add form, model a...
|
11
|
use backend\components\base\BaseController;
|
4702bfa7
Mihail
change writing cr...
|
12
|
use common\components\CustomArrayHelper;
|
1e337311
Mihail
add parser trait ...
|
13
14
|
use common\components\exceptions\CrossParsingException;
use yii\base\Exception;
|
59eedf0c
Mihail
add form result f...
|
15
|
use yii\data\ArrayDataProvider;
|
f5b3baf1
Administrator
access in admin
|
16
|
use yii\filters\VerbFilter;
|
706a1491
Mihail
add form, model a...
|
17
18
19
|
use yii\filters\AccessControl;
use backend\models\UploadFileCrossingForm;
use backend\models\DetailsCrosses;
|
ad2e91f7
Mihail
move multyparser ...
|
20
|
use common\components\parsers\DynamicFormHelper;
|
706a1491
Mihail
add form, model a...
|
21
|
use yii\web\UploadedFile;
|
c2ef0939
Mihail
add array model v...
|
22
|
use common\components\ModelArrayValidator;
|
706a1491
Mihail
add form, model a...
|
23
|
use \Yii;
|
1e337311
Mihail
add parser trait ...
|
24
|
use backend\components\traits\ParserTrait;
|
706a1491
Mihail
add form, model a...
|
25
26
27
|
class CrossingUploadController extends BaseController
{
|
1e337311
Mihail
add parser trait ...
|
28
|
use ParserTrait;
|
706a1491
Mihail
add form, model a...
|
29
30
|
public $layout = "/column";
|
4702bfa7
Mihail
change writing cr...
|
31
32
33
34
|
/**
* @inheritdoc
*/
public function behaviors()
|
706a1491
Mihail
add form, model a...
|
35
36
37
38
39
40
|
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
|
1e337311
Mihail
add parser trait ...
|
41
|
'actions' => ['result', 'index', 'write', 'error'],
|
706a1491
Mihail
add form, model a...
|
42
43
44
45
46
|
'allow' => true,
'roles' => ['@'],
],
],
],
|
f5b3baf1
Administrator
access in admin
|
47
48
49
50
51
52
|
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
|
706a1491
Mihail
add form, model a...
|
53
54
|
];
}
|
4702bfa7
Mihail
change writing cr...
|
55
|
|
706a1491
Mihail
add form, model a...
|
56
57
58
59
60
61
62
|
public function actionIndex()
{
$model = new UploadFileCrossingForm();
return $this->render('index', ['model' => $model]);
}
|
1e337311
Mihail
add parser trait ...
|
63
|
|
706a1491
Mihail
add form, model a...
|
64
65
66
67
|
public function actionResult()
{
$model = new UploadFileCrossingForm();
$data = [];
|
1e337311
Mihail
add parser trait ...
|
68
|
if ( $model->load(Yii::$app->request->post()) ) {
|
706a1491
Mihail
add form, model a...
|
69
|
$model->file = UploadedFile::getInstance($model, 'file');
|
1e337311
Mihail
add parser trait ...
|
70
71
|
if ( $model->validate() ) {
|
706a1491
Mihail
add form, model a...
|
72
73
|
$file_name = $model->file->name;
$model->file_path = Yii::getAlias('@temp_upload') . '/' . $file_name;
|
706a1491
Mihail
add form, model a...
|
74
75
|
$model->file->saveAs($model->file_path);
//запускаем парсинг
|
2d4b1514
Mihail
adapted xls parser
|
76
77
|
$options['mode'] = 'crosses';
$data = $model->readFile($options);
|
59eedf0c
Mihail
add form result f...
|
78
|
// сохраняем в кеш отпарсенные даные
|
1e337311
Mihail
add parser trait ...
|
79
80
81
82
83
|
$this->parserCacheHandler( 1, $data, $model );
} else {
// не прошла валидация формы загрузки файлов
$errors_str = "Ошибка загрузки файла. ";
$this->throwStringErrorException( $model , new CrossParsingException( $errors_str ) );
|
59eedf0c
Mihail
add form result f...
|
84
|
}
|
1e337311
Mihail
add parser trait ...
|
85
86
87
88
89
|
} else if ( Yii::$app->getCache()->get('parser_data') ) {
$data = json_decode( Yii::$app->getCache()->get('parser_data'), true );
|
59eedf0c
Mihail
add form result f...
|
90
|
}
|
1e337311
Mihail
add parser trait ...
|
91
92
|
// сборка динамической модели и её рендеринг
return $this->renderResultView( $data );
|
59eedf0c
Mihail
add form result f...
|
93
94
|
}
|
59eedf0c
Mihail
add form result f...
|
95
96
|
public function actionWrite()
{
|
1e337311
Mihail
add parser trait ...
|
97
|
set_time_limit(600);
|
59eedf0c
Mihail
add form result f...
|
98
99
100
101
|
//получим колонки которые выбрал пользователь
$arr_attributes = Yii::$app->request->post()['DynamicModel'];
//соберем модель по полученным данным
$model = DynamicFormHelper::CreateDynamicModel($arr_attributes);
|
209dad04
Mihail
add validator for...
|
102
|
$crosses_model = new DetailsCrosses();
|
1e337311
Mihail
add parser trait ...
|
103
|
$arr_keys = array_keys($this->getBasicColumns());
|
59eedf0c
Mihail
add form result f...
|
104
105
|
//добавим правила валидации (колонки должны быть те что в модели)
foreach ($arr_attributes as $key => $value) {
|
1e337311
Mihail
add parser trait ...
|
106
|
$model->addRule($key, 'in', ['range' => $arr_keys]);
|
59eedf0c
Mihail
add form result f...
|
107
|
}
|
209dad04
Mihail
add validator for...
|
108
109
|
// установим режим проверки обязательных полей
$crosses_model->setScenario('form_upload_validation');
|
1e337311
Mihail
add parser trait ...
|
110
|
$model_validator = new ModelArrayValidator($crosses_model);
|
59eedf0c
Mihail
add form result f...
|
111
|
// провалидируем выбранные колонки
|
1e337311
Mihail
add parser trait ...
|
112
|
if ( $model->validate() && $model_validator->validateRow( array_flip( $arr_attributes ) ) ) {
|
59eedf0c
Mihail
add form result f...
|
113
114
115
116
117
|
// валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
$arr = $model->toArray();
// получим данные из кеша
|
78641da2
Mihail
rewrite parser wr...
|
118
|
$this->parserCacheHandler( 0, $data, $configuration );
|
59eedf0c
Mihail
add form result f...
|
119
120
121
|
// соотнесем отпарсенные данные с соответствием полученным от пользователя
// для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
|
1e337311
Mihail
add parser trait ...
|
122
|
$data = CustomArrayHelper::createAssocArray( $data, $arr, 'attr_' );
|
59eedf0c
Mihail
add form result f...
|
123
|
|
4702bfa7
Mihail
change writing cr...
|
124
125
|
// запустим конвертер над над данными
$data = $this->convertDataByConfiguration( $data, $configuration );
|
59eedf0c
Mihail
add form result f...
|
126
|
|
c2ef0939
Mihail
add array model v...
|
127
|
// валидируем отпарсенные данные моделью в которую будем записывать
|
209dad04
Mihail
add validator for...
|
128
|
$crosses_model->setScenario('default');
|
c2ef0939
Mihail
add array model v...
|
129
130
|
$data = $model_validator->validate( $data );
$msg = $model_validator->getMassage();
|
1e337311
Mihail
add parser trait ...
|
131
|
$type_msg = $model_validator->hasError() ? 'warning' : 'success';
|
c2ef0939
Mihail
add array model v...
|
132
133
|
$model_validator->close();
|
1e337311
Mihail
add parser trait ...
|
134
135
136
137
|
$data = $this->reverseCrosses($data);
try {
if ($crosses_model->ManualInsertWithIgnore( $data )) {
|
59eedf0c
Mihail
add form result f...
|
138
|
|
1e337311
Mihail
add parser trait ...
|
139
140
|
// очистим кеш
$this->parserCacheHandler(2);
|
9755cb59
Mihail
fixed permissions...
|
141
|
|
1e337311
Mihail
add parser trait ...
|
142
143
|
if (file_exists($configuration['file_path']))
unlink($configuration['file_path']);
|
78641da2
Mihail
rewrite parser wr...
|
144
|
|
1e337311
Mihail
add parser trait ...
|
145
146
|
Yii::$app->session->setFlash($type_msg, $msg);
return $this->render('index', ['model' => $configuration]);
|
9755cb59
Mihail
fixed permissions...
|
147
|
|
1e337311
Mihail
add parser trait ...
|
148
149
|
}
} catch (Exception $e) {
|
9755cb59
Mihail
fixed permissions...
|
150
|
|
1e337311
Mihail
add parser trait ...
|
151
|
new CrossParsingException( $e->getMessage() );
|
9755cb59
Mihail
fixed permissions...
|
152
|
}
|
59eedf0c
Mihail
add form result f...
|
153
|
|
4702bfa7
Mihail
change writing cr...
|
154
|
} else {
|
884c04ad
Mihail
fixed issues with...
|
155
|
// не прошла валидация формы загрузки файлов
|
209dad04
Mihail
add validator for...
|
156
|
$errors_str = "Ошибка валидации формы загрузки файлов. ";
|
1e337311
Mihail
add parser trait ...
|
157
|
$this->throwStringErrorException( $crosses_model , 'common\components\exceptions\CrossParsingException', $errors_str );
|
4702bfa7
Mihail
change writing cr...
|
158
159
160
161
162
163
164
165
166
167
|
}
}
protected function getBasicColumns()
{
$basicColumns_array = Yii::$app->multiparser->getConfiguration('csv', 'crosses');
if (isset($basicColumns_array['basic_column'])) {
return $basicColumns_array['basic_column'];
} else {
throw new \ErrorException('Ошибка конфигурационного файла кроссов. Не указаны базовые колнки для пользовательской формы выбора.');
|
706a1491
Mihail
add form, model a...
|
168
|
}
|
59eedf0c
Mihail
add form result f...
|
169
|
|
706a1491
Mihail
add form, model a...
|
170
|
}
|
a80ff469
Mihail
add expiration ti...
|
171
|
|
1e337311
Mihail
add parser trait ...
|
172
173
|
protected function convertDataByConfiguration($data, $configuration)
{
|
4702bfa7
Mihail
change writing cr...
|
174
175
176
177
178
179
180
181
182
183
|
// доп. опции для парсера - удаление префикса в артикулах
$options['mode'] = 'crosses';
$fields = [];
if ($configuration['delete_prefix1']) {
$fields[] = 'ARTICLE';
}
if ($configuration['delete_prefix2']) {
$fields[] = 'CROSS_ARTICLE';
}
if ($fields) {
|
1e337311
Mihail
add parser trait ...
|
184
|
$options ['converter_conf']['configuration'] = ["article" => $fields,
|
4702bfa7
Mihail
change writing cr...
|
185
186
|
"string" => ['ARTICLE', 'CROSS_ARTICLE'],];
} else {
|
1e337311
Mihail
add parser trait ...
|
187
|
$options ['converter_conf']['configuration'] = ["string" => ['ARTICLE', 'CROSS_ARTICLE'],];
|
4702bfa7
Mihail
change writing cr...
|
188
189
|
}
|
884c04ad
Mihail
fixed issues with...
|
190
|
// получим базовую конфигурацию и объеденим её с той что образовалась после выбора пользователем настроек
|
1e337311
Mihail
add parser trait ...
|
191
192
|
$basic_options = Yii::$app->multiparser->getConfiguration('csv', 'crosses');
$options = array_merge_recursive($options, $basic_options);
|
884c04ad
Mihail
fixed issues with...
|
193
|
|
1e337311
Mihail
add parser trait ...
|
194
195
|
foreach ($data as &$row) {
$row = Yii::$app->converter->convertByConfiguration($row, $options['converter_conf']);
|
4702bfa7
Mihail
change writing cr...
|
196
197
|
}
|
4702bfa7
Mihail
change writing cr...
|
198
|
return $data;
|
4702bfa7
Mihail
change writing cr...
|
199
200
|
}
|
1e337311
Mihail
add parser trait ...
|
201
|
protected function reverseCrosses($data)
|
c2ef0939
Mihail
add array model v...
|
202
203
|
{
// для доп массива обратных строк
|
1e337311
Mihail
add parser trait ...
|
204
|
$i = count($data) - 1;
|
c2ef0939
Mihail
add array model v...
|
205
|
$reverse_data = [];
|
1e337311
Mihail
add parser trait ...
|
206
|
foreach ($data as &$row) {
|
c2ef0939
Mihail
add array model v...
|
207
|
// нужно добавить обратную строку по кроссам
|
1e337311
Mihail
add parser trait ...
|
208
209
210
211
|
$reverse_data[$i]['ARTICLE'] = $row['CROSS_ARTICLE'];
$reverse_data[$i]['CROSS_ARTICLE'] = $row['ARTICLE'];
$reverse_data[$i]['BRAND'] = $row['CROSS_BRAND'];
$reverse_data[$i]['CROSS_BRAND'] = $row['BRAND'];
|
c2ef0939
Mihail
add array model v...
|
212
213
|
$i++;
}
|
1e337311
Mihail
add parser trait ...
|
214
|
$data = array_merge($data, $reverse_data);
|
c2ef0939
Mihail
add array model v...
|
215
216
217
218
|
return $data;
}
|
706a1491
Mihail
add form, model a...
|
219
|
}
|