Kartik DetailView内联编辑失效,数据无法更新求助
解决Kartik DetailView内联编辑无法编辑及提交失败的问题
我帮你排查了代码里的问题,主要集中在视图字段配置冲突和控制器响应逻辑适配上,具体解决方案如下:
1. 视图配置的核心问题:误锁了编辑权限
你在几乎所有字段里都加了displayOnly => true,这个属性会强制字段仅展示,完全锁死编辑功能——哪怕你开启了enableEditMode也没用!另外mode => 'edit'已经是默认进入编辑模式,enableEditMode可以不用重复设置。
修正后的关键视图代码:
<?php echo DetailView::widget([ 'model' => $modelAnagrafiche, 'responsive' => true, // 用常量更规范,直接默认进入编辑模式 'mode' => DetailView::MODE_EDIT, 'buttons1' => '{update}', 'panel' => [ 'type' => 'primary', 'heading' => 'Contratto' . ' : ' . $modelAnagrafiche->cognome_ragione_sociale . ' ' . $modelAnagrafiche->nome ], 'attributes' => [ [ 'group'=>true, 'label'=>'Sezione Anagrafica', 'rowOptions'=>['class'=>'table-primary'] ], [ 'columns' => [ [ 'attribute' => 'cognome_ragione_sociale', // 要编辑就删掉这行,要只读就保留 // 'displayOnly' => true, 'valueColOptions' => ['style' => 'width:30%'] ], [ 'attribute' => 'nome', 'format' => 'raw', 'valueColOptions' => ['style' => 'width:30%'], // 必须移除displayOnly,否则无法激活编辑框 // 'displayOnly' => true, 'type' => DetailView::INPUT_TEXT, ], ], ], // 其他字段同理:把需要编辑的字段的displayOnly属性删掉 [ 'columns' => [ [ 'attribute' => 'codice_fiscale', // 'displayOnly' => true, 'valueColOptions' => ['style' => 'width:30%'] ], [ 'attribute' => 'partita_iva', 'format' => 'raw', 'valueColOptions' => ['style' => 'width:30%'], // 'displayOnly' => true ], ], ], // ... 剩下的属性配置都按这个逻辑调整 ], ]); ?>
2. 控制器Action适配AJAX提交
Kartik DetailView的内联编辑默认是AJAX异步提交,你的当前Action是直接跳转页面,可能和组件的预期不符,容易导致提交无响应。建议调整成支持AJAX的版本:
public function actionUpdateAnagrafica() { $post = Yii::$app->request->post(); if (empty($post['Anagrafiche']['id'])) { throw new NotFoundHttpException('Non esiste nessuna anagrafica.'); } $modelAnagrafiche = Anagrafiche::findOne($post['Anagrafiche']['id']); // 处理AJAX提交 if (Yii::$app->request->isAjax && $modelAnagrafiche->load($post) && $modelAnagrafiche->save()) { return Json::encode(['success' => true, 'message' => 'Dati aggiornati correttamente']); } // 处理普通请求 elseif ($modelAnagrafiche->load($post) && $modelAnagrafiche->save()) { return $this->redirect(['view', 'id' => $modelAnagrafiche->id]); } else { // AJAX请求失败返回错误信息 if(Yii::$app->request->isAjax){ return Json::encode(['success' => false, 'errors' => $modelAnagrafiche->errors]); } return $this->render('update-anagrafica', [ 'modelAnagrafiche' => $modelAnagrafiche, ]); } }
3. 最后还要检查这两项
- 确认你的
Anagrafiche模型里,需要编辑的字段都在rules()里配置了safe()或者具体验证规则,不然load($post)会加载失败,数据也保存不了。 - 检查页面是否加载了Kartik组件需要的JS/CSS资源(正常情况下组件会自动注册,但自定义布局可能会遗漏)。
内容的提问来源于stack exchange,提问作者Angelo De Giacomo
相关产品推荐
相关产品推荐

