Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jorge Gomess

Utilizar vários datapickers em uma tabela carregada com ajax

Recommended Posts

Boa noite!

É o seguinte, a princípio, estou carregando uma tabela com dados mysql via ajax:

function fetch_data() {
                $.ajax({
                    url: "docentes/select.php",
                    method: "POST",
                    success: function (data) {
                        $('#live_data').html(data);
                    }
                });
            }

E em seguida faço manipulações para atualizar os dados, com isso, tudo certo. Entretanto, existe um campo da tabela que é para data, resolvi utilizar o Datepicker para deixar o campo mais elegante com a utilização de um calendário, se deparei com um problema ao utilizar vários Datepickers na mesma página, entretanto, designei uma ID única para cada input e uma classe igual para todos os inputs, classe a qual serviria de seletor para chamar a função datepicker, só que outro problema surge nessa jornada, este acontece por não estar executando a chamada da função datepicker, contudo, o seletor está correto, tem o mesmo identificador que o das classes dos inputs, não compreendo o por quê desse problema, por favor, peço vossa ajuda para a solução de meu problema, seguem códigos logo abaixo:

$(document).ready(function(){
        $(".datepicker").datepicker({
            dateFormat: "dd/mm/yy"
        });
  )};

Já tentei pôr eventos no input do DatePicker:

<div class="input-group">
   <input type="text" id="date_'.$inc.'" class="form-control datepicker" onmouseover="acionaDatePicker(\'#date_'.$inc.'\')" 
                    data-id="' . $Docente['id'] . '" data-before="' . $date . '" value="'.$date.'"/>
</div>

e no javascript:

function acionaDatePicker(seletor){
            $(seletor).datepicker({
                dateFormat: "dd/mm/yy"
            });
}

É como se não executasse o código do javascript nos dois casos.

Arquivos:

Código gerador de tabela com informações do banco, mais tarde será carregada com auxilio do ajax via POST na div de id = "live_data":

<?php
require('../../dts/dbaSis.php');
$readDocentes = read('docentes', 'ORDER BY admissao DESC');
$output = '
<table class="table table-bordered">
    <thead>
        <tr>
            <th>NOME</th>
            <th>SOBRENOME</th>
            <th>E-MAIL</th>
            <th>CURSO</th>
            <th>CENTRO DE REFERÊNCIA</th>
            <th>ADMISSÃO</th>
            <th>AÇÃO</th>
        </tr>
    </thead>
';
if (count($readDocentes) > 0) {
    $output .= '<tbody>';
    $inc = 0;
    foreach ($readDocentes as $Docente) :
        $output .= '
        <tr>
            <td class="nome" data-id="' . $Docente['id'] . '" data-before="' . $Docente['nome'] . '" contenteditable>' . $Docente['nome'] . '</td>
            <td class="sobrenome" data-id="' . $Docente['id'] . '" data-before="' . $Docente['sobrenome'] . '" contenteditable>' . $Docente['sobrenome'] . '</td>
            <td class="email" data-id="' . $Docente['id'] . '" data-before="' . $Docente['email'] . '" contenteditable>' . $Docente['email'] . '</td>
            <td class="curso" data-id="' . $Docente['id'] . '" data-before="' . $Docente['curso'] . '" contenteditable>' . $Docente['curso'] . '</td>
            <td>
                <select class="centro form-control" data-id="' . $Docente['id'] . '" data-before="' . $Docente['centro_ref'] . '">
                    <option></option>';
        $readCentro = read('centros_ref', '');
        if ($readCentro) {
            foreach ($readCentro as $Centro):
                if ($Centro['id'] == $Docente['centro_ref']) {
                    $output .= '<option value="' . $Centro['id'] . '" selected="selected">' . $Centro['nome'] . '</option>';
                } else {
                    $output .= '<option value="' . $Centro['id'] . '">' . $Centro['nome'] . '</option>';
                }
            endforeach;
        }
        $date = date('d/m/Y', strtotime($Docente['admissao']));
        $output .= '</select>
            </td>
            <td class="date">
                <div class="input-group">
                    <input type="text" id="date_'.$inc.'" class="form-control datepicker" onmouseover="acionaDatePicker(\'#date_'.$inc.'\')" 
                    data-id="' . $Docente['id'] . '" data-before="' . $date . '" value="'.$date.'"/>
                </div>
            </td>
            <td class="text-center"><button name="btn_delete" id="btn_delete" class="btn btn-xs btn-danger" data-id="' . $Docente['id'] . '">
            <i class="glyphicon glyphicon-trash"></i></button></td>
        </tr>
        ';
    $inc++;
    endforeach;
} else {
    $output .= '<tbody><tr>NÃO EXISTEM REGISTROS DE DOCENTES!</tr>';
}
$output .= '
    <tr>
        <td id="nome" contenteditable></td>
        <td id="sobrenome" contenteditable></td>
        <td id="email" contenteditable></td>
        <td id="curso" contenteditable></td>
        <td>
                <select id="centro" class="form-control">
                    <option></option>';
$readCentro = read('centros_ref', '');
if ($readCentro) {
    foreach ($readCentro as $Centro):
        $output .= '<option value="' . $Centro['id'] . '">' . $Centro['nome'] . '</option>';
    endforeach;
}
$output .= '</select>
            </td>
        <td class="date">
            <div class="input-group" >
                <input type="text" class="form-control" id="datetimepicker3" onmouseover="acionaTimepicker()"/>
            </div>
        </td>
        <td class="text-center"><button id="btn_add" class="btn btn-xs btn-success"><i class="glyphicon glyphicon-plus"></i></button></td>        
    </tr>
    ';
$output .= '</tbody></table>';
echo $output;
?>

Página onde serão exibidos os dados:

<div class="table-responsive">
    <h3>Gerenciamento de Docentes</h3>
    <div id="live_data"></div>
    <input type="text" class="form-control datepicker" />
</div>

Página onde ficam os códigos JAVASCRIPT:

<script src="<?php setHome(); ?>/js/jquery.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="js/bootstrap.js"></script>

<!-- TABELA COM DADOS CARREGADOS VIA AJAX -->
<?php
$url = stripslashes($_GET['exe']);
$url = explode('/', $url);
if ($url[1] == 'new-doc-edit') {
    ?>
    <script>
        $(document).ready(function () {
            function fetch_data() {
                $.ajax({
                    url: "docentes/select.php",
                    method: "POST",
                    success: function (data) {
                        $('#live_data').html(data);
                    }
                });
            }

            fetch_data();
            $(document).on('click', '#btn_add', function () {
                var nome = $('#nome').text(),
                    sobrenome = $('#sobrenome').text(),
                    email = $('#email').text(),
                    curso = $('#curso').text(),
                    centro_ref = $('#centro').val(),
                    admissao = $('#datetimepicker3').val();
                if (nome == '' || sobrenome == '' || email == '' || curso == '' || centro_ref == '' || admissao == '') {
                    return false;
                }
                $.ajax({
                    url: "docentes/insert.php",
                    method: "POST",
                    data: {
                        nome: nome,
                        sobrenome: sobrenome,
                        email: email,
                        curso: curso,
                        centro_ref: centro_ref,
                        admissao: admissao
                    },
                    dataType: "text",
                    success: function () {
                        alert('Dados adicionados com sucesso!');
                        fetch_data();
                    }
                });
            });

            function update(id, text, column_name) {
                $.ajax({
                    url: "docentes/update.php",
                    method: "POST",
                    data: {
                        id: id,
                        text: text,
                        column_name: column_name
                    },
                    dataType: "text",
                    success: function () {
                        alert('Dados atualizados com sucesso!');
                    }
                });
            }

            $(document).on('blur', '.nome', function () {
                var id = $(this).data("id"),
                    text = $(this).text(),
                    before = $(this).data("before");
                if (before != text) {
                    update(id, text, "nome");
                }
            });

            $(document).on('blur', '.sobrenome', function () {
                var id = $(this).data("id"),
                    text = $(this).text(),
                    before = $(this).data("before");
                if (before != text) {
                    update(id, text, "sobrenome");
                }
            });

            $(document).on('blur', '.email', function () {
                var id = $(this).data("id"),
                    text = $(this).text(),
                    before = $(this).data("before");
                if (before != text) {
                    update(id, text, "email");
                }
            });

            $(document).on('blur', '.curso', function () {
                var id = $(this).data("id"),
                    text = $(this).text(),
                    before = $(this).data("before");
                if (before != text) {
                    update(id, text, "curso");
                }
            });

            $(document).on('blur', '#datetimepicker4', function () {
                var id = $(this).data("id"),
                    val = $(this).val(),
                    before = $(this).data("before");
                if (before != val) {
                    update(id, val, "admissao");
                }
            });

            $(document).on('blur', '.centro', function () {
                var id = $(this).data("id"),
                    val = $(this).val(),
                    before = $(this).data("before");
                if (before != val) {
                    update(id, val, "centro_ref");
                }
            });

            $(document).on('click', '#btn_delete', function () {
                var id = $(this).data("id");
                $.ajax({
                    url: "docentes/delete.php",
                    method: "POST",
                    data: {
                        id: id
                    },
                    dataType: "text",
                    success: function () {
                        alert('Dados apagados com sucesso!');
                        fetch_data();
                    }
                });
            });
        });
    </script>
<?php } ?>

<script>
    $(document).ready(function(){
        $(".datepicker").datepicker({
            dateFormat: "dd/mm/yy"
        });
        function acionaDatePicker(seletor){
            $(seletor).datepicker({
                dateFormat: "dd/mm/yy"
            });
        }
    });
</script>

Caso eu não tenha sido claro quanto a minha dúvida, por favor, informem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, procure instanciar o datepicker após o load da tabela, pois como está hoje, ele chama quando abre a página porem a tabela ainda não foi criada.

function fetch_data() {
    //-- REMOVE OS PLUGINS ANTIGOS
    $(".datepicker").datepicker("destroy");

    $.ajax({
        url: "docentes/select.php",
        method: "POST",
        success: function (data) {
            $('#live_data').html(data);

            //-- INSTANCIA OS NOVOS PLUGINS
            $(".datepicker").datepicker({
                dateFormat: "dd/mm/yy"
            });
        }
    });
}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, procure instanciar o datepicker após o load da tabela, pois como está hoje, ele chama quando abre a página porem a tabela ainda não foi criada.

function fetch_data() {
    //-- REMOVE OS PLUGINS ANTIGOS
    $(".datepicker").datepicker("destroy");

    $.ajax({
        url: "docentes/select.php",
        method: "POST",
        success: function (data) {
            $('#live_data').html(data);

            //-- INSTANCIA OS NOVOS PLUGINS
            $(".datepicker").datepicker({
                dateFormat: "dd/mm/yy"
            });
        }
    });
}
 

Muito obrigado mano, deu certo!

A desatenção foi tão grande que não estava percebendo isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por luiz monteiro
      Olá. Tenho 3 formulários em uma mesma pagina, onde cada um tem 1 input type text.
      O que preciso é recuperar o nome desses inputs e o valor correspondente ao formulário submetido.
      =============
      form name="formulario1" id="formulario1"
      input type="text" name="nome1" value="valor1" /form
      form name="formulario2" id="formulario2"
      input type="text" name="nome2" value="valor2" /form
      form name="formulario3" id="formulario3"
      input type="text" name="nome3" value="valor3" /form
      =============
      ..........
      var formulario_submetido = document.getElementById("formulario1"); formulario_submetido.addEventListener('submit', function(e) { e.preventDefault(); //tentei console.log(document.querySelectorAll('#'+this.id + ' input').name); //tentei var formula = new FormData(formulario_submetido); console.log(formula.input['type=text'].name); //tentei console.log(formula.get(input['type=text']).name); ..........
        no console.log(e), ele está nessa hierarquia   form -> srcElement -> input -> attributes -> name 
      Como recupero o valor do name dele e o valor do value?
       
      Agradeço desde já.
    • Por Thiago Duarte
      Oi, gostaria de arrastar imagem e ao soltar formar bloco html, meu bloco de html ficaria com nome, content-1.html, content-2.html, etc
       
      Alguem pode me ajudar?
    • Por ILR master
      Salve galera.
       
      Vou publicar um evento e quero colocar um Cronômetro regressivo que mostre em tempo real os dias, horas e minutos que faltam para determinada data, tipo:.
      Faltam 5 dias, 12:30:00 para inauguração.
       
      Qdo chegar no dia, quero que apenas apareça uma mensagem.
       
      Alguém pode me ajudar?
    • Por ment0r
      Boa noite pessoal, tudo bem?
       
      Estou desenvolvendo um sistema simples com exibição de formulário via modal. Uma vez cadastrado o serviço (tabela possui apenas dois campos, id e nome), eles são exibidos numa tabela com um ícone que permite a alteração do nome.

       
      Eu clico no ícone e é chamado um modal que é gerado via ajax (pois são vários registros).
       

       
      Nesse modal é mostrado o serviço e uma vez alterado, o botão Salvar chama uma função que atualiza a tabela servico, concluindo a tarefa. Fiz o mesmo processo pra cadastrar o serviço, com a diferença de que o modal está presente na mesma página, ou seja, não é chamado via ajax.
       
      Eis os códigos:
      <a href="#" onclick="modalUpdate(<?= trim($array['id']) ?>)"> <i class='bx bx-edit'></i> </a> // Trecho onde eu chamo a função modalUpdate. Função btAltServico click:
      $('#btAltServico').click(function() { var inpnome = $('#nome'); var inpid = $('#id'); if (inpnome.val() == '') { swal("Atenção", "Por favor, preencha os campos obrigatórios", "warning"); if (inpnome.val() == '') { inpnome.css("border","2px solid #f94545"); } else { inpnome.css("border",""); } alert(inpnome); alert(inpid); } else { $.ajax({ url: '../inc/ajax/altServico.php', type: 'post', dataType: 'json', // pode ser html data: { nome : inpnome.val(), id : inpid.val() }, success: function(resposta){ if (resposta == 1) { inpnome.val(""); inpnome.css("border",""); swal("Sucesso", "Serviço alterado", "success"); } else { if (resposta == 0) { swal("Erro", "Serviço não alterado. Log de erro gerado.", "error"); } else { swal("Atenção", "Serviço já cadastrado", "warning"); } } } }) } });  
      E modalUpdate.php :
       
      <?php /* * altServico.php * * Script responsável pelo update de serviços na tabela servico * * Função chamada pelo arquivo ajax.js */ //if ($_POST) { require'../conn.php'; require'../../class/class.geral.php'; $geral = new Geral(); $nome = $_POST['nome']; $id = $_POST['nome']; $ativo = 1; // Verifica se o servico já foi cadastrado $sqlVer = "select nome from algo68_db_cliente.servico where nome = '".$nome."' and id <> ".$id.""; $queryVer = mysqli_query($conn, $sqlVer); $resultVer = mysqli_num_rows($queryVer); if ($resultVer > 0) { echo json_encode(2); // servico já cadastrado } else { // Update do servico $sql = "update algo68_db_cliente.servico set nome = '".$nome."', ativo = ".$ativo." where id = ".$id; $query = mysqli_query($conn, $sql); $result = mysqli_affected_rows($conn); if ($result > 0) { echo json_encode(1); // alterou o servico } else { $geral->logErro(date('d/m/Y|H:i:s'), @$_SERVER[REQUEST_URI], 'AlterarServico', mysqli_error($conn)); echo json_encode(0); // não alterou o servico } } //} ?> O problema é que quando clico no botão Salvar, não acontece nada - se eu colocar um alert qualquer na função click, só pra saber se está chegando, também não da nada. E está da mesma forma que o cadastro de serviço, que funciona perfeitamente.

      Bom, é isso pessoal, tentei ser o mais breve e especifico possível. Qualquer ajuda é bem vinda, obrigado a todos, desde já.
    • Por Danilo - Jesus voltará!
      Olá pessoal, tenho uma div a qual através de um select categorias eu trago dados de empresas do banco, aí preciso clicar nas listagens das empresas e pegar o ID quando clica no checkbox e gravar pelo ajax novamente na session feita no arquivo php tipo um carrinho de compras, que essa parte já tenho... só não to conseguindo pegar os ids gerados dinamicamente no retorno feito do ajax, eles aparecem com F12 ao inspecionar, mas não aceita eu clicar para pegar o ID, acho que é algo de DOM, mas não to sabendo fazer... alguém aí saberia me ajudar como pegar esses ids ao clicar, já que eles vem dinamicamente?
       
      obrigado
×

Informação importante

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