Gridview + Ajax Buttons + $Data["id"] (Resolvido)

Pessoal, preciso da ajuda de vocês novamente.

Tenho uma Gridview, alimentada por um ArrayDataprovider.

Na última coluna, tenho os botões de Excluir e Atualizar.

Ao clicar nestes botões, executo um Ajax / Action no Controller para manipular os dados.

Abaixo estão três formas que encontrei, para incluir no parâmetro ‘columns’ da GridView.

O código abaixo, foi o mais próximo que consegui. Mas não sei como passar o ID para a função Javascript.





array(

				 'htmlOptions' => array('nowrap'=>'nowrap'),

				 'class'=>'bootstrap.widgets.TbButtonColumn',

                 'template'=>'{del}',

                 'buttons'=>array(

                          'del'=>array(

                          		   'label'=>'excluir',

                                   'click'=>'function() {

                  var str = $("#compras01-form").serialize();

				  var id_item = "<<<<<<<<< PRECISO DO ID >>>>>>>>>>>>";

                  $.ajax({

                   type: "POST",

                   data: str,

           		   url: "/xsanta/index.php?r=compras01/delItem&id="+id_item,

           		   success: function(data) { $("#div_itens").html(data); },

                        })}',

                                         ),

                        ),

			        ),	




Do jeito abaixo, não consigo nem ver o comando POST no Firebug:




		        array(

			            'name' => 'acoes',

			            'header' => 'acoes',

			            'type' => 'raw',

			            'value' => 'CHtml::ajaxLink(CHtml::Encode("Excluir"), 

			            							Yii::app()->controller->createUrl("delItem", array("id"=>$data)), 

			            							array("type"=>"POST",  "success"=>"allFine"))',

			        ),				




Teoricamente, o 3o. jeito é o mais fácil pois consigo pegar o código ID da linha. Mas não consegui executar a action através e Ajax. Ele joga a URL completa no browser, e gera um erro. Eu tentei através de ajaxOptions também, mas não deu certo.




				 array(

					'htmlOptions' => array('nowrap'=>'nowrap'),

					'class'=>'bootstrap.widgets.TbButtonColumn',

					'template'=>'{upd}{del}',

                    'buttons'=>array(       

                                'upd' => array(

                                  'url'=>'Yii::app()->controller->createUrl("editItem", array("id"=>$data["id"]))',

                               ),

                      			'del' => array(

                                  'url'=>'Yii::app()->controller->createUrl("delItem", array("id"=>$data["id"]))',

                                  'options' => array(

                                  		'ajax'=>array('type'=>'POST', 

                                  					   "success"=>"allFine",

                                  					   'url' => 'js:$(this).attr("href")',

                                  					   'cache' => 'false'

													   ),

													 ),

                                ),

                         	),				 

				),



Já pesquisei demais, tentei todas as opções que meu fraco conhecimento permitia.

Agora preciso da ajuda de vocês,

Obrigado.

Gustavo,

Conseguiu resolver o problema?

Pessoal,

Encontrei esse help que salvou meu dia:

http://www.yiiframework.com/wiki/106/using-cbuttoncolumn-to-customize-buttons-in-cgridview/

Aprendi a usar os comandos abaixo:

$(this).parent().parent().children(’:first-child’).text()

$(this).parent().parent().children(’:nth-child(2)’).text()

Com eles, posso pegar o ID ou outra coluna do meu GridView.

O meu código final ficou assim:




array(

 'htmlOptions' => array('nowrap'=>'nowrap'),

 'class'=>'bootstrap.widgets.TbButtonColumn',

 'template'=>'{del}',

 'buttons'=>array(

           'del'=>array(

	   'label'=>'excluir',

           'click'=>'function() {

                  var str = $("#compras01-form").serialize();

		  var id_item = $(this).parent().parent().children(":first-child").text();

                  $.ajax({

                   type: "POST",

                   data: str,

           		   url: "/website/index.php?r=compras01/delItem&id="+id_item,

           		   success: function(data) { $("#div_itens").html(data); },

                  })}',

           ),

       ),

),



Caso alguém tenha alguma sugestão melhor, favor compartilhar.

Quanto mais informação e gente utilizando o Yii, melhor para todos !

Abs,

Oi Newerton, obrigado pela atenção !

Coloquei aí uma solução que encontrei.

Se tiver alguma outra forma, vamos discutir !

Abraço!

Gustavo,

Quais campos está sendo enviado no $("#compras01-form").serialize();?

Uma sugestão só, verifica no seu código-fonte renderizado no browser, veja se ele está criando 1 função para cada linha de registro, se isso estiver acontecendo, é bom você criar uma função fora no CGridView.

Digo isso por que ja tive problemas com essas funções nas páginação em ajax, as funções só funcionava se eu desativa o ajaxUpdate do CGridView.

Uma função que sempre pego de modelo, e a função padrão do Yii de remover os itens do CGridView:




$(document).on('click','#table-grid a.delete',function() {

	if(!confirm('Deseja realmente excluir este item?')) return false;

	var th=this;

	var afterDelete=function(){};

	$.fn.yiiGridView.update('table-grid', {

		type:'POST',

		url:$(this).attr('href'),

		success:function(data) {

			$.fn.yiiGridView.update('table-grid');

			afterDelete(th,true,data);

		},

		error:function(XHR) {

			return afterDelete(th,false,XHR);

		}

	});

	return false;

});



Oi Newerton, como eu utilizo Array no meu GridView, preciso criar vários hiddenFields (um para cada célula da grid) para conseguir acessá-los através do $_POST na Action "delItem" no Controller. No final da Action, depois do Array atualizado, faço um renderPartial que reconstrói o Grid e os hiddenFields. Foi a única forma que consegui de transportar estes dados de um lado para o outro. Tá bom assim ?

Conferi aqui e só aparece uma vez no html.




$(document).on('click','#itens-grid a.del',function() {

                  var str = $("#compras01-form").serialize();

				  var id_item = $(this).parent().parent().children(":first-child").text();

                  $.ajax({

                   type: "POST",

                   data: str,

           		   url: "/xsanta/index.php?r=compras01/delItem&id="+id_item,

           		   success: function(data) { $("#div_itens").html(data); },

                        })});



Ajuda o novato pouca-prática aqui !!! Eu coloco esse código através do RegisterScript ?

Obrigado mais uma vez viu !

Pra quem está começando, estas dicas são essenciais !

Então pode manter a função nos botões que deve funcionar corretamente, só testa depois nas próximas páginas.

Isso, você adiciona o script no Yii::app()->clientScript->registerScript(), mais se está aparecendo 1 vez a função nem se preocupa.

Sobre a forma de buscar os dados em javascript, e mais ou menos isso mesmo, e complicado essa parte, já tive uma linha grande somente com funções de parent().parent(), até chegar na coluna que eu precisava pegar o ID hehehe

Mais se está funcionando assim, pode ficar de boa!