Commit 884c04ade5ed5c9cc2f02f3e3a0330ec8dc0dea5
1 parent
9755cb59
fixed issues with crosses
Showing
8 changed files
with
78 additions
and
37 deletions
Show diff stats
backend/controllers/CrossingUploadController.php
| @@ -12,6 +12,7 @@ use backend\components\base\BaseActiveRecord; | @@ -12,6 +12,7 @@ use backend\components\base\BaseActiveRecord; | ||
| 12 | use backend\components\base\BaseController; | 12 | use backend\components\base\BaseController; |
| 13 | use common\components\CustomArrayHelper; | 13 | use common\components\CustomArrayHelper; |
| 14 | use common\components\CustomVarDamp; | 14 | use common\components\CustomVarDamp; |
| 15 | +use yii\base\ErrorException; | ||
| 15 | use yii\base\Model; | 16 | use yii\base\Model; |
| 16 | use yii\data\ArrayDataProvider; | 17 | use yii\data\ArrayDataProvider; |
| 17 | use yii\db\ActiveRecord; | 18 | use yii\db\ActiveRecord; |
| @@ -125,7 +126,7 @@ class CrossingUploadController extends BaseController | @@ -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 | $arr = $model->toArray(); | 132 | $arr = $model->toArray(); |
| @@ -142,7 +143,7 @@ class CrossingUploadController extends BaseController | @@ -142,7 +143,7 @@ class CrossingUploadController extends BaseController | ||
| 142 | 143 | ||
| 143 | $crosses_model = new DetailsCrosses(); | 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 | Yii::$app->session->setFlash('success', 'Файл кроссов успешно загружен'); | 148 | Yii::$app->session->setFlash('success', 'Файл кроссов успешно загружен'); |
| 148 | 149 | ||
| @@ -157,7 +158,7 @@ class CrossingUploadController extends BaseController | @@ -157,7 +158,7 @@ class CrossingUploadController extends BaseController | ||
| 157 | 158 | ||
| 158 | 159 | ||
| 159 | } else { | 160 | } else { |
| 160 | - // не прошла валидация форма загрузки файлов | 161 | + // не прошла валидация формы загрузки файлов |
| 161 | $errors_str = ''; | 162 | $errors_str = ''; |
| 162 | foreach ($model->getErrors() as $error) { | 163 | foreach ($model->getErrors() as $error) { |
| 163 | $errors_str .= implode(array_values($error)); | 164 | $errors_str .= implode(array_values($error)); |
| @@ -189,16 +190,30 @@ class CrossingUploadController extends BaseController | @@ -189,16 +190,30 @@ class CrossingUploadController extends BaseController | ||
| 189 | $fields[] = 'CROSS_ARTICLE'; | 190 | $fields[] = 'CROSS_ARTICLE'; |
| 190 | } | 191 | } |
| 191 | if ($fields) { | 192 | if ($fields) { |
| 192 | - $options ['configuration'] = ["article" => $fields, | 193 | + $options ['converter_conf']['configuration'] = ["article" => $fields, |
| 193 | "string" => ['ARTICLE', 'CROSS_ARTICLE'],]; | 194 | "string" => ['ARTICLE', 'CROSS_ARTICLE'],]; |
| 194 | } else { | 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 | foreach ( $data as &$row ) { | 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 | return $data; | 217 | return $data; |
| 203 | 218 | ||
| 204 | } | 219 | } |
| @@ -236,15 +251,21 @@ class CrossingUploadController extends BaseController | @@ -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 | \ No newline at end of file | 272 | \ No newline at end of file |
backend/models/DetailsCrosses.php
| @@ -80,10 +80,10 @@ class DetailsCrosses extends \backend\components\base\BaseActiveRecord | @@ -80,10 +80,10 @@ class DetailsCrosses extends \backend\components\base\BaseActiveRecord | ||
| 80 | $query = preg_replace('/INSERT/','INSERT IGNORE', $query); | 80 | $query = preg_replace('/INSERT/','INSERT IGNORE', $query); |
| 81 | $rows = Yii::$app->db->createCommand($query)->execute(); | 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,7 +39,6 @@ class CustomConverter extends Converter | ||
| 39 | 39 | ||
| 40 | public static function convertToCrosses( array $row ) | 40 | public static function convertToCrosses( array $row ) |
| 41 | { | 41 | { |
| 42 | - | ||
| 43 | $details_model = new DetailsCrosses(); | 42 | $details_model = new DetailsCrosses(); |
| 44 | // проверим все ли обязательные колонки были указаны пользователем | 43 | // проверим все ли обязательные колонки были указаны пользователем |
| 45 | $details_model->load(['DetailsCrosses' => $row]); | 44 | $details_model->load(['DetailsCrosses' => $row]); |
| @@ -53,6 +52,7 @@ class CustomConverter extends Converter | @@ -53,6 +52,7 @@ class CustomConverter extends Converter | ||
| 53 | } | 52 | } |
| 54 | return $row; | 53 | return $row; |
| 55 | } | 54 | } |
| 55 | + | ||
| 56 | public function ConvertToMultiply(array $row) | 56 | public function ConvertToMultiply(array $row) |
| 57 | { | 57 | { |
| 58 | $PRICE = $row['PRICE']; | 58 | $PRICE = $row['PRICE']; |
| @@ -128,7 +128,7 @@ class CustomConverter extends Converter | @@ -128,7 +128,7 @@ class CustomConverter extends Converter | ||
| 128 | 128 | ||
| 129 | public static function convertToBrand($value) | 129 | public static function convertToBrand($value) |
| 130 | { | 130 | { |
| 131 | - $res = self::convertToEncode($value);; | 131 | + $res = self::convertToEncode($value); |
| 132 | $res = trim(strtoupper($res)); | 132 | $res = trim(strtoupper($res)); |
| 133 | $res = str_replace("Ä", "A", str_replace("Ö", "O", str_replace("Ü", "U", str_replace("Ë", "E", str_replace("Ò", "O", $res))))); | 133 | $res = str_replace("Ä", "A", str_replace("Ö", "O", str_replace("Ü", "U", str_replace("Ë", "E", str_replace("Ò", "O", $res))))); |
| 134 | $res = str_replace(array('@', '#', '~', '"', "'", "?", "!"), '', $res); | 134 | $res = str_replace(array('@', '#', '~', '"', "'", "?", "!"), '', $res); |
common/components/parsers/config.php
| @@ -39,9 +39,10 @@ | @@ -39,9 +39,10 @@ | ||
| 39 | 'crosses' => ['class' => 'common\components\parsers\CustomCsvParser', | 39 | 'crosses' => ['class' => 'common\components\parsers\CustomCsvParser', |
| 40 | 'auto_detect_first_line' => true, | 40 | 'auto_detect_first_line' => true, |
| 41 | 'min_column_quantity' => 4, | 41 | 'min_column_quantity' => 4, |
| 42 | - // 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'], | 42 | + // 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'], |
| 43 | 'converter_conf' => [ | 43 | 'converter_conf' => [ |
| 44 | 'class' => ' common\components\parsers\CustomConverter', | 44 | 'class' => ' common\components\parsers\CustomConverter', |
| 45 | + 'hasKey' => 1, | ||
| 45 | 'configuration' => [ | 46 | 'configuration' => [ |
| 46 | "brand" => ['BRAND', 'CROSS_BRAND'], | 47 | "brand" => ['BRAND', 'CROSS_BRAND'], |
| 47 | "crosses" => [], | 48 | "crosses" => [], |
common/models/DetailsCrosses.php
| @@ -45,8 +45,8 @@ class DetailsCrosses extends \yii\db\ActiveRecord | @@ -45,8 +45,8 @@ class DetailsCrosses extends \yii\db\ActiveRecord | ||
| 45 | 'ID' => 'ID', | 45 | 'ID' => 'ID', |
| 46 | 'ARTICLE' => 'АРТИКУЛ', | 46 | 'ARTICLE' => 'АРТИКУЛ', |
| 47 | 'BRAND' => 'БРЕНД', | 47 | 'BRAND' => 'БРЕНД', |
| 48 | - 'CROSS_ARTICLE' => 'КРОСС БРЕНД', | ||
| 49 | - 'CROSS_BRAND' => 'КРОСС АРТИКУЛ', | 48 | + 'CROSS_ARTICLE' => 'КРОСС АРТИКУЛ', |
| 49 | + 'CROSS_BRAND' => 'КРОСС БРЕНД', | ||
| 50 | 'timestamp' => 'ВРЕМЯ ДОБАВЛЕНИЯ', | 50 | 'timestamp' => 'ВРЕМЯ ДОБАВЛЕНИЯ', |
| 51 | ]; | 51 | ]; |
| 52 | } | 52 | } |
common/models/DetailsCrossesSearch.php
| @@ -47,18 +47,18 @@ class DetailsCrossesSearch extends DetailsCrosses | @@ -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 | $this->load($params); | 55 | $this->load($params); |
| 56 | 56 | ||
| 57 | if ( !$this->validate() ) { | 57 | if ( !$this->validate() ) { |
| 58 | $query->where('0=1'); | 58 | $query->where('0=1'); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | - if ( !$params || !$params['DetailsCrossesSearch'] ) { | 61 | + if ( !$params || !isset($params['DetailsCrossesSearch']) ) { |
| 62 | // если не переданы параметры - показываем первые 100 записей | 62 | // если не переданы параметры - показываем первые 100 записей |
| 63 | $pagination = false; | 63 | $pagination = false; |
| 64 | $query->limit = 100; | 64 | $query->limit = 100; |
tests/unit/CrossesParsingTest.php
| @@ -13,21 +13,39 @@ class CrossesParsingTest extends \Codeception\TestCase\Test | @@ -13,21 +13,39 @@ class CrossesParsingTest extends \Codeception\TestCase\Test | ||
| 13 | 13 | ||
| 14 | private $options; | 14 | private $options; |
| 15 | private $file_path; | 15 | private $file_path; |
| 16 | + private $data = []; | ||
| 16 | 17 | ||
| 17 | public function _before() | 18 | public function _before() |
| 18 | { | 19 | { |
| 19 | $this->options[ 'mode' ] = 'crosses'; | 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 | $this->file_path = Yii::getAlias('@data_parser') . '\crosses\test1.csv'; | 35 | $this->file_path = Yii::getAlias('@data_parser') . '\crosses\test1.csv'; |
| 22 | 36 | ||
| 23 | } | 37 | } |
| 24 | 38 | ||
| 25 | public function testReadCrosses(){ | 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 |