Сохранение данных при комбинации TabularInput + MultipleInput
Добавлено: 2019.10.26, 21:00
моя задача сделать табличное редактирование параметров товаров. Параметры находятся в связанной таблице и с помощью функции заполняют свойство params объекта Product вот таким образом:
я в экшен "edit-params" предаю массив таких объектов и связкой TabularInput и MultipleInput получаю этот массив в таком виде http://joxi.ru/D2P5LDOTqL1eLA. Пока всё хорошо.
Вопрос возникает при сохранении. Если не изменять параметров и сохраниться с таким набором параметров, который показан на http://joxi.ru/D2P5LDOTqL1eLA, то получаю такой вот массив POST, в котором не правильно формируется блок `params`
а именно:
1. пары "ключ-значение" от второго товара передались первому товару,
2. второму товару ничего не передалось.
В ходе экспериментов выяснилось, что всегда передаётся массив `params` от последнего в списке товара первому в списке товару, а все остальные товары остаются без массива `params`. При этом `id` и `name` передаются правильно. Сохранение `params` в контроллере ещё не описано, но по массиву POST очевидно, что данные для сохранения сформированы не правильно
Вот код в контроллере:
вот код вьюхи
Соответственно я не понимаю куда копать: если массив `params` распознался виджетом MultipleInput и корректно отображается, значит модель и настройки 'columns' переданы верно. Это означает, что либо я не использую какие-то нужные в данном случае настройки виджетов либо в такой связке виджетов есть косяк. Помогите, пожалуйста, разобраться.
Код: Выделить всё
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] =>
)
.......
Вопрос возникает при сохранении. Если не изменять параметров и сохраниться с таким набором параметров, который показан на http://joxi.ru/D2P5LDOTqL1eLA, то получаю такой вот массив 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();
?>