CCheckBoxColumn na GridView

Olá galera do yii,

Sou novo por aqui e estou com uma pequena dúvida de início, e se for possível gostaria da ajuda de todos para resolver. Bem é o seguinte:

Tenho duas tabelas, uma de funcionário e uma de solicitacao_funcionarios.

A de FUNCIONÁRIOS irá conter todos os dados do mesmo e a de SOLICITACAO_FUNCIONARIO irá conter uma chave extrangeira de funcionários e alguns dados a mais.

Na minha GridView de Funcionários coloquei um CCheckBoxColumn, e gostaria de criar um botão de Solicitar Funcionário, onde o usuário irá selecionar os funcionário que desejar e clicar no botão. Fazendo isso automaticamente inserir os dados na outra tabela de solicitacao_funcionarios.

Como seria possível resolver este problema. Se alguém não conseguiu entender, favor avisar que posso explicar mais.

Desde já agradeço a ajudada de todos.

Att,

Adrian Lucas

Por favor explique mais ::)

Deixa eu ver se entendi vc tem uma lista de funcionarios dai vc seleciona eles e quando der o post os selecionados vai direto para solicitação_funcionarios certo?

Correto amigo,

Basicamente irei pegar os funcionários que estiverem com Desatualizados, selecionálos e enviar seus dados para a tabela de Atualização, e alterar seu Status para EM ANDAMENTO. Abaixo como estão as tabelas

Não seria mais fácil e menos trabalhoso você criar uma coluna na sua tabela com o nome status dai colocava atualizado e desatualizado?

Esta coluna já existe, a minha lógica é o seguinte: Cada colaborador terá várias atualizações do correntente tempo de serviço, ou seja, a ligação de funcionario para atualização e de 1 pra n. Então preciso fazer este Select na tabela de funcionário e fazer um Insert destes dados na tabela de Atualização.

Sds,

Adrian Lucas

Não entendi mto bem o seu problema. Você quer pegar os funcionários que estão selecionados no gridview e inseri-los na tabela de solicitações?

Isso mesmo amigo, basicamente seria isso mesmo. Pegar os funcionários que estão selecionados na GridView e inserir seus dados na tabela solicitação.

Sds,

Adrian Lucas

Você pode colocar o cgridview e o botão dentro de um form e inserir as solicitações de acordo com o que for enviado pelo post.

Como seria amigo?

Sds,

Adrian Lucas

Você pode fazer assim:




<?php echo CHtml::beginForm()?>

	/* código do CGridView*/

        <?php echo CHtml::submitButton('Salvar'); ?>

    

<?php echo CHtml::endForm();?>



Aí no controller vc obtem os códigos dos funcionários no POST. Dai pra frente é só gravar os dados fazendo o looping no array que contém todos os códigos e pronto.

Cara obrigado,

Vou tentar fazer e assim que tiver pronto eu coloco os códigos aqui.

Obrigado pela ajuda,

Adrian lucas

Você também pode fazer um botão em ajax.




<?php

echo CHtml::scriptFile(app()->baseUrl . '/js/form.php');

$this->breadcrumbs = array(

    'Colunistas' => array('index'),

    Yii::t('admin', 'List')

);


?>


<br />

<?php

        echo CHtml::htmlButton('Remover Selecionado(s)', array(

            'class' => 'botao botaoVermelho',

            'type' => 'button',

            'ajax' => array(

                'type' => 'POST',

                'url' => Yii::app()->createUrl(Yii::app()->controller->id.'/delete'),

                'dataType' => 'json',

                'beforeSend' => 'function(){

                        var id = $("input[name=\'table-grid_c0\[\]\']:checked").serialize();

                        if(id == \'\'){

                            alert(\'Selecione pelo menos 1(um) item\');

                            $("input[name=\'table-grid_c0\[\]\'], input[name=\'table-grid_c0_all\']").show(\'pulsate\', 1000);

                            return false;

                        }

                        if(!confirm(\''.Yii::t('zii', 'Are you sure you want to delete this item?').'\')) return false;

                    }',

                'success' => "function(data){\$.fn.yiiGridView.update('table-grid');}",

                'data' => array(

                    'table-grid_c0' => 'js:decodeURIComponent($("input[name=\'table-grid_c0\[\]\']:checked").serialize()).replace(/table-grid_c0\[\]=/g, "").replace(/&/g, ",")')

            )

        ));

?>


<?php

        $this->widget('zii.widgets.grid.CGridView', array(

            'id' => 'table-grid',

            'dataProvider' => $model->search(),

            'filter' => $model,

            'selectableRows' => 2,

            'columns' => array(

                array(

                    'name' => 'codcolunista',

                    'class' => 'CCheckBoxColumn',

                ),

                array(

                    'name' => 'titulo',

                ),

            ),

        )); ?>




Newerton,

Com esse comando eu consigo jogar os dados para outra tabela?

Sds,

Adrian Lucas

Consegue sim, vou te explicar como funciona o botão.




echo CHtml::htmlButton('Remover Selecionado(s)', array(

            'type' => 'button',

            'ajax' => array(

                'type' => 'POST',

                'url' => Yii::app()->createUrl(Yii::app()->controller->id.'/delete'),

                'dataType' => 'json',

                'beforeSend' => 'function(){

                        var id = $("input[name=\'table-grid_c0\[\]\']:checked").serialize();

                        if(id == \'\'){

                            alert(\'Selecione pelo menos 1(um) item\');

                            $("input[name=\'table-grid_c0\[\]\'], input[name=\'table-grid_c0_all\']").show(\'pulsate\', 1000);

                            return false;

                        }

                        if(!confirm(\''.Yii::t('zii', 'Are you sure you want to delete this item?').'\')) return false;

                    }',

                'success' => "function(data){\$.fn.yiiGridView.update('table-grid');}",

                'data' => array(

                    'table-grid_c0' => 'js:decodeURIComponent($("input[name=\'table-grid_c0\[\]\']:checked").serialize()).replace(/table-grid_c0\[\]=/g, "").replace(/&/g, ",")')

            )

        ));




Os checkbox, seu name="" e id="" são criados com o ID da grid (table-grid)




...

$this->widget('zii.widgets.grid.CGridView', array(

            'id' => 'table-grid',

...



Você precisa criar um action para receber os checkbox selecionados. Ex.:




public actionSolicitados(){


print_r($_POST['funcionarios']);


}



Na URL do botão, você defini para onde irá enviar os dados selecionados:




...

'url' => Yii::app()->createUrl('funcionario/solicitados'),

...



Os demais atributos abaixo, são funções padrões/nativos do jquery.




'beforeSend' => 'function(){

                        var id = $("input[name=\'table-grid_c0\[\]\']:checked").serialize();

                        if(id == \'\'){

                            alert(\'Selecione pelo menos 1(um) item\');

                            $("input[name=\'table-grid_c0\[\]\'], input[name=\'table-grid_c0_all\']").show(\'pulsate\', 1000);

                            return false;

                        }

                        if(!confirm(\'Tem certeza que deseja solicitar esses funcionários?\')) return false;

                    }',

                'success' => "function(data){\$.fn.yiiGridView.update('table-grid');}",

                'data' => array(

                    'funcionario' => 'js:decodeURIComponent($("input[name=\'table-grid_c0\[\]\']:checked").serialize()).replace(/table-grid_c0\[\]=/g, "").replace(/&/g, ",")')

            )



Para debugar, usa o Firebug ou similar.

No atributo ‘success’ coloca um alert(data) para verificar os resultados que está indo para o actionSolicitados().




'success' => "function(data){alert(data);\\$.fn.yiiGridView.update('table-grid');}",



Se fico confuso, posta sua view/funcionario/index.php

Olha Newerton,

Na minha view/colaborador/admin.php tá assim




<?php

$this->pageTitle = Yii::app()->name . 'CTPS - Colaboradores Cadastrados';

$this->breadcrumbs = array(

    'Colaboradores' => array('admin'),

    'Cadastrados',

);


Yii::app()->clientScript->registerScript('search', "

$('.search-button').click(function(){

	$('.search-form').toggle();

	return false;

});

$('.search-form form').submit(function(){

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

		data: $(this).serialize()

	});

	return false;

});

");

?>


<div class="example_title">

    <img src="<?php echo Yii::app()->request->baseUrl; ?>/images/usuarios.png" alt="logo" />

    <?php echo "Colaboradores Cadastrados"; ?>

</div>


<div class="demo_box">

    <p>

        <b>DICA: </b><i>Você pode, opcionalmente, digitar um operador de comparação</i> <Font color="#00008B"><b>( <b>&lt; 'menor'</b>, <b>&lt;= 'menor igual'</b>, <b>&gt; 'maior'</b>, <b>&gt;= 'maior igual'</b>, <b>&lt;&gt; 'diferente'</b>

                ou <b>= 'igual'</b> )</b> </Font><i>no início de cada um dos valores da sua pesquisa para especificar como a comparação deverá ser feita.</i>

    </p>


    <?php

    $this->widget('zii.widgets.grid.CGridView', array(

        'id' => 'colab-grid',

        'dataProvider' => $model->search(),

        'filter' => $model,

        'pager' => array('cssFile' => Yii::app()->baseUrl . '/css/gridViewStyle/gridView.css'),

        'cssFile' => Yii::app()->baseUrl . '/css/gridViewStyle/gridView.css',

        'htmlOptions' => array('class' => 'grid-view rounded'),

        'selectableRows' => 2,

        'columns' => array(

            array(

                'class' => 'CCheckBoxColumn',

                'checked' => 'false',

            ),

            //'idcolab',

            array(

                'name' => 'drt',

                'htmlOptions' => array(

                    'style' => 'text-align:center'),

            ),

            'nome',

            array(

                'name' => 'ccustos',

                'htmlOptions' => array(

                    'style' => 'text-align:center'),

            ),

            'setor',

            array(

                'name' => 'statusAtividade',

                'type' => 'raw',

                'filter' => array('ATIVO' => 'ATIVO', 'INATIVO' => 'INATIVO'),

                'value' => '($data->statusAtividade == "ATIVO")?

                  "<img src=\"' . Yii::app()->baseUrl . '/images/icones/tick-circle.png\" align=\"absmiddle\" /> ' . Yii::t('admin', 'ATIVO') . '" :

                  "<img src=\"' . Yii::app()->baseUrl . '/images/icones/minus-circle.png\" align=\"absmiddle\" /> ' . Yii::t('admin', 'INATIVO') . '"',

                'headerHtmlOptions' => array(

                    'nowrap' => 'nowrap',

                    'class' => 'ui-widget-header',

                ),

                'htmlOptions' => array(

                    'style' => 'text-align:center'),

            ),

            array(

                'name' => 'statusAtualizacao',

                'filter' => array('DESATUALIZADO' => 'DESATUALIZADO', 'ATUALIZADO' => 'ATUALIZADO', 'EM ANDAMENTO' => 'EM ANDAMENTO'),

                'htmlOptions' => array(

                    'style' => 'text-align:center'),

            ),

            array(

                'header' => 'Ações',

                'class' => 'CButtonColumn',

                'template' => '{delete}',

                'deleteButtonImageUrl' => Yii::app()->baseUrl . '/css/gridViewStyle/images/' . 'gr-delete.png',

            ),

        ),

    )); ?>

</div>



Como falei antes, dai então conseguir importar dados selecionados para a outra tabela.

Cria esse botão aqui:




echo CHtml::htmlButton('Solicitar Selecionado(s)', array(

            'type' => 'button',

            'ajax' => array(

                'type' => 'POST',

                'url' => Yii::app()->createUrl('colaborador/solicitar'),

                'dataType' => 'json',

                'beforeSend' => 'function(){

                        var id = $("input[name=\'colab-grid_c0\[\]\']:checked").serialize();

                        if(id == \'\'){

                            alert(\'Selecione pelo menos 1(um) colaborador\');                            

                            return false;

                        }

                    }',

                'success' => "function(data){alert(data);\\$.fn.yiiGridView.update('colab-grid');}",

                'data' => array(

                    'colaboradores' => 'js:decodeURIComponent($("input[name=\'colab-grid_c0\[\]\']:checked").serialize()).replace(/colab-grid_c0\[\]=/g, "").replace(/&/g, ",")')

            )

        ));




Na sua grid, coloca o id do colaborador na coluna onde está a class ‘CCheckBoxColumn’.




...

'columns' => array(

            array(

                'name' => 'idcolaborador' /*chave primaria*/

                'class' => 'CCheckBoxColumn',

                'checked' => 'false',

            ),

...



Ai no seu controller/ColaboradorController.php, tu cria uma actionSolicitar().

Ex.:




public function actionSolicitar(){

            $ids = $_POST['colaboradores'];


            print_r($ids);

}



Observa que eu coloquei um alert() em ‘success’ no botão, e para você verificar quais os dados que está indo para o actionSolicitar(), depois que você fizer isso, e estiver indo os dados correto, ai fica ao seu critério o que fazer com os dados.

Percebi que colocando esse botão ele desabilita a opção de selecionar todos de uma vez, isso é normal, pois as vezes terei uns 100 colaboradores para solitar e se for fazer isto um por um fica um pouco demorado. Quando você diz cria uma actionSolicitar() no controller, seria colocar o comando de insert pra outra tabela?

Sds,

O botão não desabilito nada, veja se na sua CGridView tem o ‘selectableRows’ => 2,, e remove esse ‘checked’ => ‘false’,.

Sobre o actionSolicitar(), será isso mesmo que você vai fazer.

Olá amigos,

Passei um tempo sem pegar neste projeto, voltei a mexer nele agora e comecei novamente a fazer o que você me indicou. Pois bem, quando coloco este botão que vc me indicou, ele bloquea os filtros da grid, não sei o que fiz de errado.




<?php

echo CHtml::htmlButton('Solicitar Selecionado(s)', array(

        	'type' => 'button',

        	'ajax' => array(

            	'type' => 'POST',

            	'url' => Yii::app()->createUrl('colaborador/solicitar'),

            	'dataType' => 'json',

            	'beforeSend' => 'function(){

                    	var id = $("input[name=\'colab-grid_c0\[\]\']:checked").serialize();

                    	if(id == \'\'){

                        	alert(\'Selecione pelo menos 1(um) colaborador\');

                        	return false;

                    	}

                	}',

            	'success' => "function(data){alert(data);\\$.fn.yiiGridView.update('colab-grid');}",

            	'data' => array(

                	'colabs' => 'js:decodeURIComponent($("input[name=\'colab-grid_c0\[\]\']:checked").serialize()).replace(/colab-grid_c0\[\]=/g, "").replace(/&/g, ",")')

        	)

    	));

?>



Outra coisa é que não tenho experiência em inserir algo em outra tabela com um Array, e mais desse caso que é com algo que esta selecionado em outra tabela.

Você pode me ajudar nisso.

Obrigado!!

Problema resolvido de outra forma, a quem desejar o exemplo do código, é só pedir que disponibilizarei.