Yii2 Kartik EditableColumn下拉关系返回错误的值

时间:2018-05-17 19:33:47

标签: php yii2 kartik-v

我在使用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%数据似乎是错误的。

2 个答案:

答案 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;
}