如何在Yii CGridView中处理选定的行?

Use*_*ser 2 checkbox gridview yii

我有一个带有CCheckBoxColumn和selectableRows = 2的CGridView.用户可以选择我的网格视图的多行.

gridview用于显示未批准的评论列表,我希望能够选择要批准的评论,点击"批准"按钮并在评论表中为每个已批准的评论更新字段.

我怎样才能做到这一点?

我对ajax解决方案持开放态度,但我真正想知道的是如何使用普通帖子获取控制器操作代码中的注释ID列表.我更喜欢不涉及javascript的解决方案,除非这是唯一的选择.

Use*_*ser 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(); ?>
Run Code Online (Sandbox Code Playgroud)

注意,通过将"Name"选项传递给submitButton,它允许知道在控制器中单击了哪个按钮.

为复选框列添加ID

以前我曾经:

'columns' => array(
    array(
        'class' => 'CCheckBoxColumn'
    ),
Run Code Online (Sandbox Code Playgroud)

我改为:

'columns' => array(
    array(
        'id' => 'selectedIds',
        'class' => 'CCheckBoxColumn'
    ),
Run Code Online (Sandbox Code Playgroud)

现在,您可以将所选行作为数组引用$_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,
    ));
}
Run Code Online (Sandbox Code Playgroud)

我使用这篇Yii wiki文章来帮助我提出这个解决方案:在管理面板中使用CGridView

不确定这是否是理想的方式,但它的工作原理.我愿意接受改进建议或其他方法.