我在使用kartik \ grid \ EditableColumn的Gridview时遇到问题,在更改值后,我在更新时返回了错误的列值。我返回下拉键/主表整数而不是链接表中包含的字符串。
我有两张桌子
潜在客户 - 列ID和status_id
相关字段 - model,field,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()]);
}
我还根据this link
创建了以下测试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'),
]
],
在我尝试解决问题及其组合时,注释掉了很多行,但都会导致错误的值。
例如,如果我选择具有related_id 1的相关值“New”,则在更新列之后,我得到值1而不是“New”。
首次加载/重新加载表时,值确实显示正确。
我可以重新加载网格,但仅仅修复页面上显示的1%数据似乎是错误的。
答案 0 :(得分:1)
我的模型采用公共变量module.exports = {
navigateFallback: '/index.html',
stripPrefix: 'dist/browser',
root: 'dist/browser',
staticFileGlobs: [
'dist/browser/index.html',
'dist/browser/**.js',
'dist/browser/**.css',
'dist/browser/**.ico',
'dist/browser/assets/images/**.jpg',
'dist/browser/assets/images/**.png',
'dist/browser/assets/images/**.gif',
'dist/browser/assets/js/**/**.js',
'dist/browser/assets/js/**.js',
'dist/browser/assets/css/**.css'
],
runtimeCaching: [{
urlPattern: /^https:\/\/tg\.s3\.rfyfg\.com\//,
handler: 'cacheFirst'
}]
};
创建一个赋值方法
$status_value
现在public function getStatusValue()(){
return $this->status_value= $this->status->related_value;
}
使用getStatusValue Gridview
方法,并按以下方式分配值
enter code here
答案 1 :(得分:0)
如果您关注Kartik guide,他建议您添加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可编辑列配置中,包含上述内容 用于处理editableOptions中的Editable的控制器操作。 例如
在您的列代码中,您需要将操作添加到editableOptions
属性:
'editableOptions' => [
...
'formOptions' => ['action' => ['/leads/edit-lead']]
]
现在,根据guide,您可以将outputValue
属性添加到您的操作中:
'outputValue' => function (Leads $model) {
return $model->status->related_value;
}