From e323ebc101e786ec84957fb6bc6d5526a51e939e Mon Sep 17 00:00:00 2001 From: Mihail Date: Mon, 23 Nov 2015 16:06:07 +0200 Subject: [PATCH] fixed issues with crosses --- backend/controllers/CrossingUploadController.php | 55 ++++++++++++++++++++++++++++++++++++++----------------- backend/models/DetailsCrosses.php | 8 ++++---- common/components/parsers/CustomConverter.php | 4 ++-- common/components/parsers/config.php | 3 ++- common/models/DetailsCrosses.php | 4 ++-- common/models/DetailsCrossesSearch.php | 12 ++++++------ tests/runtime/cache/co/converter.bin | 1 + tests/unit/CrossesParsingTest.php | 28 +++++++++++++++++++++++----- 8 files changed, 78 insertions(+), 37 deletions(-) create mode 100644 tests/runtime/cache/co/converter.bin diff --git a/backend/controllers/CrossingUploadController.php b/backend/controllers/CrossingUploadController.php index c89b273..ebc5b36 100755 --- a/backend/controllers/CrossingUploadController.php +++ b/backend/controllers/CrossingUploadController.php @@ -12,6 +12,7 @@ use backend\components\base\BaseActiveRecord; use backend\components\base\BaseController; use common\components\CustomArrayHelper; use common\components\CustomVarDamp; +use yii\base\ErrorException; use yii\base\Model; use yii\data\ArrayDataProvider; use yii\db\ActiveRecord; @@ -125,7 +126,7 @@ class CrossingUploadController extends BaseController } // провалидируем выбранные колонки - if ($model->validate()) { + if ( $model->validate() ) { // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы $arr = $model->toArray(); @@ -142,7 +143,7 @@ class CrossingUploadController extends BaseController $crosses_model = new DetailsCrosses(); - if ( $this->validateModel( $crosses_model , $data ) && $crosses_model->ManualInsertWithIgnore( $data ) ) { + if ( $crosses_model->ManualInsertWithIgnore( $data ) ) { Yii::$app->session->setFlash('success', 'Файл кроссов успешно загружен'); @@ -157,7 +158,7 @@ class CrossingUploadController extends BaseController } else { - // не прошла валидация форма загрузки файлов + // не прошла валидация формы загрузки файлов $errors_str = ''; foreach ($model->getErrors() as $error) { $errors_str .= implode(array_values($error)); @@ -189,16 +190,30 @@ class CrossingUploadController extends BaseController $fields[] = 'CROSS_ARTICLE'; } if ($fields) { - $options ['configuration'] = ["article" => $fields, + $options ['converter_conf']['configuration'] = ["article" => $fields, "string" => ['ARTICLE', 'CROSS_ARTICLE'],]; } else { - $options ['configuration'] = ["string" => ['ARTICLE', 'CROSS_ARTICLE'],]; + $options ['converter_conf']['configuration'] = ["string" => ['ARTICLE', 'CROSS_ARTICLE'],]; } + // получим базовую конфигурацию и объеденим её с той что образовалась после выбора пользователем настроек + $basic_options = Yii::$app->multiparser->getConfiguration( 'csv', 'crosses' ); + $options = array_merge_recursive( $options, $basic_options ); + + // для доп массива обратных строк + $i = count( $data ) - 1; + $reverse_data = []; foreach ( $data as &$row ) { - $row = Yii::$app->converter->convertByConfiguration( $row, $options ); + $row = Yii::$app->converter->convertByConfiguration( $row, $options['converter_conf'] ); + // нужно добавить обратную строку по кроссам + $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']; + $i++; } + $data = array_merge( $data, $reverse_data ); return $data; } @@ -236,15 +251,21 @@ class CrossingUploadController extends BaseController } - protected function validateModel( BaseActiveRecord $model, array $data ){ - - foreach ( $data as $row ) { - if ( !$model->validate( $row ) ) { - $model->throwStringErrorException( key( $data ) ); - }; - } - - return true; - - } +// protected function validateModel( BaseActiveRecord $model, array $data ){ +// +// foreach ( $data as $row ) { +// // подготовим данные к валидации +// $validate_attr[$model->formName()] = $row; +// if( !$model->load( $validate_attr ) ){ +// // такой ситуации не должно быть, но на всякий случай +// throw new ErrorException('Незаполнены обязательные поля формы.'); +// } +// if ( !$model->validate( ) ) { +// $model->throwStringErrorException( key( $data ) ); +// }; +// } +// +// return true; +// +// } } \ No newline at end of file diff --git a/backend/models/DetailsCrosses.php b/backend/models/DetailsCrosses.php index 12ccb06..2841609 100755 --- a/backend/models/DetailsCrosses.php +++ b/backend/models/DetailsCrosses.php @@ -80,10 +80,10 @@ class DetailsCrosses extends \backend\components\base\BaseActiveRecord $query = preg_replace('/INSERT/','INSERT IGNORE', $query); $rows = Yii::$app->db->createCommand($query)->execute(); - // если нет результата вернемся с ошибкой - if ( $rows == 0 ) { - return false; - } +// // если нет результата вернемся с ошибкой +// if ( $rows == 0 ) { +// return false; +// } } diff --git a/common/components/parsers/CustomConverter.php b/common/components/parsers/CustomConverter.php index dc967d2..347ae9f 100755 --- a/common/components/parsers/CustomConverter.php +++ b/common/components/parsers/CustomConverter.php @@ -39,7 +39,6 @@ class CustomConverter extends Converter public static function convertToCrosses( array $row ) { - $details_model = new DetailsCrosses(); // проверим все ли обязательные колонки были указаны пользователем $details_model->load(['DetailsCrosses' => $row]); @@ -53,6 +52,7 @@ class CustomConverter extends Converter } return $row; } + public function ConvertToMultiply(array $row) { $PRICE = $row['PRICE']; @@ -128,7 +128,7 @@ class CustomConverter extends Converter public static function convertToBrand($value) { - $res = self::convertToEncode($value);; + $res = self::convertToEncode($value); $res = trim(strtoupper($res)); $res = str_replace("Ä", "A", str_replace("Ö", "O", str_replace("Ü", "U", str_replace("Ë", "E", str_replace("Ò", "O", $res))))); $res = str_replace(array('@', '#', '~', '"', "'", "?", "!"), '', $res); diff --git a/common/components/parsers/config.php b/common/components/parsers/config.php index edce06d..b068243 100755 --- a/common/components/parsers/config.php +++ b/common/components/parsers/config.php @@ -39,9 +39,10 @@ 'crosses' => ['class' => 'common\components\parsers\CustomCsvParser', 'auto_detect_first_line' => true, 'min_column_quantity' => 4, - // 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'], + // 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'], 'converter_conf' => [ 'class' => ' common\components\parsers\CustomConverter', + 'hasKey' => 1, 'configuration' => [ "brand" => ['BRAND', 'CROSS_BRAND'], "crosses" => [], diff --git a/common/models/DetailsCrosses.php b/common/models/DetailsCrosses.php index 6e5ef93..3bc16c8 100755 --- a/common/models/DetailsCrosses.php +++ b/common/models/DetailsCrosses.php @@ -45,8 +45,8 @@ class DetailsCrosses extends \yii\db\ActiveRecord 'ID' => 'ID', 'ARTICLE' => 'АРТИКУЛ', 'BRAND' => 'БРЕНД', - 'CROSS_ARTICLE' => 'КРОСС БРЕНД', - 'CROSS_BRAND' => 'КРОСС АРТИКУЛ', + 'CROSS_ARTICLE' => 'КРОСС АРТИКУЛ', + 'CROSS_BRAND' => 'КРОСС БРЕНД', 'timestamp' => 'ВРЕМЯ ДОБАВЛЕНИЯ', ]; } diff --git a/common/models/DetailsCrossesSearch.php b/common/models/DetailsCrossesSearch.php index 3d7ba34..fe5264e 100755 --- a/common/models/DetailsCrossesSearch.php +++ b/common/models/DetailsCrossesSearch.php @@ -47,18 +47,18 @@ class DetailsCrossesSearch extends DetailsCrosses ]; // удалим пустые параметры - if ( isset($params['DetailsCrossesSearch']) && is_array( $params['DetailsCrossesSearch'] )) { - $params['DetailsCrossesSearch'] = array_filter( $params['DetailsCrossesSearch'], function($val){ - return $val !=""; - }); - } +// if ( isset($params['DetailsCrossesSearch']) && is_array( $params['DetailsCrossesSearch'] )) { +// $params['DetailsCrossesSearch'] = array_filter( $params['DetailsCrossesSearch'], function($val){ +// return $val !=""; +// }); +// } $this->load($params); if ( !$this->validate() ) { $query->where('0=1'); } - if ( !$params || !$params['DetailsCrossesSearch'] ) { + if ( !$params || !isset($params['DetailsCrossesSearch']) ) { // если не переданы параметры - показываем первые 100 записей $pagination = false; $query->limit = 100; diff --git a/tests/runtime/cache/co/converter.bin b/tests/runtime/cache/co/converter.bin new file mode 100644 index 0000000..c7f1c25 --- /dev/null +++ b/tests/runtime/cache/co/converter.bin @@ -0,0 +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;} \ No newline at end of file diff --git a/tests/unit/CrossesParsingTest.php b/tests/unit/CrossesParsingTest.php index 0e24cd7..9bd6bef 100755 --- a/tests/unit/CrossesParsingTest.php +++ b/tests/unit/CrossesParsingTest.php @@ -13,21 +13,39 @@ class CrossesParsingTest extends \Codeception\TestCase\Test private $options; private $file_path; + private $data = []; public function _before() { $this->options[ 'mode' ] = 'crosses'; - $this->options[ 'converter_conf' ] = [ 'configuration' => [ "string" => ['ARTICLE', 'CROSS_ARTICLE'] ], 'hasKey' => 1 ]; + + $this->options[ 'crosses' ] = [ + 'class' => 'common\components\parsers\CustomCsvParser', + 'auto_detect_first_line' => true, + 'min_column_quantity' => 4, + 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'], + 'converter_conf' => [ + 'class' => ' common\components\parsers\CustomConverter', + 'configuration' => [ + "brand" => ['BRAND', 'CROSS_BRAND'], + "crosses" => [], + ]] + ]; + $this->file_path = Yii::getAlias('@data_parser') . '\crosses\test1.csv'; } public function testReadCrosses(){ - $data = []; - $data = Yii::$app->multiparser->parse( $this->file_path, $this->options ); - $this->assertNotEmpty( $data, 'Output array is empty' ); - $this->assertNotCount( 76, $data, 'Output array don`t have 76 rows' ); + $this->data = Yii::$app->multiparser->parse( $this->file_path, $this->options ); + $this->assertNotEmpty( $this->data, 'Output array is empty' ); + $this->assertNotCount( 76, $this->data, 'Output array don`t have 76 rows' ); + $this->assertArrayHasKey( 'ARTICLE', $this->data[0], 'Output array don`t have key - ARTICLE' ); + $this->assertArrayHasKey( 'CROSS_ARTICLE', $this->data[0], 'Output array don`t have key - CROSS_ARTICLE' ); + $this->assertArrayHasKey( 'BRAND', $this->data[0], 'Output array don`t have key - BRAND' ); + $this->assertArrayHasKey( 'CROSS_BRAND', $this->data[0], 'Output array don`t have key - CROSS_BRAND' ); + $this->assertEquals( $this->data[0]['BRAND'], strtoupper($this->data[0]['BRAND']),'BRAND not converted to upper case' ); } -- libgit2 0.21.4