Carregando agora

Parâmetros do DataTables

Compartilhe:

Resumo: Veja como ordenar colunas, alterar a quantidade de itens em uma página e alterar o alinhamento no DataTables 

DataTables (https://datatables.net) é sem sombra de dúvidas uma das mais fantásticas ferramentas para exibição de tabelas dinâmicas e interativas na web. De fato, tenho apresentado diversos artigos sobre o DataTables. Aqui, apresento um passo-a-passo para configurar os parâmetros de declaração de uma tabela interativa. Para mais detalhes, acesse os nossos artigos anteriores sobre o DataTables.

Convertendo uma tabela em interativa

Note que para inicializar uma tabela com DataTables, você precisa primeiro criar a tag da tabela e dar a ela um identificador, como por exemplo, <table id="nome-da-tabela"> .

A seguir, podemos convertê-la em dinâmica usando o script:

  $('#nome-da-tabela').DataTable();

Agora, que já declaramos a tabela, podemos aplicar uma série de parâmetros para melhorar a configuração de nossa tabela. Vamos começar com coisas simples, como selecionar a coluna que desejamos ordenar.

Não se esqueça!

Lembre-se de adicionar a tag <thead> e <tbody>, além de adicionar títulos para as colunas desejadas usando <th> dentro de <thead>.

Ordenando uma coluna com DataTables

Podemos escolher qual coluna desejamos ordenar, utilizando o parâmetro order. Esse parâmetro recebe um array com dois valores: (1) a coluna que desejamos ordenar (lembre-se que a contagem começa em 0) e (2) se quer ordenar crescente (asc) ou decrescente (desc).

$('#nome-da-tabela').DataTable(
{
order:[3, 'desc']
}
);

Neste exemplo, estamos ordenando a quarta coluna de modo decrescente.

Alterando a quantidade de itens por página

Podemos alterar a quantidade de itens exibidos em uma página usando pageLength.

$('#nome-da-tabela').DataTable({
pageLength: 25,
});

Neste exemplo, alteramos a quantidade de itens exibidos para 25. Por padrão podemos usar 10, 25, 50 ou 100.

Alinhando o texto de uma coluna à direita

Podemos alinhar o texto de uma coluna à direita usando o parâmetro columnDefs. Note que podemos usar esse parâmetro para aplicar uma classe ao texto da coluna. Veja:

$('#nome-da-tabela').DataTable({
columnDefs: [
{
targets: [1,2,3],
className: 'dt-body-right'
}
],
});

Neste caso, estamos alinhando a segunda, terceira e quarta coluna à direita (aplicando a classe dt-body-right).

Centralizando texto de uma coluna

Note que podemos ainda centralizar o texto usando o mesmo método, mas, neste caso, aplicando a classe dt-body-center. Veja:

$('#nome-da-tabela').DataTable({
columnDefs: [
{
targets: 0,
className: 'dt-body-center'
}
],
});

Aqui estamos centralizando apenas o texto da primeira coluna (lembre-se mais uma vez: a contagem começa em 0).

Alterando a linguagem para português

Para alterar a linguagem da interface padrão de uma tabela use o parâmetro language:

$('#nome-da-tabela').DataTable({
language: {
url: frontend + "/data/datatables_br.json"
},
});

Note que você precisará do arquivo JSON com o dicionário de tradução. Você pode encontrá-lo aqui.

Apagando uma tabela

Você pode apagar uma tabela usando destroy() . Apagar tabelas são importantes, por exemplo, caso deseje alterar o valor de uma tabela já carregada anteriormente sem a necessidade de atualizar a página (via Ajax por exemplo). No exemplo a seguir, faremos isso por meio de um botão:

var tabela = $('#minha-tabela').DataTable();
$('#botao-apaga-tabela').on( 'click', function () {
tabela.destroy();
} );

Alterando os dados

Agora faremos algo mais avançado. Digamos que você deseja alterar os dados durante o carregamento da tabela. Você pode fazer isso usando o parâmetro data .

Por exemplo, digamos que nos seus dados você tenha o campo “id”. Em vez de exibir apenas o ID, você deseja que seja exibido um link para uma página que utilize o ID como identificador. Você pode fazer isso aplicando o método map ao objeto que armazena o array de dados. Veja:

let dados = [
[1, 'um'],
[2, 'dois'],
[3, 'tres']
]; //array com dados que serão exibidos na tabela
$('#nome-da-tabela').DataTable({
data: dados.map(i=>{
return [
`<a 
target='_blank' 
href='http://site_exemplo.com/${i[0]}'
>${i[0]}</a>`, // primeira coluna
i[1]  // segunda coluna
]; 
})
});

Listando todos os itens de uma tabela

Por padrão, DataTables permite que você exiba 10, 25, 50 ou 100 itens. Entretanto, podemos alterar esses valores usando lengthMenu . Veja como:

// tabela interativa
let tabela  = $('#minha-tabela').DataTable({
// configurações do datatables *****
pageLength: 25,
"lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "Tudo"]], // permite listar todos os itens
})

Sua tabela agora irá exibir as seguinte opções:

A propriedade pageLength define a quantidade inicial de itens exibida.

Note que, por padrão, você verá a seguinte mensagem:

Exibir 25 resultados por página.

Executar uma função depois que a tabela for carregada

Algumas vezes você pode precisar executar uma função depois que a tabela for carregada. Se você tentar fazer uma modificação na tabela fora do escopo do DataTables, via jQuery por exemplo, isso não irá funcionar. Assim, para executar funções depois que a tabela for carregada, precisamos usar a propriedade drawCallback .

Por exemplo, digamos que desejemos alterar o campo “buscar”. Observe como podemos fazer isso no DataTables com a propriedade drawCallback:

// tabela interativa
let tabela  = $('#minha-tabela').DataTable({
// configurações do datatables *****
"drawCallback":()=>{ // depois que a tabela for carregada
$('#licitantes_filter').html('<label><small>Buscar por CNPJ ou razão social:</small><input type="search" class="" placeholder="" aria-controls="licitantes"></label>');
}
}) //$('#licitantes').DataTable({

Isso fará com que o campo busca apareça assim:

IMPORTANTE: após testes, percebi que alterar o campo de busca causa erros ao usar essa funcionalidade. Vou deixar esse código aqui apenas como ilustração de como usar o drawCallback, mas não faça isso em um exemplo real.

Processamento via server-side com Ajax

Por padrão, DataTableas aplica paginação via front-end. Entretanto, algumas vezes podemos ter a necessidade de exibir tabelas gigantescas (requisições maiores do que 10 MB já são consideradas grandes). Muitas vezes é inviável esperar o carregamento desses dados antes de exibi-los, podemos implementar uma paginação via back-end. Nesse caso, o processo de paginação é mais complexo, mas você ganha bastante em performance.

Em Datatables, podemos fazer isso usando a propriedade ajax combinada com as propriedades serverSide e processing . Note que ajax recebe como entrada uma função com dois parâmetros. O primeiro deles armazena os valores atuais: e o segundo é uma função de callback que deverá ser chamada para atualizar a tabela.

Observe o que tem nesse objeto d :

Caso deseje alterar os valores da tabela, chame a função cb passando como argumento essas propriedades acima alteradas. Por exemplo, para mudar para a página 2, mande como valor da propriedade d.start = 26 (note que length está valendo 25, logo são 25 itens por página, então a página 2 deve começar em 26). Você verá um exemplo prático a seguir.

No exemplo a seguir faremos a implementação de uma tabela interativa que pega dados do back-end usando fetch API. Há muitas formas de fazer isso, como por exemplo, usando PHP. Entretanto, faremos usando apenas JavaScript por uma escolha pessoal.

Note que para funcionar, você precisará da aplicação back-end funcionando e pelo menos dois endpoints: (1) retorna os dados requisitados e (2) retorna a quantidade de itens.

Neste exemplo, os endpoints realizam requisições via GET e podem receber parâmetros como nome, ordem, busca, cnpj (se trata da uma busca por empresas). Nossa API está armazenada na variável backend (não vamos exibi-la aqui, mas imagine que é algo como http://localhost:8000 ou https://site-exemplo.com). Há ainda algumas funções e classes presentes que não tem utilidade para compreender o funcionamento do código, por isso, detalhes foram ocultados (como formata_cnpj).

Observe como podemos implementar paginação via back-end:

// cabeçalho -------------------------------------------------------------------------
async function total_itens(busca=''){
// retorna a quantidade de itens (importante para o datatables)
let url = backend + '/api/quantidade/listar?itens=true'
if((busca != '')&&(busca.length >= 2)){
// não ativo se campo busca rápida estiver com menos do que 2 caracteres
if(eh_numero(busca.slice(0,1))){
url += '&cnpj='+limpa_cnpj(busca);
}
else{
url += '&nome='+busca.toUpperCase();
}
}
return await fetch(url).then(response => response.json())
}
// FIM cabeçalho ----------------------------------------------------------------------
async function lista_itens(itens=25, inicio=0, ordenar_por='nome',ordem='desc',busca=''){
// função que recebe os dados da API
const pagina = parseInt(inicio / itens)
let url = backend + '/api/listar?'+
'pagina='+pagina+
'&itens='+itens+
'&ordenar_por='+ordenar_por+
'&ordem='+ordem;
if((busca != '')&&(busca.length >= 2)){
// não ativo se campo busca rápida estiver com menos do que 2 caracteres
if(eh_numero(busca.slice(0,1))){
url += '&cnpj='+limpa_cnpj(busca);
}
else{
url += '&nome='+busca.toUpperCase();
}
}
// console.log(url)
return await fetch(url)
.then(response => response.json())
}
// tabela interativa
let tabela  = $('#itens').DataTable({
// configurações do datatables *****
serverSide: true,
processing: true,
pageLength: 25,
"lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "Tudo"]],
language: { url: frontend + "/data/datatables_br.json" },
columnDefs: [
{ targets: [2],    className: 'text-center' },
{ targets: [3, 4], className: 'dt-body-right' },
{ targets: [0],    className: 'w130px' }
],
order: [4, 'desc'], // ordena por alarme => desc
"drawCallback":()=>{ // depois que a tabela for carregada
$('#itens_filter').html('<label><small>Buscar por CNPJ ou razão social:</small><input type="search" class="" placeholder="" aria-controls="licitantes"></label>');
},
// requisições assíncronas via ajax + fetch API
ajax: function(d, cb){
// d => recebe os dados atuais do datatables (página atual, ordem, etc.)
// cb => função de callback (deve ser chamada pra atualizar a página)
let inicio = d.start;
let itens = d.length; 
if(itens == -1){ itens = 10 } 
let ordem = d.order[0].dir;
let ordenar_por = d.order[0].column;
ordenar_por = ordenar_por == 0 ? 'cnpj' :
ordenar_por == 1 ? 'nome_empresa' : 'nome_empresa' // default
let busca = d.search.value;
// console.log(d)  
total_itens().then(total => {
lista_itens(itens, inicio, ordenar_por, ordem, busca)
.then(dados => { 
return cb({
recordsTotal:total, 
recordsFiltered: total,//(busca != '') ? total : itens, 
start: inicio,
length: itens,
data:dados.map(
i=>{
return [
// colunas são exibidas aqui
i.id, // id 
i.cnpj, //  cnpj
i.nome_empresa // nome da empresa 
]
}
)
}) 
});
});
}
}) //$('#itens').DataTable({

URL Original da postagem: Read More

Compartilhe:

Deixe uma resposta

Postagens

Charles Corrêa Blog