Commit 1fe29bbeba36c8d36a957bf6d5d7b56d39672cc9

Authored by Mihail
1 parent f0dbd829

fixed parser and converter for console needs

backend/components/parsers/CustomCsvParser.php
@@ -9,6 +9,8 @@ @@ -9,6 +9,8 @@
9 namespace backend\components\parsers; 9 namespace backend\components\parsers;
10 10
11 11
  12 +use common\components\CustomVarDamp;
  13 +
12 class CustomCsvParser extends \yii\multiparser\CsvParser { 14 class CustomCsvParser extends \yii\multiparser\CsvParser {
13 15
14 public $last_line = 10; 16 public $last_line = 10;
@@ -33,9 +35,8 @@ class CustomCsvParser extends \yii\multiparser\CsvParser { @@ -33,9 +35,8 @@ class CustomCsvParser extends \yii\multiparser\CsvParser {
33 */ 35 */
34 protected function convert($arr) 36 protected function convert($arr)
35 { 37 {
36 - $result = \Yii::$app->multiparser->convertByConfiguration( $arr, $this->converter_conf );  
37 -  
38 - return $result; 38 + $arr = \Yii::$app->multiparser->convertByConfiguration($arr, $this->converter_conf);
  39 + return $arr;
39 40
40 } 41 }
41 42
backend/components/parsers/config.php
@@ -21,7 +21,9 @@ @@ -21,7 +21,9 @@
21 'console' => 21 'console' =>
22 ['class' => 'backend\components\parsers\CustomCsvParser', 22 ['class' => 'backend\components\parsers\CustomCsvParser',
23 'auto_detect_first_line' => true, 23 'auto_detect_first_line' => true,
  24 + 'hasHeaderRow' => true,
24 'converter_conf' => ['class' => ' backend\components\parsers\CustomConverter', 25 'converter_conf' => ['class' => ' backend\components\parsers\CustomConverter',
  26 + 'hasKey' => 1,
25 'configuration' => ["string" => 'DESCR', 27 'configuration' => ["string" => 'DESCR',
26 "float" => 'PRICE', 28 "float" => 'PRICE',
27 "integer" => ['BOX','ADD_BOX'] 29 "integer" => ['BOX','ADD_BOX']
backend/controllers/ParserController.php
@@ -16,7 +16,6 @@ use backend\models\Importers; @@ -16,7 +16,6 @@ use backend\models\Importers;
16 use yii\base\ErrorException; 16 use yii\base\ErrorException;
17 use common\components\PriceWriter; 17 use common\components\PriceWriter;
18 use common\components\CustomVarDamp; 18 use common\components\CustomVarDamp;
19 -use yii\web\ErrorAction;  
20 19
21 /** 20 /**
22 * Parser controller 21 * Parser controller
@@ -225,7 +224,7 @@ class ParserController extends BaseController @@ -225,7 +224,7 @@ class ParserController extends BaseController
225 $file_id = basename($server_file,".csv"); 224 $file_id = basename($server_file,".csv");
226 $arr_id_files[] = (int) $file_id; 225 $arr_id_files[] = (int) $file_id;
227 } 226 }
228 - Yii::$app->cache->set( 'files_to_delete',json_encode( $arr_id_files ) ); 227 + Yii::$app->cache->set( 'files_to_parse',json_encode( $arr_id_files ) );
229 $query = ImportersFiles::find()->where(['in', 'id', $arr_id_files])->orderBy(['upload_time' => SORT_DESC]); 228 $query = ImportersFiles::find()->where(['in', 'id', $arr_id_files])->orderBy(['upload_time' => SORT_DESC]);
230 229
231 $provider = new ActiveDataProvider([ 230 $provider = new ActiveDataProvider([
@@ -251,23 +250,79 @@ class ParserController extends BaseController @@ -251,23 +250,79 @@ class ParserController extends BaseController
251 unlink(Yii::getAlias('@auto_upload') . '/' . $id . '.csv' ); 250 unlink(Yii::getAlias('@auto_upload') . '/' . $id . '.csv' );
252 251
253 // удалим этот id и из кэша 252 // удалим этот id и из кэша
254 - if( $arr_id_files = Yii::$app->cache->get( 'files_to_delete' ) ){ 253 + if( $arr_id_files = Yii::$app->cache->get( 'files_to_parse' ) ){
255 $arr_id_files = json_decode($arr_id_files); 254 $arr_id_files = json_decode($arr_id_files);
256 if (isset( $arr_id_files[$id] ) ) { 255 if (isset( $arr_id_files[$id] ) ) {
257 unset( $arr_id_files[$id] ); 256 unset( $arr_id_files[$id] );
258 // положем уже обновленный массив 257 // положем уже обновленный массив
259 - Yii::$app->cache->set( 'files_to_delete',json_encode( $arr_id_files ) ); 258 + Yii::$app->cache->set( 'files_to_parse',json_encode( $arr_id_files ) );
260 } 259 }
261 } 260 }
262 // сообщим скрипту что все ОК 261 // сообщим скрипту что все ОК
263 echo 1; 262 echo 1;
264 } catch (ErrorException $e) { 263 } catch (ErrorException $e) {
265 264
266 - CustomVarDamp::dump($e->getMessage()); 265 + //CustomVarDamp::dump($e->getMessage());
  266 + throw $e;
267 267
268 } 268 }
269 } 269 }
270 } 270 }
271 271
272 } 272 }
  273 +
  274 +
  275 +
  276 +
  277 + public function actionParse ()
  278 + {
  279 +// $comand = "/usr/bin/php -f ".Yii::getAlias('@console') ."/Controllers/ParserController.php";
  280 +// exec($comand);
  281 + if( $arr_id_files = Yii::$app->cache->get( 'files_to_parse' ) ) {
  282 + $arr_id_files = json_decode( $arr_id_files );
  283 + foreach ( $arr_id_files as $file_name ) {
  284 + $file_path = Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv';
  285 + $config = ['record_id' => $file_name,
  286 + 'importer_id' => ImportersFiles::findOne(['id' => $file_name])->id,
  287 + 'parser_config' => ['keys' => ['DESCR', 'ARTICLE', 'BRAND', 'PRICE', 'BOX'],
  288 + 'mode' => 'console']
  289 + ];
  290 + if( $this->parseFileConsole( $file_path, $config ) ){
  291 + unlink( $file_path );
  292 + if (isset( $arr_id_files[$file_path] ) ) {
  293 + unset($arr_id_files[$file_path]);
  294 + }
  295 + } else {
  296 + // Yii::$app->log->
  297 + // не дошли до конца по этому остаки вернем в кеш
  298 + Yii::$app->cache->set( 'files_to_parse',json_encode( $arr_id_files ) );
  299 + }
  300 + }
  301 + if ( !count( $arr_id_files ) ) {
  302 + Yii::$app->cache->delete( 'files_to_parse' );
  303 + }
  304 + }
  305 +
  306 + return $this->redirect('serverFiles');
  307 + }
  308 +
  309 + protected function parseFileConsole( $file_path, $configuration ){
  310 + $parser_config = [];
  311 + if ( isset( $configuration['parser_config'] ) ) {
  312 + $parser_config = $configuration['parser_config'];
  313 + }
  314 +
  315 + $data = Yii::$app->multiparser->parse( $file_path, $parser_config );
  316 + CustomVarDamp::dumpAndDie($data);
  317 + $writer = new PriceWriter();
  318 + $writer->configuration = $configuration;
  319 + $writer->data = $data;
  320 + $writer->mode = 1; //console-режим
  321 + if ( $writer->writeDataToDB() ){
  322 + //Console::output('It is working');
  323 + return true;
  324 + }
  325 +
  326 + return false;
  327 + }
273 } 328 }
backend/views/parser/server-files.php
1 <?php 1 <?php
2 use yii\helpers\Html; 2 use yii\helpers\Html;
  3 +use yii\helpers\Url;
3 use yii\grid\GridView; 4 use yii\grid\GridView;
4 use yii\grid\SerialColumn; 5 use yii\grid\SerialColumn;
5 use yii\grid\ActionColumn; 6 use yii\grid\ActionColumn;
@@ -44,7 +45,7 @@ Pjax::begin([&#39;id&#39; =&gt; &#39;server_files_grid&#39;]); @@ -44,7 +45,7 @@ Pjax::begin([&#39;id&#39; =&gt; &#39;server_files_grid&#39;]);
44 45
45 ]] );?> 46 ]] );?>
46 47
47 - 48 + <?= Html::a('Загрузить файлы', ['parse'],['class' => 'btn btn-success']) ?>
48 49
49 </div> 50 </div>
50 <?php 51 <?php
common/components/PriceWriter.php
@@ -24,7 +24,7 @@ class PriceWriter { @@ -24,7 +24,7 @@ class PriceWriter {
24 { 24 {
25 // 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles) 25 // 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles)
26 // id загруженного файла получим из конфигурации 26 // id загруженного файла получим из конфигурации
27 - $files_model = ImportersFiles::findOne( $this->configuration->record_id ); 27 + $files_model = ImportersFiles::findOne( $this->configuration['record_id'] );
28 28
29 //$files_model->load(['ImportersFiles' => $this->configuration->toArray()]); 29 //$files_model->load(['ImportersFiles' => $this->configuration->toArray()]);
30 $update_date = date('Y-m-d H:i:s'); 30 $update_date = date('Y-m-d H:i:s');
@@ -61,7 +61,7 @@ class PriceWriter { @@ -61,7 +61,7 @@ class PriceWriter {
61 } 61 }
62 else{ 62 else{
63 // дополним данные значением импортера и даты обновления цены 63 // дополним данные значением импортера и даты обновления цены
64 - $this->data = \Yii::$app->multiparser->addColumns($this->data, ['IMPORT_ID' => $this->configuration->importer_id, 'timestamp' => $update_date]); 64 + $this->data = \Yii::$app->multiparser->addColumns($this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date]);
65 65
66 try { 66 try {
67 //@todo add transaction 67 //@todo add transaction
console/controllers/ParserController.php
@@ -6,19 +6,59 @@ @@ -6,19 +6,59 @@
6 * Time: 14:38 6 * Time: 14:38
7 */ 7 */
8 use yii\console\Controller; 8 use yii\console\Controller;
  9 +use yii\helpers\Console;
  10 +use common\components\PriceWriter;
  11 +use backend\models\ImportersFiles;
9 12
10 class ParserController extends Controller{ 13 class ParserController extends Controller{
11 public function actionParseCSV () 14 public function actionParseCSV ()
12 { 15 {
13 - 16 + \common\components\CustomVarDamp::dumpAndDie(45);
  17 + if( $arr_id_files = Yii::$app->cache->get( 'files_to_parse' ) ) {
  18 + $arr_id_files = json_decode( $arr_id_files );
  19 + foreach ( $arr_id_files as $file_name ) {
  20 + $file_path = Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv';
  21 + $config = ['record_id' => $file_name,
  22 + 'importer_id' => ImportersFiles::findOne(['id' => $file_name])->id,
  23 + 'parser_config' => ['keys' => ['DESCR', 'ARTICLE', 'BRAND', 'PRICE', 'BOX']]
  24 + ];
  25 + if( $this->parseFileConsole( $file_path, $config ) ){
  26 + unlink( $file_path );
  27 + if (isset( $arr_id_files[$file_path] ) ) {
  28 + unset($arr_id_files[$file_path]);
  29 + }
  30 + } else {
  31 + // Yii::$app->log->
  32 + // не дошли до конца по этому остаки вернем в кеш
  33 + Yii::$app->cache->set( 'files_to_parse',json_encode( $arr_id_files ) );
  34 + }
  35 + }
  36 + if ( !count( $arr_id_files ) ) {
  37 + Yii::$app->cache->delete( 'files_to_parse' );
  38 + }
  39 + }
14 } 40 }
15 public function actionParseXML () 41 public function actionParseXML ()
16 { 42 {
17 43
18 } 44 }
19 - protected function parseFileConsole( $file_path ){ 45 + protected function parseFileConsole( $file_path, $configuration ){
  46 + $parser_config = [];
  47 + if ( isset( $configuration['parser_config'] ) ) {
  48 + $parser_config = $configuration['parser_config'];
  49 + }
  50 +
  51 + $data = Yii::$app->multiparser->parse( $file_path, $parser_config );
20 52
21 - $data = Yii::$app->multiparser->parse( $file_path ); 53 + $writer = new PriceWriter();
  54 + $writer->configuration = $configuration;
  55 + $writer->data = $data;
  56 + $writer->mode = 1; //console-режим
  57 + if ( $writer->writeDataToDB() ){
  58 + Console::output('It is working');
  59 + return true;
  60 + }
22 61
  62 + return false;
23 } 63 }
24 } 64 }
25 \ No newline at end of file 65 \ No newline at end of file