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
は、グリッドビュー内のモデル アイテムの主キーが使用されます (ただし、これは変更できます)。そのため、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 記事を使用して、この解決策を思い付くのを助けました:管理パネルでの CGridView の操作
これが理想的な方法かどうかはわかりませんが、うまくいきます。改善やその他の方法についての提案をお待ちしています。