Commit 474f35bfc3b965c60c2a0405554cc63b5b4895d8

Authored by Mihail
1 parent e774f057

add DynamicFormHelper, and finish with result form (dynamic)

backend/components/parsers/CustomCsvParser.php
... ... @@ -11,9 +11,9 @@ namespace backend\components\parsers;
11 11  
12 12 class CustomCsvParser extends \yii\multiparser\CsvParser {
13 13  
14   - public $last_line = 10;
15   - public $hasHeaderRow = true;
16   - public $keys = ['first','second', 'third', 'forth', 'fifth'];
  14 + //public $last_line = 10;
  15 + //public $hasHeaderRow = true;
  16 + // public $keys = ['first','second', 'third', 'forth', 'fifth'];
17 17  
18 18  
19 19 protected function readRow()
... ...
backend/components/parsers/CustomParserConfigurator.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace backend\components\parsers;
  4 +use yii\multiparser\ParserConfigurator;
  5 +
  6 +class CustomParserConfigurator extends ParserConfigurator
  7 +{
  8 +
  9 + protected static $configuration = [
  10 + 'csv' =>
  11 + ['web' =>
  12 + ['class' => 'backend\components\parsers\CustomCsvParser',
  13 + 'auto_detect_first_line' => true,]]];
  14 +
  15 +
  16 +
  17 + public static $basic_column = [
  18 + "BRAND" => 'Бренд',
  19 + "ARTICLE"=> 'Артикул',
  20 + "PRICE" => 'Цена',
  21 + "DESCR" => 'Наименование',
  22 + "BOX" => 'Колво',
  23 + "ADD_BOX"=> 'В пути',
  24 + "GROUP" => 'Группа RG'
  25 + ];
  26 +
  27 +
  28 +}
0 29 \ No newline at end of file
... ...
backend/components/parsers/DynamicFormHelper.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: Cibermag
  5 + * Date: 08.09.2015
  6 + * Time: 14:50
  7 + */
  8 +
  9 +namespace backend\components\parsers;
  10 +
  11 +use yii\base\DynamicModel;
  12 +use yii\grid\GridView;
  13 +use yii\grid\SerialColumn;
  14 +
  15 +/**
  16 + * Class DynamicFormHelper
  17 + * @package backend\components\parsers
  18 + * Содержит процедуры генерации компонентов с динамическим количеством аттрибутов
  19 + */
  20 +class DynamicFormHelper
  21 +{
  22 +
  23 +
  24 + /**
  25 + * @param $source - int or array
  26 + * если передан массив, то создается модель с атрибутами переданными в массиве,
  27 + * ключ - имя, значение - значение аттрибута
  28 + * если передано число, то создается переданное количество аттрибутов с именами - attr_0, attr_1...
  29 + */
  30 + public static function CreateDynamicModel($source)
  31 + {
  32 + $arr_keys = [];
  33 + if (is_array($source)) {
  34 + $arr_keys = $source;
  35 + } elseif (is_int($source)) {
  36 +
  37 + $i = 0;
  38 + while ($source > $i) {
  39 + $arr_keys[] = "attr_{$i}";
  40 + $i++;
  41 + }
  42 + array_flip($arr_keys);
  43 +
  44 + }
  45 +
  46 + $model = new DynamicModel($arr_keys);
  47 +
  48 + return $model;
  49 + }
  50 +
  51 + // @todo - rewrite on two functions, add comments
  52 + public static function CreateDynamicGridViewWithDropDownListHeader( $dataProvider, $form, $header_model, $arr_header_values )
  53 + {
  54 + $columns_config = [['class' => SerialColumn::className()]];
  55 + $i = 0;
  56 + foreach( $header_model as $key => $value ) {
  57 +
  58 + $columns_config[] = ['header' => $form->field($header_model, $key, ['inputOptions' => ['label' => '']])->dropDownList($arr_header_values), 'attribute' => $i];
  59 + $i++;
  60 + }
  61 +
  62 + //\common\components\CustomVarDamp::dumpAndDie($columns_config);
  63 +
  64 + $dynamic_grid_view = GridView::widget( ['dataProvider' => $dataProvider,
  65 + 'columns' => $columns_config ] );
  66 +
  67 + return $dynamic_grid_view;
  68 +
  69 + }
  70 +
  71 +
  72 +
  73 +}
0 74 \ No newline at end of file
... ...
backend/components/widgets/InputHeaderDataColumn.php deleted
1   -<?php
2   -/**
3   - * Created by PhpStorm.
4   - * User: Cibermag
5   - * Date: 07.09.2015
6   - * Time: 18:04
7   - */
8   -use yii\grid\DataColumn ;
9   -class InputHeaderDataColumn extends DataColumn {
10   -
11   - protected function renderHeaderCellContent(){
12   -
13   - }
14   -}
15 0 \ No newline at end of file
backend/controllers/ParserController.php
... ... @@ -8,6 +8,8 @@ use yii\filters\VerbFilter;
8 8 use backend\models\UploadFileParsingForm;
9 9 use yii\web\UploadedFile;
10 10 use yii\data\ArrayDataProvider;
  11 +use backend\components\parsers\DynamicFormHelper;
  12 +use backend\components\parsers\CustomParserConfigurator;
11 13  
12 14 use common\components\CustomVarDamp;
13 15  
... ... @@ -67,60 +69,60 @@ class ParserController extends BaseController
67 69 public function actionResults(){
68 70  
69 71 $model = new UploadFileParsingForm();
70   -
  72 + $data = [];
71 73 if ($model->load(Yii::$app->request->post())) {
72 74 $model->file = UploadedFile::getInstance($model, 'file');
73 75  
74 76 if ($model->validate()) {
75   - //CustomVarDamp::dumpAndDie(Yii::$app->request->post());
76 77 $filePath = Yii::getAlias('@webroot') . '/uploads/' . $model->file->baseName . '.' . $model->file->extension;
77 78  
78 79 $model->file->saveAs( $filePath );
79 80 $data = $model->readFile($filePath);
80 81  
81   - Yii::$app->getCache()->set( 'parser_data', json_encode($data), 200 );
  82 + Yii::$app->getCache()->set( 'parser_data', json_encode($data) );
82 83  
83   - $provider = new ArrayDataProvider([
84   - 'allModels' => $data,
85   - 'pagination' => [
86   - 'pageSize' => 10,
87   - ],
88   -// 'sort' => [
89   -// 'attributes' => ['id', 'name'],
90   -// ],
91   - ]);
92   -
93   - return $this->render('results',
94   - ['model' => $data,
95   - 'imp' => $model,
96   - 'dataProvider' => $provider]);
97 84 }
98 85  
99 86 } else if( Yii::$app->getCache()->get( 'parser_data' )) {
100 87  
101   - $data = json_decode(Yii::$app->getCache()->get( 'parser_data' ),true);
  88 + $data = json_decode( Yii::$app->getCache()->get( 'parser_data' ),true );
102 89  
103   - $provider = new ArrayDataProvider([
104   - 'allModels' => $data,
105   - 'pagination' => [
106   - 'pageSize' => 10,
107   - ],
108   -// 'sort' => [
109   -// 'attributes' => ['id', 'name'],
110   -// ],
111   - ]);
112   -
113   - return $this->render('results',
114   - ['model' => $data,
115   - 'imp' => $model,
116   - 'dataProvider' => $provider]);
117 90 }
118 91  
119   - return $this->render('index', ['model' => $model]);
  92 + $provider = new ArrayDataProvider([
  93 + 'allModels' => $data,
  94 + 'pagination' => [
  95 + 'pageSize' => 10,
  96 + ],
  97 + ]);
  98 +
  99 + $header_model = DynamicFormHelper::CreateDynamicModel( count( $data[0] ) );
  100 +
  101 + //CustomVarDamp::dumpAndDie($header_model);
  102 + return $this->render('results',
  103 + ['model' => $data,
  104 + 'header_model' => $header_model,
  105 + 'basic_column' => CustomParserConfigurator::$basic_column,
  106 + 'dataProvider' => $provider]);
120 107 }
  108 +
121 109 public function actionWrite()
122 110 {
123   - CustomVarDamp::dumpAndDie(Yii::$app->request->post());
  111 + //CustomVarDamp::dumpAndDie(Yii::$app->request->post());
  112 +
  113 + $arr_attributes = Yii::$app->request->post()['DynamicModel'];
  114 + $model = DynamicFormHelper::CreateDynamicModel( $arr_attributes );
  115 + foreach ($arr_attributes as $key => $value) {
  116 + $model->addRule($key, 'in', ['range' => array_keys( CustomParserConfigurator::$basic_column )]);
  117 + }
  118 +
  119 + //CustomVarDamp::dumpAndDie($model);
  120 + if ($model->validate()) {
  121 + $arr = $model->toArray();
  122 + CustomVarDamp::dumpAndDie($arr);
  123 + }
  124 +
  125 +
124 126  
125 127 }
126 128  
... ...
backend/models/UploadFileParsingForm.php
... ... @@ -3,9 +3,8 @@ namespace backend\models;
3 3  
4 4 use yii\base\Model;
5 5 use yii\web\UploadedFile;
6   -use yii\multiparser\ParserHandler;
7 6 use Yii;
8   -use common\components\debug\CustomVarDamp;
  7 +use common\components\CustomVarDamp;
9 8  
10 9 /**
11 10 * UploadForm is the model behind the upload form.
... ... @@ -21,7 +20,6 @@ class UploadFileParsingForm extends Model
21 20 public $delimiter;
22 21 public $delete_price;
23 22 public $delete_prefix;
24   - public $first;
25 23  
26 24 /**
27 25 * @return array the validation rules.
... ... @@ -37,8 +35,7 @@ class UploadFileParsingForm extends Model
37 35 ['importer', 'integer','max' => 999999, 'min' => 0 ],
38 36 [['action','delete_prefix', 'delete_price'], 'boolean'],
39 37 ['delimiter', 'string', 'max' => 1],
40   - ['delimiter', 'default', 'value' => ';'],
41   - ['first', 'safe']
  38 + ['delimiter', 'default', 'value' => ';']
42 39  
43 40 ];
44 41 }
... ...
backend/views/parser/results.php
1 1 <?php
2 2  
3 3 use yii\helpers\Html;
4   -use yii\grid\GridView;
5   -use yii\grid\SerialColumn;
  4 +use backend\components\parsers\DynamicFormHelper;
6 5 use yii\widgets\ActiveForm;
7 6  
  7 +
8 8 /* @var $this yii\web\View */
9 9 /* @var $searchModel backend\models\CatalogSearch */
10 10 /* @var $dataProvider yii\data\ActiveDataProvider */
... ... @@ -20,16 +20,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
20 20  
21 21 $form = ActiveForm::begin(['action' => 'write']);
22 22 ?>
23   - <?= GridView::widget([
24   - 'dataProvider' => $dataProvider,
25   - 'columns' => [['class' => SerialColumn::className()],
26   - ['header' => $form->field($imp, 'first')->dropDownList(['1'=>'001', '2'=>'002']),
27   - 'attribute' => 'first' ],
28   - 'second',
29   - '3',
30   - '4',
31   - '5',]
32   - ]); ?>
  23 + <?= DynamicFormHelper::CreateDynamicGridViewWithDropDownListHeader( $dataProvider, $form, $header_model, $basic_column )?>
33 24  
34 25 <div class="form-group">
35 26 <?= Html::submitButton(Yii::t('app', 'Записать в БД'), ['class' => 'btn btn-primary']) ?>
... ...
vendor/yiisoft/multiparser/CsvParser.php
... ... @@ -5,6 +5,10 @@
5 5 namespace yii\multiparser;
6 6  
7 7  
  8 +/**
  9 + * Class CsvParser
  10 + * @package yii\multiparser
  11 + */
8 12 class CsvParser implements ParserInterface
9 13 {
10 14  
... ... @@ -42,6 +46,7 @@ class CsvParser implements ParserInterface
42 46 public $min_column_quantity = 5;
43 47  
44 48  
  49 +
45 50 /**
46 51 метод устанвливает нужные настройки объекта SplFileObject, для работы с csv
47 52 */
... ... @@ -129,6 +134,7 @@ class CsvParser implements ParserInterface
129 134 }
130 135  
131 136  
  137 +
132 138 protected function closeHandler()
133 139 {
134 140 $this->file = NULL;
... ...
vendor/yiisoft/multiparser/ParserConfigurator.php
... ... @@ -4,7 +4,7 @@ namespace yii\multiparser;
4 4 class ParserConfigurator
5 5 {
6 6  
7   - private static $configuration = [
  7 + protected static $configuration = [
8 8 'csv' =>
9 9 ['web' =>
10 10 ['class' => 'backend\components\parsers\CustomCsvParser',
... ...