Ir para o conteúdo

 Voltar a Fórum do For...
Tela cheia

Marcar "n" itens do grid

1 de Dezembro de 2014, 16:36 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 87 vezes

Prezados,

 

Criei um grid em que o usuário deverá selecionar um ou mais de um checkbox e depois clicar no botão "Alterar Dados". Todas as informações "checadas" devem ser alteradas/incluídas na base de dados.

Estou usando o evento "onChange" relacionado ao addCheckColumn. Entretanto, não sei como fazer para armazenar os dados quando ocorrer seleção de mais de um item, habilitar o botão "alterar dados" e  proceder com as alterações no banco. Vide mais detalhes abaixo:

 

Arquivo "cadastro.php"

define('REQUIRED_FIELD_MARK', '*'); // alterar a identificaзгo dos campos obrigatуrios para * vermelho

$frm = new TForm('Cadastro de Registro de Material', 550,780);
echo $frm->getCurrentContainer();
$frm->addHiddenField('pk_cod_registro');
$frm->setColumns(120); // define a primeira coluna do formulбrio para 60 px
$pc = $frm->addPageControl('pc', null, null, null, 'abaClick()');
//Aba - CADASTRO
...
//Aba - PESQUISA
$page = $pc->addPage('Pesquisa - RM', FALSE, TRUE, 'abaPesquisa');
    $page->setColumns(100); // define a primeira coluna do formulбrio da aba para 80 px
    // o atributo noclear evita que a funзгo fwClearFields limpe o campo
    $frm->addTextField('pesquisaRM','Registro de Material:',50,false)->setAttribute('noclear','true')->setTooltip('Pesquisar - Informe o nome ou parte do nome e clique no botão Pesquisar!');
    $frm->addButton('Pesquisar',null,'btnPesquisar','atualizarGride()',null,false,false);
    $frm->addButton('Transferir RM',null,'btnTransferir',null,null,false,false)->setEnabled(FALSE);
    $frm->addHtmlField('html_gride');
$frm->closeGroup();
$frm->processAction();
$frm->show();

 

Arquivo "criar_gride"

<?php
$pesquisaRM = '';
if ($_POST['pesquisaRM']) {
    $pesquisaRM = $_POST['pesquisaRM'];
}

$dados = Tb_registroDAO::selecionar($pesquisaRM);
$g = new TGrid('gd', 'Materiais', $dados, NULL, NULL, 'pk_cod_registro');
$g->addColumn('txt_registro', 'Registro', 200, 'left');
$g->addColumn('txt_descriminacao', 'Descrimina&ccedil;&atilde;o', 400, 'left');
$g->addColumn('txt_nome', 'Setor', 300, 'left');
$g->addCheckColumn('alteraRM', 'Selecionar', 'pk_cod_registro', NULL, FALSE, FALSE)->addEvent('onChange', 'selecionaRM(this)');
$g->addButton('Alterar', NULL, 'btnAlterar', 'grideAlterar()', NULL, 'editar.gif', NULL, 'Alterar registro de material');
$g->show();
?>

<script>
    function selecionaRM(rm) {
        var sn = rm.checked ? 'S' : 'N';       
    }
</script>

 

 

Obrigada deste já pela ajuda,

Aline.

Autor: Paiva Macena


66 comentários

  • 51b06d6eae66e2cfdfc361d418eea715?only path=false&size=50&d=404Luis Eugênio barbosa(usuário não autenticado)
    1 de Dezembro de 2014, 19:42

     

    Aline,

    quando existe uma coluna do tipo checkbox no gride, qualquer ação executado, todos os checks marcados são postados para o formulário automaticamente. No seu exemplo será postado o array $_POST['alteraRM'] com os valores da coluna PK_COD_REGISTRO de sua tabela.

    O que observei no seu codigo é que você definiu para a classe TGrid a chave primaria da tabela em caixa baixa e deve ser sempre em caixa alta:

    $g = new TGrid('gd', 'Materiais', $dados, NULL, NULL, 'PK_COD_REGISTRO');

    Abraço.

    • 0bff3f2dc09b5e88a47cb2a7528e767a?only path=false&size=50&d=404Paiva Macena(usuário não autenticado)
      8 de Dezembro de 2014, 12:40

       

      Luiz Eugênio,

       

      Consegui obter os itens "checados" da seguinte forma:

      1- Criei um botão ajax no arquivo Cadastro.php:

      $frm->addButtonAjax('Alterar',NULL,NULL,NULL,'AlterarDados',Alterar dados...','json',false,null,'btnAlterar','Deseja alterar?',false,false);

       

      2- Criei o arquivo AlterarDados.php com o seguinte código:

      $dado = '';
      $dado = $_POST['alteraRM'];

      //caminhando pelas linhas do Grid que foram selecionadas
      for ($i = 0; $i < count($dado); $i++) {
          $reg[$i] = Tb_registro_material_rmaDAO::selecionarDado($dado[$i]); 
      }

       

      Obrigada pela dica. Gostaria de aproveitar a oportunidade e tirar só uma dúvida ainda quanto ao campo checkbox: Há possibilidade de quando o usuário clicar no checkbox que um SelectField seja exibido ao lado de outro campo do grid para que o usuário possa alterar uma informação?

       

      Caso positivo, como posso fazer a modificação no código abaixo para que quando o checkbox seja selecionado acrescente um SelectColumn em outro campo (e não ao lado do checkbox)?

      <?php

      $pesquisaRM = '';
      if ($_POST['pesquisaRM']) {
          $pesquisaRM = $_POST['pesquisaRM'];
      }

      $dados = Tb_registro_material_rmaDAO::selecionarRegistro($pesquisaRM);
      $g = new TGrid('gd', 'Materiais', $dados, NULL, NULL, 'PK_COD_REGISTRO');
      $g->addColumn('txt_registro', 'Registro', 200, 'left');
      $g->addColumn('txt_descriminacao', 'Descrimina&ccedil;&atilde;o', 400, 'left');
      $g->addColumn('txt_nome', 'Setor', 300, 'left');
      $g->addCheckColumn('alteraRM', 'Selecionar', 'PK_COD_REGISTRO_MATERIAL_RMA', NULL, FALSE, TRUE)->addEvent('onClick','chkClic()');
      $g->addButton('Alterar', NULL, 'btnAlterar', 'grideAlterar()', NULL, 'editar.gif', NULL, 'Alterar registro');
      $g->show();

      ?>

      <script>
          function chkClic(e, linha)
      {
          // criar o campo texto
          if( jQuery(e).is(':checked') )
          {
              jQuery(e).parent().append('<input class="fwField" style="border:1px solid #c0c0c0" id="'+e.id+'_texto" type="text" size="30" value="">');
          }
          else // remover o campo texto
          {
              jQuery("#"+e.id+'_texto').remove();
          }
      }

       

      OBS.: o SelectColumn deverá ter um comportamento semelhando a outro ponto do código conforme trecho a seguir e exibido ao lado do coluna "txt_nome" do grid:

      $frm->addSelectField('fk_cod', 'Setor: ', TRUE, Tb_DAO::selectSetorAtivo('TXT_NOME'), null, null, null, null, null, 200, '-- Selecione um grupo --');

       

       

      Obrigada,

      Aline.

      • 51b06d6eae66e2cfdfc361d418eea715?only path=false&size=50&d=404Luis Eugênio barbosa(usuário não autenticado)
        9 de Dezembro de 2014, 0:35

         

        Aline,

        se entendi o que você quer fazer, você deverá criar a coluna select na posição que desejar e utilizar o evento onDrawCell do gride para esconder todos os combobox criados pela coluna addSelectColumn e no evento onClick do checkbox você exibe ou esconde os mesmos.

        Código de exemplo:

        <?php
        $frm = new TForm('Exemplo Gride DrawCell',300,500);

        // simulação de dados para o gride
        $dados = null;
        $dados['ID_TABELA'][] = 1;
        $dados['NM_TABELA'][] = 'Linha1';
        $dados['ST_TABELA'][] = 'S';
        $dados['SIT_OPCOES'][] = '1=>Um,2=>Dois';

        $dados['ID_TABELA'][] = 2;
        $dados['NM_TABELA'][] = 'Linha2';
        $dados['ST_TABELA'][] = 'S';
        $dados['SIT_OPCOES'][] = '3=Tres,4=>Quatro';

        $gride = new TGrid( 'gdTeste' // id do gride
                            ,'Título do Gride' // titulo do gride
                            ,$dados     // array de dados
                            ,null        // altura do gride
                            ,null        // largura do gride
                            ,'ID_TABELA'// chave primaria
                            );

        $gride->addCheckColumn('st_tabela','Selecione','ST_TABELA','NM_TABELA')->setEvent('onClick','chkClic()');
        $gride->addColumn('nm_tabela','Nome',100,'left');
        $gride->addSelectColumn('sit_opcoes' ,'Opções','SIT_OPCOES','1=Amarelo,2=Verde');

        // função de callback da criação das celulas
        $gride->setOnDrawCell('gdAoDesenharCelula');

        // campo html para exibir o gride
        $frm->addHtmlField('gride',$gride);

        // exibir o formulário
        $frm->show();

        function gdAoDesenharCelula($rowNum,$cell,$objColumn,$aData,$edit)
        {
            if( $objColumn->getFieldName() == 'SIT_OPCOES')
            {
                $edit->setVisible( false );
            }

        }
        ?>
        <script>
        function chkClic(e, linha)
        {
            // mostrar o campo select
            if( jQuery(e).is(':checked') )
            {
                jQuery("#sit_opcoes_"+linha).show();
            }
            else // esconder o campo select
            {
                jQuery("#sit_opcoes_"+linha).hide();

            }
        }
        </script>

        Abraço.

        • 0bff3f2dc09b5e88a47cb2a7528e767a?only path=false&size=50&d=404Paiva Macena(usuário não autenticado)
          15 de Dezembro de 2014, 9:50

           

          Luiz,

          É possível habilitar o botão alterar somente quando o checkbox está desabilitado? estou tentando usar o mesmo princípio que vc passou no exemplo acima, porém não está dando certo.

           

           

          Obrigada,

          Aline.

          • 51b06d6eae66e2cfdfc361d418eea715?only path=false&size=50&d=404Luis Eugênio barbosa(usuário não autenticado)
            16 de Dezembro de 2014, 22:46

             

            Aline,

            é possível sim, no evento click do checkbox e com jQuery você pode fazer o que quiser no formulário.

            Veja o script abaixo um exemplo. No caso eu estou escondendo o botão alterar porque o atributo disabled não funciona na imagem, ai você teria que tratar isso na função grideAlterar que, no caso, está sendo executado ao clicar no botão alterar.

            function chkClic(e, linha)
            {
                // mostrar o campo select
                if( jQuery(e).is(':checked') )
                {
                    jQuery("#sit_opcoes_"+linha).show();

                    // mostrar o botão alterar da linha
                    jQuery("#gdteste_td_"+linha+" img").show(); // se tiver utilizando imagem
                    //jQuery("#gdteste_td_"+linha+" button").show(); // se não estiver utilizando imagem
                }
                else // esconder o botao alterar e o  campo select
                {
                    jQuery("#sit_opcoes_"+linha).hide();
                    jQuery("#gdteste_td_"+linha+" img").hide(); // se tiver utilizando imagem
                    //jQuery("#gdteste_td_"+linha+" button").hide(); // se não tiver utilizando imagem
                }
            }

            function grideAlterar(fields, values, idGride, linha)
            {
                alert( 'Alterar...');
            }

            // esconder todos os botoes alterar ao iniciar o formulário
            jQuery("[name=btnAlterar]").each(
              function()
              {
                  jQuery(this).hide();
              }
            )

             Abraço.

            • 0bff3f2dc09b5e88a47cb2a7528e767a?only path=false&size=50&d=404Paiva Macena(usuário não autenticado)
              17 de Dezembro de 2014, 15:42

               

              Luiz,

               

              Optei efetuar a ação no momento em que ocorre o click no checkbox. Ficou perfeito.

               

              Obrigada pela ajuda,

              Aline.

Essa comunidade não possui posts nesse blog