0

我的 CGridView 按下有一个 CButtonColumn,它调用我的 JS 例程。JS 例程进行 Ajax 调用并删除一条记录。我需要将记录的主键传递给 JS 函数以删除预期的记录。我咨询过这个链接,并能够使用我的自定义按钮调用附加 JS,并通过硬编码 PK 值对其进行测试。在同一链接中提到的一种方法是访问网格第一列中的文本很有用(请参阅下面给出的使用 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。我在网格中添加了一个新列并将其值设置为该属性。此列与其他常规列的唯一区别在于它包含原始类型。以下是我的模型属性的代码片段:

    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 回答