如何用JavaScript获取CGridView表格td内输入框的文本值?
解决CGridView中获取输入框值的问题
看起来你遇到的核心问题是:CGridView默认的单元格内容获取逻辑针对的是渲染时的静态文本,但输入框是动态交互的DOM元素,直接取单元格自然拿不到输入后的动态值。下面分前端JS获取和后端提交获取两种场景给你解决方案:
一、前端JS获取选中行的输入框值
你设置了selectableRows => 2支持多选,默认的getSelectedRows()只能拿到行ID,需要自己遍历选中行,定位输入框元素提取value:
假设你的输入框列是这样定义的(给输入框加统一class方便定位):
array( 'header' => '自定义输入值', 'type' => 'raw', // 必须设为raw才能渲染HTML输入框 'value' => function($data) { // 给输入框加class="grid-input",同时设置合理的name属性(后端提交会用到) return CHtml::textField( "UpgradeRule[{$data->primaryKey}][custom_value]", $data->custom_value, array('class' => 'grid-input') ); }, ),
然后写JS代码获取选中行的输入值:
// 获取CGridView实例的选中行ID数组 var selectedRowIds = $('#oc-list-upgradeRule').yiiGridView('getSelectedRows'); var inputData = []; // 遍历每个选中行,提取输入框值 $.each(selectedRowIds, function(idx, rowId) { // 通过行ID定位到对应的tr,再找到里面的输入框 var inputVal = $('#oc-list-upgradeRule tr#row' + rowId + ' .grid-input').val(); inputData.push({ row_id: rowId, input_value: inputVal }); }); // 现在inputData里就存了所有选中行的输入值,可用于AJAX提交等后续操作 console.log(inputData);
二、后端表单提交获取输入值
如果是通过表单提交整个页面,关键是给输入框设置正确的name属性,让Yii能正确解析提交的数据。
比如上面代码里的name="UpgradeRule[{$data->primaryKey}][custom_value]",提交后控制器可以这样处理:
public function actionSaveUpgradeRules() { if(Yii::app()->request->isPostRequest) { // 获取所有输入框提交的数据 $postData = Yii::app()->request->getPost('UpgradeRule', []); foreach($postData as $ruleId => $data) { $inputValue = $data['custom_value']; // 找到对应的模型并更新 $model = UpgradeRule::model()->findByPk($ruleId); if($model) { $model->custom_value = $inputValue; $model->save(false); // 根据需求调整验证规则,false代表跳过验证 } } $this->redirect(['index']); // 跳转回列表页 } }
关键注意点
- 输入框列必须设置
type => 'raw',否则CGridView会把HTML转义成文本,输入框无法正常渲染。 - 前端定位输入框时,尽量用class或者明确的选择器,避免依赖DOM结构变化导致失效。
- 后端获取时,确保模型的属性和输入框name里的字段名对应,这样可以直接用模型赋值,不用手动处理数组。
内容的提问来源于stack exchange,提问作者Hoodini
相关产品推荐
相关产品推荐

