0

CGridView に CButtonColumn があり、これを押すと JS ルーチンが呼び出されます。JS ルーチンは Ajax 呼び出しを行い、レコードを削除します。目的のレコードを削除するには、レコードの主キーを JS 関数に渡す必要があります。これを相談しましたリンクし、カスタマイズしたボタン呼び出しで JS をアタッチし、PK 値をハードコーディングしてテストすることができました。同じリンクで言及されている 1 つのアプローチは、グリッドの最初の列のテキストにアクセスすることです (jQuery コードが使用されている場合は、以下の myBtn 列コードを参照してください)。そのアプローチを使用して、グリッドにPK列を表示すると問題は解決しますが、ユーザーにPK値を表示することは間違いありません。display:none を使用して htmlOPtions を設定して列を非表示にしようとしましたが、列の見出しがまだ上にぶら下がっていて、非常にみすぼらしく見えます。

以下は私のJSです(フォーマットが悪いことをお許しください、私はたくさん試しましたが、コードスニペットタグに収まりませんでした.stackoverflowで作業するものです:)

function DeleteRec(Rec_id) {
    alert(Rec_id); 
    //var Rec_id=27;
    var data=$("#subject-form").serialize();
    $.ajax({   
        type: 'POST',
        url: '<?php echo Yii::app()->createAbsoluteUrl("upm/subject/deleteRec/id"); ?>'+'/'+Rec_id,   
        data:data,
        success:function(data){
            var myObject = eval('(' + data + ')');
            alert(myObject.recDelete);      
        },
        error: function(data) { // if error occured
            var myObject = eval('(' + data + ')');
            alert("Error occured.please try again"+myObject);
            var myObject = eval('(' + data + ')');
            var myJSONText = JSON.stringify(myObject);
        },
        dataType:'html'
    });
}

以下は私のCGridViewコードです:

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $PatHistoryGrid,
    'id' => 'PatGrid',
    'enableSorting' => false,
    'enablePagination' => false,
    'columns' => array(
        'id' => array(
            'name' => '', 
            'value' => '$data->id', 
            'htmlOptions' => array('style' => 'display:none;',)
        ),
        'Pat' => array(
            'name' => 'Pat Name', 
            'value' => '$data->pat->pat_val', 
            'htmlOptions' => array('width' => '240'),
        ),
        'PatDate' => array(
            'name' => 'Date', 
            'value' => '$data->pat_date', 
            'htmlOptions' => array('width' => '80', 'align' => 'middle')
        ),
        'PatNotes' => array(
            'name' => 'Pat Notes', 
            'value' => '$data->pat_notes', 
            'htmlOptions' => array('width' => '480', 'align' => 'middle')
        ),
        'PatPreNotes' => array(
            'name' => 'Pat Pre Notes', 
            'value' => '$data->pat_pre_notes', 
            'htmlOptions' => array('width' => '480', 'align' => 'middle')
        ),
        'Flag' => array(
            'type' => 'raw', 
            'name' => 'Flag', 
            'value' => '$data->flag', 
            'htmlOptions' => array('width' => '50')
        ),
        array(
            'class' => 'CButtonColumn',
            'template' => '{update} {delete} {myBtn}',
            'buttons' => array(
                'myBtn' => array(
                    'click' => 'function(){
                        DeleteRec($(this).parent().parent().children(":first-child").text());
                    }',
                ),
            ),
        ),
    ),
    'htmlOptions' => array(
        'style' => 'margin-top:-40px;'
    ),
));

フォームの隠し変数のように、CGridColumn を追加しても表示されない方法はありますか? それが可能であれば、私はこの問題を解決することができます。他のアイデアは大歓迎です。

4

2 に答える 2

1

解決策を考案しました。モデルに、JS 関数名と PK をパラメーターとして持つアンカー HTML を返す新しいプロパティを作成しました。グリッドに新しい列を追加し、その値をそのプロパティにしました。この列と他の通常の列の唯一の違いは、その型が raw として含まれていることです。以下は、私のモデル プロパティのコード スニペットです。

    public function getDataDel(){
     return '<a class="myBtn" title="myBtn" click="DeleteRec('.$this->id.') " href="#">myBtn</a>';
}   

以下は、私の新しい CGridView コードです。

$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$PatHistoryGrid,
'id'=>'PatGrid',
'enableSorting'=>false,
'enablePagination'=>false,
'columns'=>array('Pat'=>array('name'=>'Pat Name','value'=>'$data->pat->pat_val', 'htmlOptions'=>array('width'=>'240'),),
                  'PatDate'=>array('name'=>'Date','value'=>'$data->pat_date','htmlOptions'=>array('width'=>'80','align'=>'middle')),    
                  'PatNotes'=>array('name'=>'Pat Notes','value'=>'$data->pat_notes','htmlOptions'=>array('width'=>'480','align'=>'middle')),                  
                  'PatPreNotes'=>array('name'=>'Pat Pre Notes','value'=>'$data->pat_pre_notes','htmlOptions'=>array('width'=>'480','align'=>'middle')),
                  'Flag'=>array('type'=>'raw','name'=>'Flag','value'=>'$data->flag','htmlOptions'=>array('width'=>'50')),
    'Delid'=>array('type'=>'raw','name'=>'Btns','value'=>'$data->dataDel','htmlOptions'=>array('width'=>'50')),
),
'htmlOptions'=>array('style'=>'margin-top:-40px;'),));
于 2012-10-17T00:56:03.727 に答える
0

ボタンのクラスを追加できます:

'buttons' => array(
    'myBtn' => array(
        'options' => array('class' => 'myBtn')
    ),
),

次に、JS で Yii の方法に従って ID を取得できます。

$('#PatGrid').on('click', '.myBtn', function() {
    var id = $.fn.yiiGridView.getKey(
        'PatGrid',
        $(this).closest('tr').prevAll().length 
    );
    alert(id);
    /* Your code */
});
于 2012-10-17T01:02:01.473 に答える