Datatables displays error while trying to load json file

0

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">&times;</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 );
    }
}
    
asked by anonymous 06.09.2018 / 21:58

1 answer

0

I've already had this problem and I'm not too sure which option is right because it's been a while since I think it's the serverSide or destroy property. Try some of these options below:

"processing": true,
"serverSide": true,
"pageLength": 5,
"searching":false,
"destroy": true,
    
06.09.2018 / 22:40