Ir para conteúdo
leo_santo1

Como adicionar Detalhe de Linha na Datatable

Recommended Posts

Venho por meio desse post procurar ajuda com meu código!

Estou fazendo um código usando `DataTable` , sou iniciante na programação, depois de umas pesquisas e até mesmo algumas dicas conseguir construir uma DataTable com banco de dados.

Continuando minhas pesquisas para aprimorar mais ainda o código, percebi que a  `DataTable` possuir varias funções interessantes, umas delas em especifico chamou bastante minha atenção e até me ajudaria no código que no caso é o uso de Linhas filhas ocultas, que quando fazemos o click em cima de um botão aparece as informações extras da linha ( no caso os dados a mais do banco ) e ao apertar ela novamente ele oculta as informações.

Gostaria de ajuda para criar essa função na minha Tabela, já realizei pesquisas no próprio site da  `DataTable` , aqui, porem não entendo bem o jeito que eles explicam.

segue abaixo meu código da table e da  `DataTable` que conecta com o Banco.

 

Tabela

<table id="employee-grid"  cellpadding="0" cellspacing="0" border="0" class="display" width="100%">
 <thead>
<tr>
  <th>Nome</th>
  <th>CPF</th>
  <th>Data de Nascimento</th>
  <th></th>
  <th>Ação</th>
  <th></th>
</tr>
</thead>

<thead>
            <tr>

              <td><input type="text" data-column="0"  class="search-input-text" style="width: 150px;"></td>
              <th><input type="text"  data-column="1" class="search-input-text" style="width: 150px;"></td>
                <th><input type="text" id="data" data-column="2" class="search-input-text" style="width: 150px;"></th>
                <th></th>
              <td>
              </td>
              <td></td>
            </tr>
          </thead>


</table>

Script DataTable

  $(document).ready(function() {
                var dataTable = $('#employee-grid').DataTable( {
                    "processing": true,
                    "serverSide": true,
                    "bJQueryUI": true,
                "oLanguage": {
                    "sProcessing":   "Processando...",
                    "sLengthMenu":   "Mostrar _MENU_ registros",
                    "sZeroRecords":  "Não foram encontrados resultados",
                    "sInfo":         "Mostrando de _START_ até _END_ de _TOTAL_ registros",
                    "sInfoEmpty":    "Mostrando de 0 até 0 de 0 registros",
                    "sInfoFiltered": "",
                    "sInfoPostFix":  "",
                    "sSearch":       "Buscar:",
                    "sUrl":          "",
                    "oPaginate": {
                        "sFirst":    "Primeiro",
                        "sPrevious": "Anterior",
                        "sNext":     "Seguinte",
                        "sLast":     "Último"
                    }
                },
                    "ajax":{
                        url :"../Tabelas/Tabela_consulta_cliente.php", // json datasource
                        type: "post",  // method  , by default get
                        error: function(){  // error handling
                            $(".employee-grid-error").html("");
                            $("#employee-grid").append('<tbody class="employee-grid-error"><tr><th colspan="3">No data found in the server</th></tr></tbody>');
                            $("#employee-grid_processing").css("display","none");

                        }
                    }
                } );

                $("#employee-grid_filter").css("display","none");  // hiding global search box
                $('.search-input-text').on( 'keyup click', function () {   // for text boxes
                    var i =$(this).attr('data-column');  // getting column index
                    var v =$(this).val();  // getting search input value
                    dataTable.columns(i).search(v).draw();
                } );

                $('.search-input-select').on( 'change', function () {   // for select box
                    var i =$(this).attr('data-column');  
                    var v =$(this).val();  
                    dataTable.columns(i).search(v).draw();
                } );



            } );

Conexão DataTable com o Banco de dados

<?php

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "loc_equipamentos";

$conn = mysqli_connect($servername, $username, $password, $dbname) or die("Connection failed: " . mysqli_connect_error());





$requestData= $_REQUEST;


$columns = array( 

    0=>'nome_usuario', 
    1=> 'cpf_usuario',
    2=> 'data_nascimento',
    3=> 'id_usuario',
    4=> 'id_usuario',
    5=> 'id_usuario'
);




$sql = "SELECT nome_usuario, cpf_usuario, data_nascimento, id_usuario ";
$sql.=" FROM usuario";
$query=mysqli_query($conn, $sql) or die("employee-grid-data.php: get employees");
$totalData = mysqli_num_rows($query);
$totalFiltered = $totalData; .




$sql = "SELECT nome_usuario, cpf_usuario, data_nascimento, id_usuario ";
$sql.=" FROM usuario WHERE tipo_perfil = 'CLIENTE' AND ativo_usuario = 'TRUE'";


if( !empty($requestData['columns'][0]['search']['value']) ){   
    $sql.=" AND nome_usuario LIKE '".$requestData['columns'][0]['search']['value']."%' ";
}
if( !empty($requestData['columns'][1]['search']['value']) ){ 
    $sql.=" AND cpf_usuario LIKE '".$requestData['columns'][1]['search']['value']."%' ";
}
if( !empty($requestData['columns'][2]['search']['value']) ){ //age

    $sql.=" AND data_nascimento LIKE '".$requestData['columns'][2]['search']['value']."%' ";
}
$query=mysqli_query($conn, $sql) or die("employee-grid-data.php: get employees");
$totalFiltered = mysqli_num_rows($query);
$sql.=" ORDER BY ". $columns[$requestData['order'][0]['column']]."   ".$requestData['order'][0]['dir']."   LIMIT ".$requestData['start']." ,".$requestData['length']."   ";

$query=mysqli_query($conn, $sql) or die("employee-grid-data.php: get employees");



$data = array();
while( $row=mysqli_fetch_array($query) ) { 
    $nestedData=array(); 

$informacao ="<div class='botaodiv'> <a  href = ?informacao=".$row['id_usuario']." >+ Informações</a> </div>";
$editar ="<div class='botaodiv'> <a  href = ?editar=".$row['id_usuario']." >Editar</a> </div>";
$deletar ="<div class='botaodiv'> <a  href = ../Eventos/evento.php?DesativaCadastro=".$row['id_usuario']." >Excluir</a> </div>";

    $nestedData[] = $row["nome_usuario"];
    $nestedData[] = $row["cpf_usuario"];
    $nestedData[] = $row["data_nascimento"];
    $nestedData[] = $informacao;
    $nestedData[] = $editar;
    $nestedData[] = $deletar;

    $data[] = $nestedData;
}



$json_data = array(
            "draw"            => intval( $requestData['draw'] ), 
            "recordsTotal"    => intval( $totalData ), 
            "recordsFiltered" => intval( $totalFiltered ),
            "data"            => $data   
            );

echo json_encode($json_data);  



?>

Fora o caso de criar Detalhes para Linhas, Caso alguém tenha alguma sugestão de como melhorar meu código ( por exemplo uma Conexão ao Banco mais simples, um Js melhor etc.. ) ou alguma critica para eu evoluir, irei agradecer bastante!  

Compartilhar este post


Link para o post
Compartilhar em outros sites

Saudações!
O que eu posso dizer, já que sua estrutura não funcionou aqui comigo...

Sua estrutura é semelhante a esta:https://forum.imasters.com.br/topic/582946-botão-excluir-e-editar-em-um-datatable/

 

Com esta também não funcionou, mas ainda assim apareceu a paginação, total de registros, etc. Só não listou os dados. com a sua não só aparece os campos cpf, nome, data de nascimento.

Estou utilizando esta estrutura, que além de funcionar perfeitamente, me parece ser mais legível, fácil entendimento e eficiente na busca no banco de dados:

https://makitweb.com/datatables-ajax-pagination-with-search-and-sort-php/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quero compartilhar a configuração do meu

<!doctype html>
<html>
    <head>
        <title>DataTables AJAX Pagination with search and sort - PHP</title>
         <link href='datatables/css/datatables.min.css' rel='stylesheet' type='text/css'>
		<link href='datatables/css/buttons.dataTables.min.css' rel='stylesheet' type='text/css'>
		<link href='datatables/css/colReorder.dataTables.min.css' rel='stylesheet' type='text/css'>
		<link href='datatables/css/jquery.dataTables.min.css' rel='stylesheet' type='text/css'>
		 <!-- jQuery Library -->
        <script src="jquery-3.3.1.min.js"></script>
        <!-- Datatable JS -->
        <script src="datatables/js/jquery.dataTables.min.js"></script>
		<script src="datatables/js/dataTables.buttons.min.js"></script>
		<script src="datatables/js/dataTables.colReorder.min.js"></script>
		<script src="datatables/js/buttons.colVis.min.js"></script>
		<script src="datatables/js/buttons.print.min.js"></script>
        	<style>
		div.dt-buttons {
        clear: both;
    }
	</style>
    </head>
    <body >

	<button type='button' id='fechar_vendas'>Fechar</button>
	<button type='button' id='ver_produtos' name='ver_produtos2'>Ver produtos</button>
    <button type='button' id='imprimirajax'>Imprimir comanda</button>
	<button type='button' id='imprimirajax2'>Imprimir comanda R$</button>
	
        <div>
            <!-- Table -->
            <table id='empTable' class='display dataTable'>
               
                <tr>
				 <thead>
                    <th>Data</th>
                    <th>Hora</th>
                    <th>Senha</th>
                    <th>Dinheiro</th>
                    <th>Total</th>
					<th>Trouco</th>
					<th>T_PGTO</th>
					<th>Impressão</th>
					<th></th>
			    </tr>
                </thead>
                
            </table>
        </div>
     
        <!-- Script -->
        <script>
        $(document).ready(function(){
            $('#empTable').DataTable({
			"order": [[ 0, "desc" ]],
	  dom: 'Blfrtip',
	  stateSave: true,
	  buttons: [
            'copyHtml5',
            'excelHtml5',
            'csvHtml5',
            'pdfHtml5'
             ],
        buttons: ['columnsToggle', 'print',
		
            {
                extend: 'colvis',
                postfixButtons: [ 'colvisRestore' ],
            },
        ],
		 buttons: [
            {
                extend: 'print',
                exportOptions: {
                    columns: ':visible'
                }
            },
            'colvis'
        ],
		 language: {
            buttons: {
                colvis: 'Esconder / mostrar colunas',
				colvisRestore: 'Restaurar coluna(s)'
            }
        },
        columnDefs: [
            {
                targets: -1,
                visible: false
            }
        ],
    'columnDefs': [3],	 
    retrieve: true,
    "iDisplayLength": 3,
    "aaSorting": [3],
	"lengthMenu": [[3,4,10, 25, 50, -1], [3,4,10, 25, 50, "All"]],
    "lengthChange": true,
	columnDefs: [ { orderable: false, targets: [7,8] }], 
    //{ visible: false, targets: [7,8] } ],
			 "pagingType": "full_numbers",
			    'colReorder': true,
                'processing': true,
                'serverSide': true,
                'serverMethod': 'post',
                'ajax': {
                    'url':'ajaxfile.php'
                },
                'columns': [
                    { data: 'DATA_VENDA' },
                    { data: 'HORA_VENDA' },
                    { data: 'SENHA' },
                    { data: 'PAGO' },
                    { data: 'VALOR_TOTAL' },
					{ data: 'TROUCO' },
					{ data: 'TPAGAMENTO' },
					{ data: 'button' },
					{ data: 'produtos' },
                ]
            });
        });
		$.extend(true, $.fn.dataTable.defaults, {
    "language": {
        "url": "datatables/pt.json"
    }
});
        </script>
    </body>

</html>

	<script>
//Seleciona o botão
var btn = document.getElementById('fechar_vendas');

//Adiciona uma chamada quando o elemento (botão no caso) for clicado, chamando a função 'ocultar'
btn.addEventListener('click', ocultar)

//Definimos a função a ser chamada quando o botão for clicado
function ocultar(){
   var msg = document.getElementById('vendas2'); //  seleciona a div com o texto
   //msg.style.display = 'none'; // oculta a div
   //this.style.display = 'none'; // oculta o botão
    if (msg.style.display == 'none') {
            msg.style.display = 'block';
        } else {
            msg.style.display = 'none';
			 this.style.display = 'none';
        }
  
}
</script>
</script>
<!-- ABAIXO MOSTRO A DIV vendas2 SE ELA ESTIVER OCULTA-->
<script>
var visivel = false;
var objDiv = document.getElementById('vendas2');     
   if (visivel == false){
      objDiv.style.display = "block"; 
      visivel = true;             
   }else{
      objDiv.style.display = "none";
      visivel = false;         
}
</script>
<script>
$(document).ready(function() {
   //definir evento "onclick" do botão id=ver_produtos
   $("#ver_produtos").click(function() {
      //capturar o valor dos campos do fomulario
	  var cod  = $("input[name=prod]:checked").val();
	 var acao =  $(this).attr('id');
      //usar o metodo ajax da biblioteca jquery para postar os dados em ver_produtos.php
      $.ajax({
         "url": "ver_produtos.php",
         "dataType": "html",
         "data": {           
			"cod":cod,
			"acao":acao
         },
         "success": function(response) {
            //em caso de sucesso, a div ID=produtos2 recebe o response do post
            $("div#produtos2").html(response);
         }
      });
   });
});
</script>
<script>
$(document).ready(function() {
   //definir evento "onclick" do campo acao
   $("#imprimirajax").click(function() {
      //capturar o valor dos campos do fomulario
	  var CODIGO  = $("input[name=prod]:checked").val();
	 //var acao =  $(this).attr('id');
      //usar o metodo ajax da biblioteca jquery para postar os dados em ver_produtos.php
      $.ajax({
         "url": "venda.php",
         "dataType": "html",
         "data": {           
			"CODIGO":CODIGO
			//"acao":acao
         },
         //"success": function(response) {
            //em caso de sucesso, a div ID=saida recebe o response do post(div em outra página)
           // $("div#produtos2").html(response);
         //}
      });
   });
});
</script>
<script>
$(document).ready(function() {
   //definir evento "onclick" do imprimirajax2
   $("#imprimirajax2").click(function() {
      //capturar o valor dos campos do fomulario
	  var CODIGO  = $("input[name=prod]:checked").val();
	 //var acao =  $(this).attr('id');
      //usar o metodo ajax da biblioteca jquery para postar os dados em ver_produtos.php
      $.ajax({
         "url": "comanda_venda.php",
         "dataType": "html",
         "data": {           
			"CODIGO":CODIGO
			//"acao":acao
         },
         //"success": function(response) {
            //em caso de sucesso, a div ID=saida recebe o response do post
            //$("div#produtos2").html(response);
         //}
      });
   });
});
</script>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de como devo fazer.
       
      Preciso criar uma Rotina para Cadastrar Faturamento, por exemplo:
      1) 28/42/56 dias -> de 28 p/ 42 a dif. é de 14 dias...
      2) 30/60/90 dias -> de 30 p/ 60 a dif. é de 30 dias...
      3) 0/15/30/45 dias  -> de 0 p/ 15 a dif. é de 15 dias...
       
      Como devo fazer para  cadastrar os prazo de vencimento, onde o sistema possa contar as diferenças entre os dias ?
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma pequena dúvida, referente a PEGAR AUTOMATICAMENTE a HORA e alimentar o campo INPUT.
       
      Tenho uma rotina, que estava aparentemente funcionando corretamente, mas agora estou tendo problema.
       
      A rotina, pega a HORA atual e informa automaticamente o INPUT, não estou entendendo porque agora não está mais fazendo.

      Abaixo a rotina.

       
      <div class="col-lg-3"> <label for="cotaHrsinicio">Hora da Abertura<span class="required">*</span></label> <div class="controls"> <input type="time" id="cotaHrsinicio" name="cotaHrsinicio" class="form-control" style="width:100%;" value="" /> <!-- NESSE INPUT A ROTINA INFORMA A DATA ATUAL --> </div> </div>  
       
      function date_time() { var date = new Date(); //var am_pm = "AM"; var hour = date.getHours(); /* if(hour>=12){ am_pm = "PM"; } */ if (hour == 0) { hour = 12; } if(hour<12){ hour = hour - 12; } if(hour>12){ hour + 12; } if(hour<10){ hour = "0"+hour; } var minute = date.getMinutes(); if (minute<10){ minute = "0"+minute; } var sec = date.getSeconds(); if(sec<10){ sec = "0"+sec; } /* *Formato da Hora (h:m:s) * Passar para a Variável: Hora Atual */ var cotaHrsinicio = document.getElementById("cotaHrsinicio").value = hour+":"+minute; }
      Grato,
       
      Cesar

       
    • Por luiz monteiro
      Bom dia.
      Estou precisando formatar um campo de entrada type text somente para numero com a seguinte formatação.
      se menor que 999 mostrar dessa forma mesmo, nesse caso seria para centena.dezena.unidade. Tipo 001 até 009 depois 010 até 099 depois 100 até 999
      de 1.000 até 999.999  mostrar com o ponto, nesse caso seria para milhar.centena.dezena.unidade. Tipo 001.000 até 001.999 e assim por diante.
      de 1.000.000 até 9.999.000, nesse caso seria para milhão.milhar.centena.dezena.unidade. aqui mesma ideia....
      Parecidos com aqueles campos de preço, que ao digitar os zeros ficam a esquerda até o valor atingirem a unidade correspondente.
       
      Tentei adaptar esse que encontrei na net.
      function moeda(a, e, r, t) { let n = "" , h = j = 0 , u = tamanho2 = 0 , l = ajd2 = "" , o = window.Event ? t.which : t.keyCode; if (13 == o || 8 == o) return !0; if (n = String.fromCharCode(o), -1 == "0123456789".indexOf(n)) return !1; for (u = a.value.length, h = 0; h < u && ("0" == a.value.charAt(h) || a.value.charAt(h) == r); h++) ; for (l = ""; h < u; h++) -1 != "0123456789".indexOf(a.value.charAt(h)) && (l += a.value.charAt(h)); if (l += n, 0 == (u = l.length) && (a.value = ""), 1 == u && (a.value = "0" + r + "0" + l), 2 == u && (a.value = "0" + r + l), u > 2) { for (ajd2 = "", j = 0, h = u - 3; h >= 0; h--) 3 == j && (ajd2 += e, j = 0), ajd2 += l.charAt(h), j++; for (a.value = "", tamanho2 = ajd2.length, h = tamanho2 - 1; h >= 0; h--) a.value += ajd2.charAt(h); a.value += r + l.substr(u - 2, u) } return !1 } Mas sem sucesso.
       
      Grato por enquanto.
       
       
       
    • Por Giovanird
      O script abaixo atualiza a página (centro.php) a cada um minuto e dentro desta página terei uma div que não poderá ser atualizada.
      Tentei colocar esta div como pagina com setInterval de 100 minutos porem ao dar o refresh no centro.php  tudo vai junto.  Será que isto é possivel?

      Desde já meu muito obrigado!
      <script> function atualiza(){ var url = 'centro.php'; $.get(url, function(dataReturn) { $('#centro').html(dataReturn); }); } setInterval("atualiza()",60000); </script>  

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.