Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Сохранение данных при комбинации TabularInput + MultipleInput #316

Open
Oughtem opened this issue Oct 26, 2019 · 2 comments
Milestone

Comments

@Oughtem
Copy link

Oughtem commented Oct 26, 2019

моя задача сделать табличное редактирование параметров товаров. Параметры находятся в связанной таблице и с помощью функции заполняют свойство params объекта Product вот таким образом:

common\models\Product Object
        (
            [imagesFiles] => Array
                (
                )

            [params] => Array
                (
                    [0] => Array
                        (
                            [key] =>33333333
                            [value] => 33
                        )

                    [1] => Array
                        (
                            [key] => 444444444
                            [value] => 44
                        )

                    [2] => Array
                        (
                            [key] => 55555555
                            [value] => 55
                        )

                )

            [landings] => Array
                (
                )

            [_attributes:yii\db\BaseActiveRecord:private] => Array
                (
                    [id] => 128165
                    [user_id] => 442
                    [name] => 1051AC-12 Карандаши пластик. "Butterfly" 12 цв., в картоне, европ. J. Otten
                    [category_id] => 340
                    [alias] => 1051ac-12-karandasi-plastik-butterfly-12-cv-v-kartone-evrop-j-otten
                    [status] => 1
                    [description] => уп.-12;ящ.-240;
                    [meta_title] => 
                    [meta_keywords] => 
                    [meta_description] => 
                    [h1] => 
                    [available] => 0
                    [keywords] => 
                    [price] => 0.33
                    [old_price] => 0
                    [hasImage] => 0
                    [image] => 
                    [vendor] => Josef Otten
                    [vendorCode] => 1051AC-12
                    [barCode] => 736159
                    [country_of_origin] => 
                    [created_at] => 1550780796
                    [updated_at] => 1571912976
                    [cart_count] => 1
                    [min_quantity] => 12
                    [step_quantity] => 12
                    [picture_available] => 0
                    [visible] => 0
                    [provider_product_id] => 
                )
.......

я в экшен "edit-params" предаю массив таких объектов и связкой TabularInput и MultipleInput получаю этот массив в таком виде скриншот. Пока всё хорошо.

Вопрос возникает при сохранении. Если не изменять параметров и сохраниться с таким набором параметров, который показан на скриншоте, то получаю такой вот массив POST, в котором не правильно формируется блок params

Array
(
    [_csrf-backend] => m-EPJlfRfr4P7h23DSadgxqz7fvjw6fbIN2h1Hz7597Zhmx0ZZ8H7WOdUG0-fvDXKcKLjtKt7LZNrviQGaqRjw==
    [Product] => Array
        (
            [128165] => Array
                (
                    [id] => 128165
                    [name] => 1051AC-12 Карандаши пластик. "Butterfly" 12 цв., в картоне, европ. J. Otten
                )

            [params] => Array
                (
                    [0] => Array
                        (
                            [key] => 11111111
                            [value] => 11
                        )

                    [1] => Array
                        (
                            [key] => 22222222
                            [value] => 22
                        )

                )

            [157653] => Array
                (
                    [id] => 157653
                    [name] => Календарь отрывной "Зцілюючі сили" на украинском языке
                )

        )

)

а именно:

  1. пары "ключ-значение" от второго товара передались первому товару,
  2. второму товару ничего не передалось.

В ходе экспериментов выяснилось, что всегда передаётся массив params от последнего в списке товара первому в списке товару, а все остальные товары остаются без массива params. При этом id и name передаются правильно. Сохранение params в контроллере ещё не описано, но по массиву POST очевидно, что данные для сохранения сформированы не правильно

Вот код в контроллере:

public function actionEditParams()
    {
        $ids = Yii::$app->request->get('id');
        $arr = explode(',', $ids);
        
        $post = Yii::$app->request->post('Product');
        
        $dataProvider = new ActiveDataProvider([
            'query' => Product::find()->where(['id' => $arr])->indexBy('id'),
        ]);
        
        $models = $dataProvider->getModels();

        foreach ($models as $model){
            $params = ProductsParams::find()->select([Params::tableName().'.name',Params::tableName().'.value'])
                ->leftJoin(Params::tableName(),ProductsParams::tableName().'.param_id = '.Params::tableName().'.id')
                ->where([ProductsParams::tableName().'.product_id' => $model->id])->asArray()->all();

            if(!empty($params)){
                foreach ($params as $index=>$param){
                    $model->params[$index]['key'] = $param['name'];
                    $model->params[$index]['value'] = $param['value'];
                }
            }
        }
        
//        if (Model::loadMultiple($models, Yii::$app->request->post()) && Model::validateMultiple($models)) {
//            $count = 0;
//            foreach ($models as $index => $model) {
//                // populate and save records for each model
//                if ($model->save()) {
//                    $count++;
//                }
//            }
//            Yii::$app->session->setFlash('success', "Processed {$count} records successfully.");
//            return $this->redirect(Yii::$app->request->referrer);
//        } 

        return $this->render('edit-params', ['post' => $post, 'models' => $models]);
        
    }

вот код вьюхи

<?php
use yii\bootstrap\ActiveForm;
use yii\helpers\Html;
use yii\helpers\ArrayHelper;

use unclead\multipleinput\MultipleInput;
use unclead\multipleinput\TabularInput;

//https://github.com/unclead/yii2-multiple-input/wiki/

echo '<pre>';
print_r($_POST);
echo '</pre>';

$form = ActiveForm::begin();

echo TabularInput::widget([
    'models' => $models,
    'attributeOptions' => [
        'enableAjaxValidation'      => false,
        'enableClientValidation'    => true,
        'validateOnChange'          => true,
        'validateOnSubmit'          => true,
        'validateOnBlur'            => true,
    ],
    'columns' => [
        [
            'name'  => 'id',
        ],
        [
            'name'  => 'name',
        ],
        [
            'name' => 'params',
            'type' => MultipleInput::className(),
            'options' => [
                'enableError' => true,
                'sortable' => true,
                'cloneButton' => true,
                'columns' => [
                    [
                        'title' => 'Название параметра',
                        'name'  => 'key',
                    ],
                    [
                        'title' => 'Значение',
                        'name'  => 'value',
                    ],
                ],
            ],
        ],
    ],
]);
echo Html::submitButton('Update', ['class' => 'btn btn-success']);
ActiveForm::end();
?>

Соответственно я не понимаю куда копать: если массив params распознался виджетом MultipleInput и корректно отображается, значит модель и настройки 'columns' переданы верно. Это означает, что либо я не использую какие-то нужные в данном случае настройки виджетов либо в такой связке виджетов есть косяк. Помогите, пожалуйста, разобраться.

@unclead
Copy link
Owner

unclead commented Mar 6, 2020

@Oughtem удалось разобраться или просто забил?

@badtiger
Copy link

badtiger commented Jan 6, 2021

@unclead Мне бы помогло решение если есть

@unclead unclead added this to the 3.0 milestone Jun 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants