Расскажу про небольшой рецептик, может кому-то из новичков пригодится. А может закидаете тапками и скажете, что можно обойтись без всяких велосипедов
Встала у меня как-то задача добавить обработку клика на кнопке в строке грида и чтобы обработка эта учитывала то, что строки разные. То есть как при удалении или изменении строки формируется урл 'index.php?r=c/update&id=1'. а мне этот id=1 надо обрабатывать на стороне клиента. А ведь для каждой строки грида он разный. Призадумался я и начал рыть исходники класса CButtonColumn. И оказалось, что вычисляемыми свойствами кнопки являются только url и visible. И стало мне от этого очень грустно, т.к. выцеплять айдишник из урла уж очень не хотелось.
И вот я написал класс
Код: Выделить всё
<?php
class RCButtonColumn extends CButtonColumn {
protected function renderButton($id,$button,$row,$data){
if(isset($button['optionsExpression'])){
$optionsExpression = $button['optionsExpression'];
if(is_array($optionsExpression)){
foreach($optionsExpression as $optionName=>$optionExpr){
$button['options'][$optionName] = $this->evaluateExpression($optionExpr,array('data'=>$data,'row'=>$row));
}
}
}
parent::renderButton($id,$button,$row,$data);
}
}
?>
Код: Выделить всё
$this->widget('CGridView', array(
'dataProvider'=>$dataProvider,
'id'=>'gridId',
'columns'=>array(
array(
'class'=>'RCButtonColumn',
'template'=>'{newButton}{update}{delete}',
'buttons'=>array(
'newButton' => array(
'label'=>'...',
'imageUrl'=>'...',
'url'=>'"#"',
'optionsExpression'=>array('tag'=>'$data["yourId"]'),
'click'=>'function(){
$.post("'.Yii::app()->request->createUrl('yourController/yourAction').'", {id: $(this).attr("tag")}, function(data) {
$("#yourFormId").html(data);
});
}',
),
),
),
),
));