【问题标题】:How to process selected rows in Yii CGridView?如何处理 Yii CGridView 中的选定行?
【发布时间】:2012-10-07 01:37:04
【问题描述】:

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

gridview 用于未批准的 cmets 列表,我希望能够选择 cmets 进行批准,点击“批准”按钮并为每个已批准的评论更新 cmets 表中的字段。

我该怎么做?

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

【问题讨论】:

标签: gridview checkbox yii


【解决方案1】:

我能够在不依赖 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(); ?>

请注意,通过将“名称”选项传递给 submitButton,它可以知道在控制器中单击了哪个按钮。

给你的复选框列一个 id

以前我有:

'columns' => array(
    array(
        'class' => 'CCheckBoxColumn'
    ),

我把它改成了:

'columns' => array(
    array(
        'id' => 'selectedIds',
        'class' => 'CCheckBoxColumn'
    ),

现在您可以通过$_POST['selectedIds'] 将所选行作为数组引用。默认情况下,CCheckBoxColumn 将使用网格视图中模型项的主键(但您可以更改此设置),因此 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

不确定这是否是理想的方法,但它确实有效。我愿意接受改进建议或其他方法。

【讨论】:

  • 我认为这个答案可以改进的地方是让它使用表单模型。
【解决方案2】:

看看docs

选中的行将有一个名为“selected”的 CSS 类。您也可以调用 JavaScript 函数 $.fn.yiiGridView.getSelection(containerID) 来检索所选行的键值。

所以我想 JS 是你的唯一方法。

【讨论】:

  • 你能告诉我必须把这个函数放在哪里吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多