我有一个带有CCheckBoxColumn和selectableRows = 2的CGridView。用户可以选择我的网格视图的多行。
gridview用于显示未批准的评论列表,我希望能够选择要批准的评论,点击“批准”按钮并在评论表中为每个已批准的评论更新字段。
我该怎么做?
我对ajax解决方案持开放态度,但我真正想知道的是如何使用普通帖子获取控制器操作代码中的注释ID列表。我更喜欢不涉及javascript的解决方案,除非这是唯一的选择。
答案 0 :(得分:12)
我能够在不依赖javascript的情况下使用它。步骤如下:
在您的视图文件中添加表单
这将允许将复选框值(html输入元素)发布到您的控制器。
<?php echo CHtml::beginForm(); ?>
<?php $this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
'selectableRows' => 2,
'columns' => array(
array(
'id' => 'selectedIds',
'class' => 'CCheckBoxColumn'
),
'id',
'username',
'content',
array(
'name' => 'created',
'value' => '$data->created'
),
),
));
?>
<div>
<?php echo CHtml::submitButton('Approve', array('name' => 'ApproveButton')); ?>
<?php echo CHtml::submitButton('Delete',
array('name' => 'DeleteButton',
'confirm' => 'Are you sure you want to permanently delete these comments?'));
?>
</div>
<?php echo CHtml::endForm(); ?>
注意,通过将“Name”选项传递给submitButton,它可以知道在控制器中单击了哪个按钮。
为您的复选框添加ID
以前我曾经:
'columns' => array(
array(
'class' => 'CCheckBoxColumn'
),
我将其更改为:
'columns' => array(
array(
'id' => 'selectedIds',
'class' => 'CCheckBoxColumn'
),
现在,您可以通过$_POST['selectedIds']
将所选行引用为数组。默认情况下,CCheckBoxColumn
将使用gridview中模型项的主键(但您可以更改此值),因此selectedIds将是所选主键的数组。
修改控制器以处理所选行
public function actionApprove()
{
if (isset($_POST['ApproveButton']))
{
if (isset($_POST['selectedIds']))
{
foreach ($_POST['selectedIds'] as $id)
{
$comment = $this->loadModel($id);
$comment->is_published = 1;
$comment->update(array('is_published'));
}
}
}
// similar code for delete button goes here
$criteria = new CDbCriteria();
$criteria->condition = 'is_published = 0';
$criteria->order = 'created DESC';
$dataProvider = new CActiveDataProvider('Comment');
$dataProvider->criteria = $criteria;
$this->render('approve', array(
'dataProvider' => $dataProvider,
));
}
我使用这篇Yii wiki文章来帮助我提出这个解决方案:Working with CGridView in Admin Panel
不确定这是否是理想的方法,但它有效。我愿意接受改进建议或其他方法。
答案 1 :(得分:2)
查看docs:
选定的行将具有名为“selected”的CSS类。您还可以调用JavaScript函数$ .fn.yiiGridView.getSelection(containerID)来检索所选行的键值。
所以我认为JS只是你的理由。