The Humble Rat
The Humble Rat

Reputation: 4696

Yii2 Kartik EditableColumn Dropdown Relation Returns wrong Value

I have an issue with a Gridview using kartik\grid\EditableColumn, after changing the value I am returned the wrong value for the column when it updates. I am returned the dropdown key/main table integer rather than the string contained in a linked table.

I have two tables

Leads - columns id and status_id

Related fields - model, field, related_value, related_value

The relation is based on in this case

model:"Leads",
field:"status_id",
related_id:status_id

I have the following relation in my model

public function getStatus()
{
    return $this->hasOne(RelatedFields::className(), ["related_id" => "status_id"])->andOnCondition(["status.field" => "status_id", "status.model"=>"Leads"])->from(["status" => RelatedFields::tableName()]);
}

I also created the following as a test based on this link

public function getStatusValue()
{
    return $this->status->related_value;
}

Here is the column code

[
        'class' => 'kartik\grid\EditableColumn',
        'attribute' => 'status_id',
        'value'=>'status.related_value',
        //'value' => function($model){ return $model->status->related_value; },
        //'value' => function($model){ return $model->StatusValue; },
        //'refreshGrid' => true,//Works but not nice
        'vAlign'=>'middle',
        'hAlign'=>'center',
        'pageSummary' => true,
        'readonly' => false,
        'width'=>'10%',
        'filter'=>Html::activeDropDownList($searchModel, 'status', ArrayHelper::map(RelatedFields::Find()->where(['model' =>"Leads","field"=>"status_id"])->all(), 'related_id', 'related_value'),['class' => 'form-control','prompt' => Yii::t('app', '')]),
        'editableOptions'=> [
            //'attribute'=>'status_id',
            //'value'=>'status.related_value',
          //'header' => 'profile',
          //'format' => Editable::FORMAT_BUTTON,
          'inputType' => Editable::INPUT_DROPDOWN_LIST,
          'data'=> ArrayHelper::map(RelatedFields::Find()->where(['model' =>"Leads","field"=>"status_id"])->all(), 'related_id', 'related_value'),
        ]
    ],

Commented out are a number of lines in my attempts to fix the issue as well as combinations of them, however all result in the wrong value.

If for example I select the related value "New" which has a related_id 1, after the column has been updated I get the value 1 instead of "New".

When the table is first loaded/reloaded the value does show correctly.

I could reload the grid, but this seems wrong just to fix 1% of the data shown on the page.

Upvotes: 3

Views: 1844

Answers (2)

Ziki
Ziki

Reputation: 1440

If you follow Kartik guide, he suggest to add EditableColumnAction to better handle the editable column:

The EditableColumnAction offers a quick easy way to setup your controller action for updating, saving and managing the EditableColumn output from GridView. This action class extends from yii\rest\Action and hence all properties available with yii\rest\Action are applicable here. The basic setup of the column involves setting up the controller action and the EditableColumn.

So you need to add an EditableColumnAction in your controller to handle the update of the model:

public function actions()
{
    return ArrayHelper::merge(parent::actions(), [
        'edit-lead' => [
            'class' => EditableColumnAction::class,
            'modelClass' => Leads::class
        ]
    ]);
}

In your GridView editable column configuration, include the above controller action for processing the Editable within editableOptions. For example

And in your column code you need to add the action to editableOptions property:

'editableOptions' => [
    ...
    'formOptions' => ['action' => ['/leads/edit-lead']]
]

Now, according to the guide, you can add to your action the outputValue property:

'outputValue' => function (Leads $model) {
    return $model->status->related_value;
}

Upvotes: 1

Amitesh Kumar
Amitesh Kumar

Reputation: 3079

I your model take a public variable $status_value

create an assigning value method

public function getStatusValue()(){
    return $this->status_value= $this->status->related_value;
}

Now in Gridview use getStatusValueenter code heremethod with assigning value as below

use yii\helpers\Url;
   $gridColumns = [
   [
   'class' => 'kartik\grid\EditableColumn',
   'attribute' => 'status_value',
   'pageSummary' => true,
   'readonly' => false,
   'value' => function($model){ return $model->statusValue; }, // assign value from getStatusValue method
   'editableOptions' => [
        'header' => 'status_value',
        'inputType' => kartik\editable\Editable::INPUT_TEXT,
        'options' => [
            'pluginOptions' => [

            ]
        ]
    ],
],  

];

Upvotes: 2

Related Questions