Dual Grid

Olá Pessoal,

Tenho duas grids. E quero "transferir" registro entre ela sem realizar consulta. Alguma ideia de como posso pesquisar isso com Jquery?

Segue meu código:




$rawData=Yii::app()->db->createCommand("SELECT * FROM pessoa WHERE id_cidade=" . $idCidade ." AND pessoa.id 

    NOT IN (SELECT participante_reuniao.id_pessoa 

    FROM participante_reuniao)")->queryAll();                    

$dataProvider=new CArrayDataProvider($rawData);                    

$this->widget('ext.selgridview.SelGridView', array(

     'id' => 'pessoa-out-reuniao-grid',

     'dataProvider' => $dataProvider,

     //'dataProvider' => $pessoa->search(),

     //'filter'=>$pessoa,

     'selectableRows' => 2,                         

     'columns' => array(	

         array(

             'class'=>'CCheckBoxColumn',

         ),

         'nome',

         'rg',

         'cpf',                             

         'telefone',                                

     ),

));

?>

<?php 

    $this->widget('bootstrap.widgets.TbButton', array(

    'type'=>'secondary',

    'label'=>'Adicionar',

    'url'=>'#',

    'htmlOptions'=>array('id'=>'btnAdicionarReuniao'),

));






$rawData=Yii::app()->db->createCommand("SELECT * FROM pessoa WHERE id_cidade=" . $idCidade ." AND pessoa.id

    IN (SELECT participante_reuniao.id_pessoa 

    FROM participante_reuniao)")->queryAll();                  

$dataProvider=new CArrayDataProvider($rawData);                    

$this->widget('ext.selgridview.SelGridView', array(

     'id' => 'pessoa-in-reuniao-grid',

     'dataProvider' => $dataProvider,

     //'dataProvider' => $pessoa->search(),

     //'filter'=>$pessoa,

     'selectableRows' => 2,                         

     'columns' => array(	

         array(

             'class'=>'CCheckBoxColumn',

         ),

         'nome',

         'rg',

         'cpf',                             

         'telefone',                                

     ),

));

?>

<?php 

    $this->widget('bootstrap.widgets.TbButton', array(

    'type'=>'secondary',

    'label'=>'Remover',

    'url'=>'#',

    'htmlOptions'=>array('id'=>'btnRemoverReuniao'),

)); ?>



O código está em uma página a parte. É renderizado pelo _form. Ao salvar o form pego os registro do 2° grid para inserir no banco.

tatau,

Como deseja fazer essa transferência de uma grid para outra? Terá algum botão?

So adiantando a solução, seria bom você fazer isso em javascript, usando ajax.

Quando você clicar no botão da Grid-1, em ajax você faz essa alteração para a tabela que o Grid-2 faz a leitura. Depois disso, você faz a atualização das duas grid usando jQuery(’#grid-1’).yiiGridView(‘update’) e jQuery(’#grid-2’).yiiGridView(‘update’).

Olá Newerton,

Obrigado pela dica. Tentei achar uma solução em JavaScript, porém sem sucesso.

Resolvi da seguinte forma:

Coloquei uma div na minha view, que lista os dois grids. Conforme atualização do dropDownList. O Primeiro Grid de participantes disponíveis para reunião. E o segundo grid dos participantes que já estão na reunião. Cada grid está em uma página, renderizo eles na div da view.





echo $form->dropDownList($model, 'id_cidade', GxHtml::listDataEx(Cidade::model()->findAllAttributes(null, true)),

                        array(

                                'ajax' => array(

                                'type'=>'POST',

                                'url'=>$this->createUrl('reuniao/UpdateAjax'), //url to call

                                'update'=>'#outlet',

                                'data'=>'js:jQuery(this).serialize()',                                

                            )

                        )

                    );


<div id="outlet"></div>




Código do Primeiro Grid:




<?php

Yii::app()->clientScript->registerScript('update-grid-pessoa-out-reuniao', "

$('#btnAdicionarReuniao').click(function(){

    var arrayIds = $('#pessoa-out-reuniao-grid').selGridView('getAllSelection');

    var getIdCidade = $('#idCidade').val();

    

    if (!arrayIds.length)

    {

        alert('Selecione no mínimo um ítem para ser adicionado');

        return false;

    }

    

    $.ajax({

        type: 'POST',

        url: ''+location.pathname+'?r=reuniao/UpdateAjax&arrayIdAdicao='+arrayIds+'&idCidade='+getIdCidade+'',

        data: {selectedItems : arrayIds},

        success: (function (data){           

           $('#outlet').html(data);

        }),

        error: function(data) { // if error occured

            alert('Error occured.please try again');   

            alert(data);

        },

        dataType:'html'

    });

    

    return false;    


});

");

?>


<h2>Participantes Disponíveis</h2>

<?php

$this->widget('ext.selgridview.SelGridView', array(

     'id' => 'pessoa-out-reuniao-grid',

     'dataProvider' => $dataProvider,

     //'dataProvider' => $pessoa->search(),

     //'filter'=>$pessoa,

     'selectableRows' => 2,                         

     'columns' => array(	

         array(

             'class'=>'CCheckBoxColumn',

         ),

         'nome',

         'rg',

         'cpf',                             

         'telefone',                                

     ),

));

?>

<INPUT TYPE="hidden" NAME="idCidade" ID="idCidade" VALUE="<?php echo $idCidade; ?>">

<?php 

$this->widget('bootstrap.widgets.TbButton', array(

    'type'=>'secondary',

    'label'=>'Adicionar',

    'url'=>'#',

    'htmlOptions'=>array('id'=>'btnAdicionarReuniao'),

)); 

?>



Código do segundo Grid:




<?php

Yii::app()->clientScript->registerScript('update-grid-pessoa-in-reuniao', "

$('#btnRemoverReuniao').click(function(){

    var arrayIds = $('#pessoa-in-reuniao-grid').selGridView('getAllSelection');

    var getIdCidade = $('#idCidade').val();

    

    if (!arrayIds.length)

    {

        alert('Selecione no mínimo um ítem para ser removido');

        return false;

    }

    

    $.ajax({

        type: 'POST',

        url: ''+location.pathname+'?r=reuniao/UpdateAjax&arrayIdRemocao='+arrayIds+'&idCidade='+getIdCidade+'',

        data: {selectedItems : arrayIds},

        success: (function (data){           

           $('#outlet').html(data);

        }),

        error: function(data) { // if error occured

            alert('Error occured.please try again');   

            alert(data);

        },

        dataType:'html'

    });

    

    return false;    


});

");

?>




<h2>Participantes da Reunião</h2>

<?php

$this->widget('ext.selgridview.SelGridView', array(

     'id' => 'pessoa-in-reuniao-grid',

     'dataProvider' => $dataProvider,

     //'dataProvider' => $pessoa->search(),

     //'filter'=>$pessoa,

     'selectableRows' => 2,                         

     'columns' => array(	

         array(

             'class'=>'CCheckBoxColumn',

         ),

         'nome',

         'rg',

         'cpf',                             

         'telefone',                                

     ),

));

?>

<INPUT TYPE="hidden" NAME="idCidade" ID="idCidade" VALUE="<?php echo $idCidade; ?>">

<?php 

$this->widget('bootstrap.widgets.TbButton', array(

    'type'=>'secondary',

    'label'=>'Remover',

    'url'=>'#',

    'htmlOptions'=>array('id'=>'btnRemoverReuniao'),

)); 

?>



No meu controller faço toda a lógica para pegar os checkbox selecionados nos grids para adição e remoção dos participantes:




public function actionUpdateAjax($arrayIdAdicao = null, $arrayIdRemocao = null)

        {

            

            if(!is_null($arrayIdAdicao)){

                $arrayIdAdicao = explode(",", $arrayIdAdicao);

            }

            

            if(!is_null($arrayIdRemocao)){

                $arrayIdRemocao = explode(",", $arrayIdRemocao);

            }

            

            

            if (isset($_POST['Reuniao']['id_cidade'])){

                $idCidade = $_POST['Reuniao']['id_cidade'];

            } else {

                $idCidade = $_GET['idCidade'];

            }


            

            if (isset($idCidade) || !is_null($arrayIdRemocao) || !is_null($arrayIdAdicao)) {

                

                

             

                //Participantes fora da reunião

                $rawDataOutReuniao=Yii::app()->db->createCommand("SELECT * FROM pessoa WHERE id_cidade=" . $idCidade ." AND pessoa.id 

                    NOT IN (SELECT participante_reuniao.id_pessoa 

                    FROM participante_reuniao)")->queryAll();                    

                $dataProviderOutReuniao=new CArrayDataProvider($rawDataOutReuniao);   

                

                

                //Participantes dentro da reunião

                $rawDataInReuniao=Yii::app()->db->createCommand("SELECT * FROM pessoa WHERE id_cidade=" . $idCidade ." AND pessoa.id

                    IN (SELECT participante_reuniao.id_pessoa 

                    FROM participante_reuniao)")->queryAll();                  

                $dataProviderInReuniao=new CArrayDataProvider($rawDataInReuniao);

                

                if(!is_null($arrayIdAdicao)){

                    

                    //Remover participante dos participantes disponíveis

                    foreach ($dataProviderOutReuniao->rawData as $key => $value){                        

                        if(in_array($dataProviderOutReuniao->rawData[$key]['id'], $arrayIdAdicao)){

                            unset($dataProviderOutReuniao->rawData[$key]); 

                        }                        

                    }

                    

                    // adiciona Participante a Reuniao

                    $modelPessoa = new Pessoa;

                    foreach ($arrayIdAdicao as $key => $value) { 

                        $rawDataPessoa = Yii::app()->db->createCommand("SELECT * FROM pessoa WHERE id=" . $value ."")->queryAll();

                        $modelPessoa = new CArrayDataProvider($rawDataPessoa);

                        //verifica se participante já inserido na reunião                        

                        if((is_null($dataProviderInReuniao->rawData[$key]['id'])) || (!in_array($dataProviderInReuniao->rawData[$key]['id'], $modelPessoa->rawData[0]))){

                            array_push($dataProviderInReuniao->rawData, $modelPessoa->rawData[0]);

                        }

                    }                   

                }

                

                if(!is_null($arrayIdRemocao)){

                    

                    //Remover participantes que estão dentro da reuniao

                    foreach ($dataProviderInReuniao->rawData as $key => $value){

                        if(in_array($dataProviderInReuniao->rawData[$key]['id'], $arrayIdRemocao)){

                            unset($dataProviderInReuniao->rawData[$key]); 

                        }        

                    }

                    

                    // adiciona Participante removidos da reuniao aos participantes disponiveis

                    $modelPessoa = new Pessoa;

                    foreach ($arrayIdRemocao as $key => $value) { 

                        $rawDataPessoa = Yii::app()->db->createCommand("SELECT * FROM pessoa WHERE id=" . $value ."")->queryAll();

                        $modelPessoa = new CArrayDataProvider($rawDataPessoa);

                        //verifica se participante já esta fora da reuniao

                        if((is_null($dataProviderOutReuniao->rawData[$key]['id'])) || (!in_array($dataProviderOutReuniao->rawData[$key]['id'], $modelPessoa->rawData[0]))){

                            array_push($dataProviderOutReuniao->rawData, $modelPessoa->rawData[0]);

                        }

                    }   

                }                

                $this->renderPartial('_participantesOutReuniao', array('dataProvider' => $dataProviderOutReuniao, 'idCidade' => $idCidade), false, true);

                $this->renderPartial('_participantesInReuniao', array('dataProvider' => $dataProviderInReuniao, 'idCidade' => $idCidade), false, true);  

            }

            

           

        }