optionsExpression в CButtonColumn

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

optionsExpression в CButtonColumn

Сообщение Neuromance »

Доброго времени суток.
Расскажу про небольшой рецептик, может кому-то из новичков пригодится. А может закидаете тапками и скажете, что можно обойтись без всяких велосипедов :lol:
Встала у меня как-то задача добавить обработку клика на кнопке в строке грида и чтобы обработка эта учитывала то, что строки разные. То есть как при удалении или изменении строки формируется урл '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);
                              });  
                          }',
                       ),
                    ),
            ),
        ),
    ));
Таким образом получил кнопку, имеющую атрибут tag, содержащий идентификатор строки. И при клике на кнопку смог производить обработку, соответствующую каждой строке грида.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: optionsExpression в CButtonColumn

Сообщение S c »

интересно. давно интересовала такая возможность
Ответить