передача ID записи таблицы Grid в JS функцию обработки нажатия кнопки CButtonColumn

Помогите с синтаксисом!!!

Не могу никак вставить значение PHP переменной (ID записи таблицы Grid) в JS функцию обработки нажатия кнопки CButtonColumn.

Вариант использования CheckBox не подходит, так как предусматривает возможность выбора нескольких строк таблицы, а надо ТОЛЬКО одну.

Решил использовать спец кнопку в каждой строке записи, добавив ее в колонку с кнопками типа CButtonColumn.

В документации написано, что значение ID записи таблицы Grid хранится в PHP переменной $data->id.

У меня каждая строка таблицы GridView имеет не стандартную кнопку выбора ТОЛЬКО одной записи, по нажатию которой вызывается JS функция saveSelectRow - обработки нажатия с последующим Ajax запросом к серверу.

Вот в эту функцию и надо передать $data->id.

Вроде простая задача но никак не получается побороть (((.

Перерыл доку и примеры, но везде попадаются примеры только в чистом виде JS а надо JS+PHP

вот фрагмент описания моей кнопки:




'select' => array(

  'label'=>'выбрать',

  'imageUrl'=>ICON_ADD_32,

  'options'=>array('style'=>"margin-left:5px;", 'title'=>'Выбрать запись'),

  'onClick'=>'event.preventDefault();saveSelectRow('.'$data->id'.');',

  'url'=>'Yii::app()->createUrl("admintable/row_select/idrow/$data->id")',

)



если не использовать ‘onClick’ (удалить из описания кнопки) передавать просто через URL при нажатии кнопки, то $data->id заменяется на значение ID, а если использовать ‘onClick’ то не хочет…

в HTML варианте просмотра кода страницы для $data->id = 3 получается

event.preventDefault();saveSelectRow($data->id);

а надо:

event.preventDefault();saveSelectRow(3);

Подскажите пожалуйста, как правильно записать…может вообще как то по другому это делать?

Добавьте параметр data-id например кнопке:




'select' => array(

  'label'=>'выбрать',

  'imageUrl'=>ICON_ADD_32,

  'options'=>array('style'=>"margin-left:5px;", 'title'=>'Выбрать запись', 'data-id'=>'$data->id', 'class'=>'select-button'),

)



Вместо добавления onClick каждой кнопке, проще добавить event сразу всем:




$url = $this->createUrl('admintable/row_select/idrow');

Yii::app()->clientScript->registerScript('initStatus',

    "$('.select-button').on('change','body',function() {

        el = $(this);

        $.ajaxPost('$url', {id: el.data('id')}

    });",

    CClientScript::POS_READY

);



Ну и уже в action обрабатывайте $_POST[‘id’]. Можно переделать в get с url как вам нужно.

Спасибо, ineersa, за идею с параметром!

Для варианта - просто передачи значения серверу по нажатию кнопки это подходит.

Но вторая часть - передать значение $data->id как параметр для JS функции при ее вызове,

для того чтобы до отправки на сервер с этим значение можно было поработать в моей JS функции -в этом проблема.

Ну для простоты типа такая простая ситуация - по нажатию кнопки в строке таблицы вывести сообщение с указание ID записи строки нажатой кнопки (В инете, везде примеры просто сообщения без ID выбранной строки!!!!):





<?php


...

//массив описания кнопок управления записью для каждой строки в Grid 

$arraySettingsButtonRow = array(

 //кнопка выбора ОДНОЙ записи таблицы Grid

 'select' => array( 

   'label'=>'выбрать',

   'imageUrl'=>ICON_ADD_32,

   'options'=>array('style'=>"margin-left:5px;", 'title'=>'Выбрать запись', 'data-id'=>'$data->id'),

   'onClick'=>'event.preventDefault();saveSelectRow('$data->id');',

   'url'=>'"#"', //переход на URL не нужен, требуется  JS ОБРАБОТКА нажатия кнопки

 )

);

...


?>

<script>

	//обработка кнопки выбора ОДНОЙ записи таблицы Grid

	function saveSelectRow(id_row) {

		alert('Выбрана запись с ID='+id_row);

	};

</script>	



Как вариант решения - можно получать(извлекать) в моей JS функции saveSelectRow значения параметра кнопки с использованием например JQuery можно, но все же хотелось просто передавать значение напрямую через параметр функции и вот именно это передача не получается в строке:


'onClick'=>'event.preventDefault();saveSelectRow('$data->id');'

$data->id воспринимается при обработке скрипта как строка символов а не как PHP переменная значение которой надо подставить как параметр (((.

В доке на CButtonColumn написано что параметр ‘onClick’ в описании кнопки должен содержать текст функции обработчика на языке JS, возможно в этом проблема и туда нельзя вставлять фрагментом PHP код. Вот этот момент мне не понятен и не получается…((( Хотя я предполагаю что дело в синтаксисе написания строки.

Перепробовал разные варианты:


'onClick'=>'event.preventDefault();saveSelectRow('.$data->id.');'

или


'onClick'=>'event.preventDefault();saveSelectRow('<?php echo $data->id; ?>');'

или


'onClick'=>'event.preventDefault();saveSelectRow('$data->id');'

все воспринимают $data->id как строку а не PHP переменную! ((((

Вариант:


'onClick'=>'event.preventDefault();saveSelectRow('.$data->id.');'

ругается что нет переменной $data - ну тут понятно, что она появляется в момент уже формирования строки таблицы и соответственно на момент выполнения скрипта до начала построения таблицы ее нет…но от этого не легче (((

Подскажите, пожалуйста, кто знает!!!!!!

Не пишите такие большие ответы :rolleyes:

И если честно не понял чем вас не устраивает мой вариант:




el.data('id')



И есть ваш


$data->id

Зачем присваивать каждой кнопке event если можно повесить разом на все.

Ваш вариант хороший и в целом подходит, спасибо.

Но часть кнопок в моем проекте, в зависимости от содержимого строки таблицы Grid, будут иметь РАЗНЫЕ параметры в том числе и обработчики нажатия, потому вариант использования onClick более гибкий, в моем случае позволяет менять параметры некоторых кнопок в момент генерации Grid таблицы, управлять этим на уровне PHP кода а не JS обработчика нажатия кнопки.

Кроме того Ваш вариант, не дает ответ на вопрос ПЕРЕДАЧИ значения КАК параметра функции function(name_parametr)!!!! Вы это значение извлекаете самой функцией!!! то-есть используете функцию без параметра!!!

а именно function().

Я специально выше привел текст скрипта примера функции saveSelectRow реализующей прием параметра id_row.

Прошу прощения если я ошибаюсь в терминологии, но постарался написать разными вариантами чтоб было понятно о чем я…потому и так много…

Если не трудно исправьте мой пример вызова функции saveSelectRow в описании кнопки для Grid, как правильно его реализовать С ПЕРЕДАЧЕЙ параметра в функцию, с учетом Вашего предложения, чтоб функция saveSelectRow получала готовое значение ID при нажатии кнопки в соответствующей записи (а не сама его искала в параметрах кнопки).

Именно не получается ПЕРЕДАЧА значения!!! (передача PHP значения $data->id в JS значение id_row) для функции:




<script>

        //обработка кнопки выбора ОДНОЙ записи таблицы Grid

        function saveSelectRow(id_row) {

                alert('Выбрана запись с ID='+id_row);

        };

</script> 



возможно я не верно Вас понял.

в Вашем варианте:





$url = $this->createUrl('admintable/row_select/idrow');

Yii::app()->clientScript->registerScript('initStatus',

    "$('.select-button').on('change','body',function() {

        el = $(this);

        $.ajaxPost('$url', {id: el.data('id')}

    });",

    CClientScript::POS_READY

);



Как я понимаю значение ID функция САМОСТОЯТЕЛЬНО получает извлекая его из параметра кнопки data-id.

Это вроде понятно если это так.

Но мне хочется разобраться и научится на будущее и понять КАК при описании КНОПКИ в CButtonColumn через параметр onClick ПЕРЕДАВАТЬ в JS функцию обработчика нажатия - значение ФОРМИРУЕМОЕ как ПАРАМЕТР функции обработчика нажатия ( а не чтобы сама функция без параметра (function()) его искала.

еще раз спасибо за терпение