Yii2 Kartik EditableColumn Dropdown Relation возвращает неверное значение - PullRequest
0 голосов
/ 17 мая 2018

У меня проблема с Gridview с использованием kartik \ grid \ EditableColumn, после изменения значения мне возвращается неправильное значение для столбца при его обновлении. Мне возвращают выпадающий ключ / целую таблицу, а не строку, содержащуюся в связанной таблице.

У меня есть две таблицы

Leads - столбцы id и status_id

Связанные поля - модель, поле, related_value, related_value

Отношение основано на этом случае

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

У меня есть следующее отношение в моей модели

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

Я также создал следующее в качестве теста на основе эта ссылка

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

Вот код столбца

[
        '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'),
        ]
    ],

Закомментировано несколько строк в моих попытках исправить проблему, а также их комбинации, однако все они приводят к неправильному значению.

Если, например, я выберу соответствующее значение «New», которое имеет related_id 1, после обновления столбца я получу значение 1 вместо «New».

Когда таблица загружается / перезагружается впервые, значение отображается правильно.

Я мог бы перезагрузить сетку, но это кажется неправильным, просто чтобы исправить 1% данных, показанных на странице.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Если вы следуете руководству Kartik , он предложит добавить EditableColumnAction для лучшей обработки редактируемого столбца:

EditableColumnAction предлагает быстрый и простой способ настроить действие вашего контроллерадля обновления, сохранения и управления выводом EditableColumn из GridView.Этот класс действий расширяется от yii \ rest \ Action, и, следовательно, все свойства, доступные в yii \ rest \ Action, применимы здесь.Базовая настройка столбца включает в себя настройку действия контроллера и EditableColumn.

Таким образом, вам нужно добавить EditableColumnAction в вашем контроллере для обработки обновления модели:

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

В конфигурации редактируемого столбца GridView включите вышеуказанное действие контроллера для обработки Editable в editableOptions.Например,

А в коде столбца вам нужно добавить действие к свойству editableOptions:

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

Теперь, согласно руководству ,Вы можете добавить к своему действию свойство outputValue:

'outputValue' => function (Leads $model) {
    return $model->status->related_value;
}
0 голосов
/ 21 мая 2018

Если ваша модель использует открытую переменную $status_value

, создайте метод присваивающего значения

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

Теперь в Gridview используйте метод getStatusValue enter code here с присвоением значения, как показано ниже

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' => [

            ]
        ]
    ],
],  

];
...