我有一个带有CCheckBoxColumn的CGridView wigdet,如下所示:
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
'columns'=>array(
array(
'class'=>'CCheckBoxColumn',
),
'title',
....
),
));
问题:如何向控制器操作提交已检查的值?我知道我需要一个表单,提交按钮,但我需要清楚地解释放置内容的位置,以便顶部的搜索框出现。
提前致谢。
答案 0 :(得分:4)
你并不一定需要另一种形式。您可以使用附加了附加javascript的链接。
要获取选中的值,您可以调用javascript函数$.fn.yiiGridView.getChecked(containerID,columnID)
,查看here,它会返回包含ID的数组。
在您看来:
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'example-grid-view-id', // the containerID for getChecked
'dataProvider'=>$dataProvider,
'columns'=>array(
array(
'class'=>'CCheckBoxColumn',
'id'=>'example-check-boxes' // the columnID for getChecked
),
'title',
....
),
));
?>
<div id="for-link">
<?php
echo CHtml::ajaxLink('SomeLink',Yii::app->createUrl('somecontroller/someaction'),
array(
'type'=>'POST',
'data'=>'js:{theIds : $.fn.yiiGridView.getChecked("example-grid-view-id","example-check-boxes").toString()}'
// pay special attention to how the data is passed here
)
);
?>
<div>
在您的控制器中:
...
public function actionSomeaction(){
if(isset($_POST['theIds'])){
$arra=explode(',', $_POST['theIds']);
// now do something with the ids in $arra
...
}
...
}
...
您还可以在我们通过ajax(从视图)传递的数据中使用json字符串而不是简单字符串,但是然后使用explode()
而不是json_decode()
(在控制器中) )。此外,最好在使用前验证/消毒ids。
查看CHtml::ajaxLink的文档,了解有关ajax链接的更多信息。
请注意,该示例有点粗糙,因为我没有检查空数组的已检查ID。
答案 1 :(得分:1)
这个可以使用CSRF保护并更新GridView。
<?php
echo CHtml::ajaxLink('ClickMe',Yii::app()->createUrl('controller/action'),
array(
'type'=>'POST',
'data'=>'js:{"ids" : $.fn.yiiGridView.getChecked("grid_view_id","check_box_id").toString(),"YII_CSRF_TOKEN" : "'.Yii::app()->request->csrfToken.'"}',
'success'=>"$('#grid_view_id').yiiGridView.update('grid_view_id')"
));
?>
答案 2 :(得分:0)
如果您将Gridview包装成一个简单的表单,您可以将选中的复选框发送到值
一个例子:
查看强>
<form id="frmSubmit">
<?php
echo CHtml::dropDownList('user_id'
, null
, CHtml::listData(User::model()->findAll(), 'USER_ID', 'FULLNAME')
);
echo CHtml::ajaxSubmitButton('Save'
, Yii::app()->createUrl('query/ajaxUpdate')
, array('success' => 'js:reloadGrid', )
, array('class' => 'btn btn-success'));
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'query-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
array(
'id' => 'query',
'class'=>'CCheckBoxColumn',
'selectableRows' => '2',
),
'Contact',
'Email',
'Company',
),
)); ?>
</form>
<script type="text/javascript">
function reloadGrid(data) {
$.fn.yiiGridView.update('query-grid');
}
</script>
<强>控制器强>
public function actionAjaxUpdate()
{
var_dump($_POST);
}