Can anyone help me? I already researched several themes here in the OS but I still could not solve my problem.
I made a query to the database via ajax to check the available schedules of some classrooms. I generated a JSON file from the result of this query and, through DataTables, I display the data.
So far so good. When I try to make a second query, DataTables displays an error saying that the table has already been initialized.
Below is my code:
$("#formViewDisponib").validate({
unkeyup: false,
// Define as regras
submitHandler: function( form ){
var dados = $( form ).serialize();
$.ajax({
type: "POST",
url: $( form ).attr('action'), // "qryDisponib.php",
data: dados,
dataType: "json",
success: function( data ){ // Executa a função se a requisição funcionar
var msgFinal = data.msgFinal;
var table = $('#tbDisponib').DataTable({
language:{
"sEmptyTable": "Nenhum registro encontrado",
"sInfo": "Mostrando de _START_ até _END_ de _TOTAL_ registros",
"sInfoEmpty": "Mostrando 0 até 0 de 0 registros",
"sInfoFiltered": "(Filtrados de _MAX_ registros)",
"sInfoPostFix": "",
"sInfoThousands": ".",
"sLengthMenu": "_MENU_ resultados por página",
"sLoadingRecords": "Carregando...",
"sProcessing": "Processando...",
"sZeroRecords": "Nenhum registro encontrado",
"sSearch": "Pesquisar",
"oPaginate": {
"sNext": "Próximo",
"sPrevious": "Anterior",
"sFirst": "Primeiro",
"sLast": "Último"
},
"oAria": {
"sSortAscending": ": Ordenar colunas de forma ascendente",
"sSortDescending": ": Ordenar colunas de forma descendente"
}
},
scrollY: "200px",
scrollX: true,
scrollCollapse: true,
searching: false,
ordering: false,
paging: false,
fixedColumns: {
leftColumns: 2
},
"ajax" : "tabela.json"
});
//$('#resultViewDisponib').html(msgFinal);
$('#resultViewDisponib').show('slow');
},
beforeSend: function(){ // Executa a função assim que a requisição for enviada
$('#loadViewDisponib').css({display:"block"});
},
complete: function(){ // Executa a função sempre que a requisição for executada
$('#loadViewDisponib').css({display:"none"});
},
error: function(){
bootbox.alert("Falha de Conexão!<br />Não foi possível efetuar sua requisição.<br/>Aguarde alguns instantes e faça uma nova tentativa.");
}
});
return false;
}
});
HTML:
<div class="modal fade" id="cxViewDisponib" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title text-left" id="myModalLabel">Disponibilidade de horários</h4>
</div>
<div class="modal-body">
<form class="form-inline" role="formViewDisponib" id="formViewDisponib" name="formViewDisponib" method="POST" action="qryDisponib.php">
<fieldset>
<div class="form-group">
<label for="mesRef" class="control-label">Mês</label><br />
<select name="mesRef" class="form-control selectpicker show-menu-arrow show-tick" data-width="auto">
<optgroup label="Selecione o mês desejado">
<?php
for($i=0; $i<sizeof($nomemeses); $i++){
echo "<option value='".str_pad(($i+1),2,'0',STR_PAD_LEFT)."'";
if(($i+1)==$mesRef){
echo " SELECTED";
}
echo ">".$nomemeses[$i]."</option>";
}
?>
</optgroup>
</select>
</div>
<div class="form-group">
<label for="anoRef" class="control-label">Ano</label><br />
<select name="anoRef" class="form-control selectpicker show-menu-arrow show-tick" data-width="auto">
<optgroup label="Selecione o ano desejado">
<?php
for($listano=(date('Y')-3);($listano >= (date('Y')-3) && $listano <= (date('Y')+10));$listano++){
echo "<option value='".$listano."'";
if($listano==$anoRef){
echo " SELECTED";
}
echo ">" . $listano . "</option>";
}
?>
</optgroup>
</select>
</div>
<div class="form-actions">
<button type="submit" name="enviar" value="enviar" class="btn btn-primary btn-large pull-left">Pesquisar</button>
</div>
</fieldset>
</form>
<div class="row">
<div class="col-md-12">
<div id="loadViewDisponib"><img src="Imagens/ajax-loader.gif" /></div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<table class='display' id='tbDisponib'>
<thead>
<tr>
<th rowspan='3' class='text-center t_hCol'>Dia</th>
<th rowspan='3' class='text-center t_hCol'>Semana</th>
</tr>
<tr>
<?php
$vez = 0;
foreach( $_SESSION["horario_operacao"] as $interv_horario ){
if( ( $vez++ % 2 ) > 0 ){
echo "<th class='text-center info' colspan='" . count( $_SESSION['tabEspacos'] ) . "'>" . $interv_horario . "</th>";
}else{
echo "<th class='text-center warning' colspan='" . count( $_SESSION['tabEspacos'] ) . "'>" . $interv_horario . "</th>";
}
}
echo "</tr><tr>";
for( $y=0; $y<=count( $_SESSION["horario_operacao"] )-1; $y++ ){
foreach( $_SESSION['tabEspacos'] as $chave => $valor ){
echo "<th class='text-center t_hCol'>" . trim( $_SESSION['tabEspacos'][$chave]['NOME'] ) . "</th>";
}
}
echo "</tr>";
?>
</thead>
<tfoot>
<tr>
<th rowspan='3' class='text-center t_hCol'>Dia</th>
<th rowspan='3' class='text-center t_hCol'>Semana</th>
</tr>
<tr>
<?php
for( $y=0; $y<=count( $_SESSION["horario_operacao"] )-1; $y++ ){
foreach( $_SESSION['tabEspacos'] as $chave => $valor ){
echo "<th class='text-center t_hCol'>" . trim( $_SESSION['tabEspacos'][$chave]['NOME'] ) . "</th>";
}
}
echo "</tr><tr>";
$vez = 0;
foreach( $_SESSION["horario_operacao"] as $interv_horario ){
if( ( $vez++ % 2 ) > 0 ){
echo "<th class='text-center info' colspan='" . count( $_SESSION['tabEspacos'] ) . "'>" . $interv_horario . "</th>";
}else{
echo "<th class='text-center warning' colspan='" . count( $_SESSION['tabEspacos'] ) . "'>" . $interv_horario . "</th>";
}
}
echo "</tr>";
?>
</tfoot>
</table>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Fechar</button>
</div>
</div>
</div>
</div>
and PHP:
if( !isset( $_SESSION["userlogado"] ) || !( $_SESSION["userlogado"]=="SIM" ) ){
print "<script>location.href='logout.php';</script>";
exit;
}
include "conexao.php";
//include "autentic.php";
if( $_SERVER['REQUEST_METHOD']=='POST' ){
// recuperar os dados do form
$mesPesq = getPost('mesRef');
$anoPesq = getPost('anoRef');
if( !( $mesPesq==null ) && !( $anoPesq==null ) ){
$mesano = $mesPesq . "/" . $anoPesq;
$stCancel = "N";
// Recuperar as reservas de todos os locais do mês/ano solicitado
$vetReservasAtivas = array();
$strsql = "SELECT ID,IDESPACO,IDAREA,CALEND,DATAHORAI,DATAHORAF,";
$strsql .= "TOTMINUTOS,STATUS,REFERENCIA FROM reservas ";
$strsql .= "WHERE ( REFERENCIA=:mesano AND STATUS=:stCancel ) ORDER BY CALEND,IDESPACO,DATAHORAI";
$stmt_reservas_ativas = $cnxBanco->prepare( $strsql );
$stmt_reservas_ativas->bindParam( ':mesano',$mesano );
$stmt_reservas_ativas->bindParam( ':stCancel',$stCancel );
$stmt_reservas_ativas->execute();
if( $stmt_reservas_ativas->rowCount()>0 ){
// popular o array com a consulta
while( $regReservasAtivas = $stmt_reservas_ativas->fetch(PDO::FETCH_ASSOC) ){
$vetReservasAtivas[] = $regReservasAtivas;
}
// popular o array e gravar o arquivo JSON
// com a querie solicitada
$dth_corrente = new DateTime( $anoPesq . '-' . $mesPesq . '-' . '01' );
$dth_final = new DateTime( $anoPesq . '-' . $mesPesq . '-' . $dth_corrente->format('t') );
$numero_salas = count( $_SESSION['tabEspacos'] );
$sala_atual = 1;
$contador = 0;
$dados = $linha = array();
// preparar o corpo da table
while( $dth_corrente<=$dth_final ){
// extrair do array de reservas a data pesquisada
// verificar cada horário de operação das salas
$linha[] = $dth_corrente->format('d/m');
$linha[] = $dth_corrente->format('D');
foreach( $_SESSION["horario_operacao"] as $hourOperacao ){
$dth_avaliadai = $dth_corrente->format('Y-m-d') . ' ' . substr( $hourOperacao,0,5 ) . ':00';
$dth_avaliadaf = $dth_corrente->format('Y-m-d') . ' ' . substr( $hourOperacao,6,5 ) . ':00';
foreach( $_SESSION['tabEspacos'] as $chave1 => $valor1 ){
$statDisp = "vago";
$local_corrente = $_SESSION['tabEspacos'][$chave1]['ID'];
foreach( $vetReservasAtivas as $chave2 => $valor2 ){
if( $vetReservasAtivas[$chave2]['CALEND']==$dth_corrente->format('Y-m-d') && $vetReservasAtivas[$chave2]['IDESPACO']==$local_corrente ){
if( !faixaSobrepoeIntervaloAberto( $dth_avaliadai,$dth_avaliadaf,$vetReservasAtivas[$chave2]['DATAHORAI'],$vetReservasAtivas[$chave2]['DATAHORAF'] ) &&
!faixaSobrepoeIntervaloFechado( $dth_avaliadai,$dth_avaliadaf,$vetReservasAtivas[$chave2]['DATAHORAI'],$vetReservasAtivas[$chave2]['DATAHORAF'] ) ){
$statDisp = "ocupado";
break;
}
}
}
$linha[] = ( $statDisp=="ocupado" ) ? " X " : " ";
}
}
$dados[] = $linha;
$linha = array(); // reiniciar o array;
$dth_corrente->add(new DateInterval('P1D'));
}
//echo "<pre>";
//echo print_r( $dados );
//echo "</pre>";
$msgFinal = "";
// gerar o arquivo json
// Adiciona o identificador "Contatos" aos dados
$dados_identificador = array('data' => $dados);
// Tranforma o array $dados_identificador em JSON
$dados_json = json_encode($dados_identificador);
if( file_exists( "tabela.json" ))
unlink( "tabela.json" );
// Abre ou cria o arquivo contato.json
// "a" indicar que o arquivo é aberto para ser escrito
$fp = fopen("tabela.json", "a");
// Escreve o conteúdo JSON no arquivo
$escreve = fwrite($fp, $dados_json);
// Fecha o arquivo
fclose($fp);
}else{
$msgFinal = "<b>Você deve informar os dados solicitados para a pesquisa.</b>";
}
}else{
$msgFinal = "<b>Você deve informar os dados solicitados para a pesquisa.</b>";
}
$vetFinal = array( "msgFinal" => $msgFinal );
echo json_encode( $vetFinal );
}
}