kartik-Select2上的Yii2动态表单更新失败

kartik-Select2上的Yii2动态表单更新失败,yii2,jquery-select2,dynamicform,kartik-v,Yii2,Jquery Select2,Dynamicform,Kartik V,我正在使用wbraganca动态表单小部件。对于创建操作,它工作得很好。 让我感谢那些在youtube上制作精彩教程视频的家伙 我现在正在进行更新操作。我在采购订单函数中使用它 'escapeMarkup' => new JsExpression('function (markup) { return markup; }'), 'templateResult' => new JsExpression('function(purchaseitem_inventory_id) { ret

我正在使用wbraganca动态表单小部件。对于创建操作,它工作得很好。 让我感谢那些在youtube上制作精彩教程视频的家伙

我现在正在进行更新操作。我在采购订单函数中使用它

'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
'templateResult' => new JsExpression('function(purchaseitem_inventory_id) { return purchaseitem_inventory_id.text; }'),
'templateSelection' => new JsExpression('function (purchaseitem_inventory_id) { return purchaseitem_inventory_id.text; }'),
更新操作的控制器:

public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $modelsItem = $model->purchaseitems;

    if ($model->load(Yii::$app->request->post()) ) {

        $oldIDs = ArrayHelper::map($modelsItem, 'purchaseitem_id', 'purchaseitem_id');
        $modelsItem = Model::createMultiple(Purchaseitem::classname(), $modelsItem);
        Model::loadMultiple($modelsItem, Yii::$app->request->post());
        $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsItem, 'purchaseitem_id', 'purchaseitem_id')));

        $valid = $model->validate();
        $valid = Model::validateMultiple($modelsItem) && $valid;

        if ($valid) {
            $transaction = \Yii::$app->db->beginTransaction();
            try {
                if ($flag = $model->save(false)) {
                    if (! empty($deletedIDs)) {
                        Purchaseitem::deleteAll(['purchaseitem_id' => $deletedIDs]);
                    }
                    foreach ($modelsItem as $modelItem) {
                        $modelItem->purchaseitem_purchaseorder_id = $model->purchaseorder_id;
                        $modelItem->purchaseitem_description = Inventory::findOne($modelItem->purchaseitem_inventory_id)->inventory_partno;

                        if (! ($flag = $modelItem->save(false))) {
                            $transaction->rollBack();
                            break;
                        }
                    }
                }
                if ($flag) {
                    $transaction->commit();
                    return $this->redirect(['view', 'id' => $model->purchaseorder_id]);
                }
            } catch (Exception $e) {
                $transaction->rollBack();
            }
        }

        //return $this->redirect(['view', 'id' => $model->purchaseorder_id]);
    } else {
        return $this->render('update', [
            'model' => $model,
            'modelsItem' => (empty($modelsItem)) ? [new Purchaseitem] : $modelsItem

        ]);
    }
}
但我认为问题可能发生在视图文件上,因为Select2字段可以显示值,即产品的“id”而不是产品代码

视图:

对于Select2查询URL方法,请参见:

public function actionInventorylist($q = null, $id = null) {
    Yii::$app->response->format = yii\web\Response::FORMAT_JSON;
    $out = ['results' => ['id' => '', 'text' => '']];
    if (!is_null($q)) {
        $query = new Query;
        $query->select('inventory_id AS id, inventory_partno AS text')
            ->from('inventory')
            ->where(['like', 'inventory_partno', $q])
            ->limit(10);
        $command = $query->createCommand();
        $data = $command->queryAll();
        $out['results'] = array_values($data);
    }
    elseif ($id > 0) {
        $out['results'] = ['id' => $id, 'text' => Inventory::find($id)->inventory_partno];
    }
    return $out;
}
我可以在更新视图中单击时加载记录。除“partno”字段外,大多数数据都在表单的正确位置提供。我使用Select2让用户通过文本选择partno,并将“id”存储在表中。它适用于创建视图。 但是在更新视图中,它只显示“id”而不是“partno”

如果我对字段进行输入,我只能选择“其他”零件否,让我在这里解释:

如果有2个代码,“ABC”和“id”是1,“XYZ”和“id”是2

原始记录为“ABC”,字段显示为“1”。 如果我输入“XYZ”,它将显示“XYZ”作为小部件的正常效果。但是,如果我改回“ABC”,它将显示“1”而不是“ABC”

并且表单也不能提交更新。该按钮单击不起作用

我对Yii2框架还不熟悉,并且非常关注这个问题,有人知道我如何解决这个问题吗?
谢谢

我只是解决了问题,实际上发生了一些问题

为了解决Select2小部件无法显示零件号而不是ID的问题,我通过ID找到零件号,并在Select2中为其提供
initValueText
。就我而言:

$partno = empty($modelItem->purchaseitem_inventory_id) ? '':Inventory::findOne($modelItem->purchaseitem_inventory_id)->inventory_partno;
$form->field($modelItem, "[{$i}]purchaseitem_inventory_id")->widget(Select2::classname(), ['initValueText' => $partno, ...
关于更新失败后的问题,我得到了错误的
获取未知属性:backend\models\Purchaseitem::id
,我发现它发生在动态表单小部件
Model.php
第25行。这行代码是
$keys=array_-keys(ArrayHelper::map($multipleModels,'id','id'))

如果我将
'id'
更改为我的id字段名,即
'purchaseitem\u id'
,它将起作用,但此模型仅适用于此id字段名。因此,我得到了模型的primaryKey,并使其适用于我的另一个模型

添加此行
$primaryKey=$model->tableSchema->primaryKey并修改上面的行
$keys=array_keys(ArrayHelper::map($multipleModels,$primaryKey,$primaryKey))

$partno = empty($modelItem->purchaseitem_inventory_id) ? '':Inventory::findOne($modelItem->purchaseitem_inventory_id)->inventory_partno;
$form->field($modelItem, "[{$i}]purchaseitem_inventory_id")->widget(Select2::classname(), ['initValueText' => $partno, ...