Обновите две ячейки в одной строке в Gridview, используя EditableColumn - PullRequest
0 голосов
/ 02 июля 2019

У меня есть редактируемый GridView в моем приложении Yii2 и использующий kartik EditableColumn. Когда был только один редактируемый столбец, все работает нормально, но когда я попытался добавить еще один редактируемый столбец, он сохраняет отредактированное значение столбца Цена и устанавливает в ноль значение столбца expire_days . То же самое для противоположного способа (если обновление expire_days сохраняет значение, но устанавливает в ноль значение Price ).

Вид:

'columns' => [
    [
        'class'=>'kartik\grid\EditableColumn',
        'attribute' => 'price',
        'editableOptions'=>[
            'header'=>' ',                         
            'inputType'=>\kartik\editable\Editable::INPUT_SPIN,
            'options'=>['pluginOptions'=>['min'=>0, 'max'=>5000000]]
        ],
        'value' => function ($model) {
            return $model->price;
         },
        'filter' => Category::getPrices(),
        'format' => 'raw'
    ],


    [
        'class'=>'kartik\grid\EditableColumn',
        'attribute' => 'expire_days',
        'editableOptions'=>[
            'header'=>' ',
            'inputType'=>\kartik\editable\Editable::INPUT_SPIN,
            'options'=>['pluginOptions'=>['min'=>0, 'max'=>100]]
         ],
        'value' => function ($model) {
            return $model->expire_days;
         },
        'filter' => Category::getExpDays(),
        'format' => 'raw'
    ],                                         
]

Контроллер:

if (Yii::$app->request->post('hasEditable')) {
    $model = new Category();
    $id = Yii::$app->request->post('editableKey');
    $model = Category::findOne($id);
    $out = Json::encode(['output'=>'', 'message'=>'']);

    $post = [];
    $posted = current($_POST['Category']);
    $post['Category'] = $posted;

    if ($model->load($post)) {
        $model->price = $post['Category']['price'];
        $model->expire_days = $post['Category']['expire_days'];
        $model->save();
        $output = '';
        $out = Json::encode(['output'=>$output,'message'=>'']);
    }

    echo $out;
    return;
}

1 Ответ

0 голосов
/ 02 июля 2019

Вам следует отдельно обработать два сценария:

if ($model->load($post)) {
    if ($post['Category'] && $post['Category']['price']) {
        $model->price = $post['Category']['price'];
    }

    if ($post['Category'] && $post['Category']['expire_days']) {
        $model->expire_days = $post['Category']['expire_days'];
    }
    $model->save();
    $output = '';
    $out = Json::encode(['output'=>$output,'message'=>'']);
}

Если вы получаете цену - вы обновляете только цену.Если вы получаете expire_days - обновите expire_days.

...