Commit e323ebc101e786ec84957fb6bc6d5526a51e939e

Authored by Mihail
1 parent d11ec8b2

fixed issues with crosses

backend/controllers/CrossingUploadController.php
... ... @@ -12,6 +12,7 @@ use backend\components\base\BaseActiveRecord;
12 12 use backend\components\base\BaseController;
13 13 use common\components\CustomArrayHelper;
14 14 use common\components\CustomVarDamp;
  15 +use yii\base\ErrorException;
15 16 use yii\base\Model;
16 17 use yii\data\ArrayDataProvider;
17 18 use yii\db\ActiveRecord;
... ... @@ -125,7 +126,7 @@ class CrossingUploadController extends BaseController
125 126 }
126 127  
127 128 // провалидируем выбранные колонки
128   - if ($model->validate()) {
  129 + if ( $model->validate() ) {
129 130  
130 131 // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
131 132 $arr = $model->toArray();
... ... @@ -142,7 +143,7 @@ class CrossingUploadController extends BaseController
142 143  
143 144 $crosses_model = new DetailsCrosses();
144 145  
145   - if ( $this->validateModel( $crosses_model , $data ) && $crosses_model->ManualInsertWithIgnore( $data ) ) {
  146 + if ( $crosses_model->ManualInsertWithIgnore( $data ) ) {
146 147  
147 148 Yii::$app->session->setFlash('success', 'Файл кроссов успешно загружен');
148 149  
... ... @@ -157,7 +158,7 @@ class CrossingUploadController extends BaseController
157 158  
158 159  
159 160 } else {
160   - // не прошла валидация форма загрузки файлов
  161 + // не прошла валидация формы загрузки файлов
161 162 $errors_str = '';
162 163 foreach ($model->getErrors() as $error) {
163 164 $errors_str .= implode(array_values($error));
... ... @@ -189,16 +190,30 @@ class CrossingUploadController extends BaseController
189 190 $fields[] = 'CROSS_ARTICLE';
190 191 }
191 192 if ($fields) {
192   - $options ['configuration'] = ["article" => $fields,
  193 + $options ['converter_conf']['configuration'] = ["article" => $fields,
193 194 "string" => ['ARTICLE', 'CROSS_ARTICLE'],];
194 195 } else {
195   - $options ['configuration'] = ["string" => ['ARTICLE', 'CROSS_ARTICLE'],];
  196 + $options ['converter_conf']['configuration'] = ["string" => ['ARTICLE', 'CROSS_ARTICLE'],];
196 197 }
197 198  
  199 + // получим базовую конфигурацию и объеденим её с той что образовалась после выбора пользователем настроек
  200 + $basic_options = Yii::$app->multiparser->getConfiguration( 'csv', 'crosses' );
  201 + $options = array_merge_recursive( $options, $basic_options );
  202 +
  203 + // для доп массива обратных строк
  204 + $i = count( $data ) - 1;
  205 + $reverse_data = [];
198 206 foreach ( $data as &$row ) {
199   - $row = Yii::$app->converter->convertByConfiguration( $row, $options );
  207 + $row = Yii::$app->converter->convertByConfiguration( $row, $options['converter_conf'] );
  208 + // нужно добавить обратную строку по кроссам
  209 + $reverse_data[ $i ]['ARTICLE'] = $row['CROSS_ARTICLE'];
  210 + $reverse_data[ $i ]['CROSS_ARTICLE'] = $row['ARTICLE'];
  211 + $reverse_data[ $i ]['BRAND'] = $row['CROSS_BRAND'];
  212 + $reverse_data[ $i ]['CROSS_BRAND'] = $row['BRAND'];
  213 + $i++;
200 214 }
201 215  
  216 + $data = array_merge( $data, $reverse_data );
202 217 return $data;
203 218  
204 219 }
... ... @@ -236,15 +251,21 @@ class CrossingUploadController extends BaseController
236 251  
237 252 }
238 253  
239   - protected function validateModel( BaseActiveRecord $model, array $data ){
240   -
241   - foreach ( $data as $row ) {
242   - if ( !$model->validate( $row ) ) {
243   - $model->throwStringErrorException( key( $data ) );
244   - };
245   - }
246   -
247   - return true;
248   -
249   - }
  254 +// protected function validateModel( BaseActiveRecord $model, array $data ){
  255 +//
  256 +// foreach ( $data as $row ) {
  257 +// // подготовим данные к валидации
  258 +// $validate_attr[$model->formName()] = $row;
  259 +// if( !$model->load( $validate_attr ) ){
  260 +// // такой ситуации не должно быть, но на всякий случай
  261 +// throw new ErrorException('Незаполнены обязательные поля формы.');
  262 +// }
  263 +// if ( !$model->validate( ) ) {
  264 +// $model->throwStringErrorException( key( $data ) );
  265 +// };
  266 +// }
  267 +//
  268 +// return true;
  269 +//
  270 +// }
250 271 }
251 272 \ No newline at end of file
... ...
backend/models/DetailsCrosses.php
... ... @@ -80,10 +80,10 @@ class DetailsCrosses extends \backend\components\base\BaseActiveRecord
80 80 $query = preg_replace('/INSERT/','INSERT IGNORE', $query);
81 81 $rows = Yii::$app->db->createCommand($query)->execute();
82 82  
83   - // если нет результата вернемся с ошибкой
84   - if ( $rows == 0 ) {
85   - return false;
86   - }
  83 +// // если нет результата вернемся с ошибкой
  84 +// if ( $rows == 0 ) {
  85 +// return false;
  86 +// }
87 87  
88 88 }
89 89  
... ...
common/components/parsers/CustomConverter.php
... ... @@ -39,7 +39,6 @@ class CustomConverter extends Converter
39 39  
40 40 public static function convertToCrosses( array $row )
41 41 {
42   -
43 42 $details_model = new DetailsCrosses();
44 43 // проверим все ли обязательные колонки были указаны пользователем
45 44 $details_model->load(['DetailsCrosses' => $row]);
... ... @@ -53,6 +52,7 @@ class CustomConverter extends Converter
53 52 }
54 53 return $row;
55 54 }
  55 +
56 56 public function ConvertToMultiply(array $row)
57 57 {
58 58 $PRICE = $row['PRICE'];
... ... @@ -128,7 +128,7 @@ class CustomConverter extends Converter
128 128  
129 129 public static function convertToBrand($value)
130 130 {
131   - $res = self::convertToEncode($value);;
  131 + $res = self::convertToEncode($value);
132 132 $res = trim(strtoupper($res));
133 133 $res = str_replace("Ä", "A", str_replace("Ö", "O", str_replace("Ü", "U", str_replace("Ë", "E", str_replace("Ò", "O", $res)))));
134 134 $res = str_replace(array('@', '#', '~', '"', "'", "?", "!"), '', $res);
... ...
common/components/parsers/config.php
... ... @@ -39,9 +39,10 @@
39 39 'crosses' => ['class' => 'common\components\parsers\CustomCsvParser',
40 40 'auto_detect_first_line' => true,
41 41 'min_column_quantity' => 4,
42   - // 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'],
  42 + // 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'],
43 43 'converter_conf' => [
44 44 'class' => ' common\components\parsers\CustomConverter',
  45 + 'hasKey' => 1,
45 46 'configuration' => [
46 47 "brand" => ['BRAND', 'CROSS_BRAND'],
47 48 "crosses" => [],
... ...
common/models/DetailsCrosses.php
... ... @@ -45,8 +45,8 @@ class DetailsCrosses extends \yii\db\ActiveRecord
45 45 'ID' => 'ID',
46 46 'ARTICLE' => 'АРТИКУЛ',
47 47 'BRAND' => 'БРЕНД',
48   - 'CROSS_ARTICLE' => 'КРОСС БРЕНД',
49   - 'CROSS_BRAND' => 'КРОСС АРТИКУЛ',
  48 + 'CROSS_ARTICLE' => 'КРОСС АРТИКУЛ',
  49 + 'CROSS_BRAND' => 'КРОСС БРЕНД',
50 50 'timestamp' => 'ВРЕМЯ ДОБАВЛЕНИЯ',
51 51 ];
52 52 }
... ...
common/models/DetailsCrossesSearch.php
... ... @@ -47,18 +47,18 @@ class DetailsCrossesSearch extends DetailsCrosses
47 47 ];
48 48  
49 49 // удалим пустые параметры
50   - if ( isset($params['DetailsCrossesSearch']) && is_array( $params['DetailsCrossesSearch'] )) {
51   - $params['DetailsCrossesSearch'] = array_filter( $params['DetailsCrossesSearch'], function($val){
52   - return $val !="";
53   - });
54   - }
  50 +// if ( isset($params['DetailsCrossesSearch']) && is_array( $params['DetailsCrossesSearch'] )) {
  51 +// $params['DetailsCrossesSearch'] = array_filter( $params['DetailsCrossesSearch'], function($val){
  52 +// return $val !="";
  53 +// });
  54 +// }
55 55 $this->load($params);
56 56  
57 57 if ( !$this->validate() ) {
58 58 $query->where('0=1');
59 59 }
60 60  
61   - if ( !$params || !$params['DetailsCrossesSearch'] ) {
  61 + if ( !$params || !isset($params['DetailsCrossesSearch']) ) {
62 62 // если не переданы параметры - показываем первые 100 записей
63 63 $pagination = false;
64 64 $query->limit = 100;
... ...
tests/runtime/cache/co/converter.bin 0 → 100644
  1 +a:2:{i:0;a:3:{s:5:"class";s:42:" common\components\parsers\CustomConverter";s:13:"configuration";a:2:{s:5:"brand";a:2:{i:0;s:5:"BRAND";i:1;s:11:"CROSS_BRAND";}s:7:"crosses";a:0:{}}s:6:"hasKey";i:1;}i:1;N;}
0 2 \ No newline at end of file
... ...
tests/unit/CrossesParsingTest.php
... ... @@ -13,21 +13,39 @@ class CrossesParsingTest extends \Codeception\TestCase\Test
13 13  
14 14 private $options;
15 15 private $file_path;
  16 + private $data = [];
16 17  
17 18 public function _before()
18 19 {
19 20 $this->options[ 'mode' ] = 'crosses';
20   - $this->options[ 'converter_conf' ] = [ 'configuration' => [ "string" => ['ARTICLE', 'CROSS_ARTICLE'] ], 'hasKey' => 1 ];
  21 +
  22 + $this->options[ 'crosses' ] = [
  23 + 'class' => 'common\components\parsers\CustomCsvParser',
  24 + 'auto_detect_first_line' => true,
  25 + 'min_column_quantity' => 4,
  26 + 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'],
  27 + 'converter_conf' => [
  28 + 'class' => ' common\components\parsers\CustomConverter',
  29 + 'configuration' => [
  30 + "brand" => ['BRAND', 'CROSS_BRAND'],
  31 + "crosses" => [],
  32 + ]]
  33 + ];
  34 +
21 35 $this->file_path = Yii::getAlias('@data_parser') . '\crosses\test1.csv';
22 36  
23 37 }
24 38  
25 39 public function testReadCrosses(){
26 40  
27   - $data = [];
28   - $data = Yii::$app->multiparser->parse( $this->file_path, $this->options );
29   - $this->assertNotEmpty( $data, 'Output array is empty' );
30   - $this->assertNotCount( 76, $data, 'Output array don`t have 76 rows' );
  41 + $this->data = Yii::$app->multiparser->parse( $this->file_path, $this->options );
  42 + $this->assertNotEmpty( $this->data, 'Output array is empty' );
  43 + $this->assertNotCount( 76, $this->data, 'Output array don`t have 76 rows' );
  44 + $this->assertArrayHasKey( 'ARTICLE', $this->data[0], 'Output array don`t have key - ARTICLE' );
  45 + $this->assertArrayHasKey( 'CROSS_ARTICLE', $this->data[0], 'Output array don`t have key - CROSS_ARTICLE' );
  46 + $this->assertArrayHasKey( 'BRAND', $this->data[0], 'Output array don`t have key - BRAND' );
  47 + $this->assertArrayHasKey( 'CROSS_BRAND', $this->data[0], 'Output array don`t have key - CROSS_BRAND' );
  48 + $this->assertEquals( $this->data[0]['BRAND'], strtoupper($this->data[0]['BRAND']),'BRAND not converted to upper case' );
31 49 }
32 50  
33 51  
... ...