2

CCheckBoxColumn と selectableRows = 2 の CGridView があります。ユーザーはグリッド ビューの複数の行を選択できます。

グリッドビューは未承認のコメントのリスト用であり、承認するコメントを選択し、「承認」ボタンを押して、承認されたコメントごとにコメント テーブルのフィールドを更新できるようにしたいと考えています。

これどうやってするの?

私は ajax ソリューションを受け入れていますが、実際に知りたいのは、通常の投稿でコントローラー アクション コード内のコメント ID のリストを取得する方法です。それが唯一の選択肢でない限り、JavaScriptを含まないソリューションを好むでしょう。

4

2 に答える 2

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は、グリッドビュー内のモデル アイテムの主キーが使用されます (ただし、これは変更できます)。そのため、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 の操作

これが理想的な方法かどうかはわかりませんが、うまくいきます。改善やその他の方法についての提案をお待ちしています。

于 2012-10-17T07:36:23.487 に答える
2

ドキュメントを見てください:

選択された行には、「selected」という名前のCSSクラスがあります。JavaScript関数$.fn.yiiGridView.getSelection(containerID)を呼び出して、選択した行のキー値を取得することもできます。

だから私はJSがあなたの場合に行く唯一の方法だと思います。

于 2012-10-17T01:13:43.950 に答える