3
respostas

Atualizar DIV sem Refresh na pagina toda.

Boa noite pessoal. Estou usando php + codeigniter porém creio que isso seja independente do framework ou linguagem.

O que ocorre é que ao inserir um registro gostaria de atualizar somente a DIV da minha tabela com os novos registros. Vejam abaixo no meu codigo.

$('#formulario_clientes').ajaxForm({
            success: function (data) {
              $('#modalCliente').modal('toggle');
              $('#modalSucesso').modal('show');
              window.setTimeout(function () {
                $("#modalSucesso").modal("hide");
                $("#myTable").load(base_url+'index.php/Cliente/Clientes/consultaClientesSemRefresh');
              }, 2000);

            }
        });

No exemplo acima ao ocorrer uma inserção eu chamo um modal de sucesso, aguardo 2 segundos e tento carregar o conteudo para a DIV sem atualizar a pagina toda. Porém o que ocorre é uma duplicação de conteudo, ou seja ele carrega a minha tablea novamente, ficando 2 tabelas na mesma pagina.

Abaixo código da minha table.

<table class="table table-hover" id="myTable">
        <thead>
            <tr>
        <th><b>Nome</b></th>
        <td><b>Telefone</b></td>
        <th><b>Cidade</b></td>
        <th><b>Estado</b></td>
            </tr>
        </thead>

        <tbody class="resultados">
          <?php foreach ($results as $data) : ?>
        <tr id="info">
            <td style="display:none;"><?= $data->id_cliente ?></td>
                  <td><?= $data["nomeCliente"] ?></td>
            <td><?= $data["telefoneCliente"] ?></td>
            <td><?= $data["nomeCidade"] ?></td> 
            <td><?= $data["nomeEstado"] ?></td>           
                <td>
                <a>
                    <button style="background-color:transparent" class="btn btn-primary-outline glyphicon glyphicon-trash" onclick="modalDelete(<?= $data["id_cliente"]?>)" value="<?= $data["id_cliente"] ?>">
                    </button>
                </a>
            </td>

            <td>
                <a>
                    <button style="background-color:transparent; outline: none;" class="btn btn-primary-outline glyphicon glyphicon-edit" title="Editar" data-toggle="modal" data-target="#modalCliente" data-whatever="<?= $data["nomeCliente"] ?>" 
                    data-whatevercpfcnpj="<?= $data["CPF_CNPJ"]?>" 
                    data-whatevernasc="<?= $data["dataNascimento"]?>" 
                    data-whatevertelefone="<?= $data["telefoneCliente"]?>" 
                    data-whatevercidade="<?= $data["nomeCidade"]?>" 
                    data-whateverestado="<?= $data["id"]?>"  
                    data-whateverendereco="<?= $data["enderecoCliente"]?>"
                    data-whateverbairro="<?= $data["bairroCliente"]?>"
                    data-whateveremail="<?= $data["emailCliente"]?>"
                    data-whatevercomplemento="<?= $data["bairroCliente"]?>"
                    data-whateverid = "<?= $data["id_cliente"]?>">
                    </button>
                </a>
            </td>

            <td>
                <a>
                    <button style="background-color:transparent" class="btn btn-primary-outline glyphicon glyphicon-eye-open" title="Vizualizar" data-toggle="modal" data-target="#modalClienteView" data-whatever="<?= $data["nomeCliente"] ?>" 
                    data-whatevercpfcnpj="<?= $data["CPF_CNPJ"]?>" 
                    data-whatevernasc="<?= $data["dataNascimento"]?>" 
                    data-whatevertelefone="<?= $data["telefoneCliente"]?>" 
                    data-whatevercidade="<?= $data["nomeCidade"]?>" 
                    data-whateverestado="<?= $data["nomeEstado"]?>"  
                    data-whateverendereco="<?= $data["enderecoCliente"]?>"
                    data-whateverbairro="<?= $data["bairroCliente"]?>"
                    data-whateveremail="<?= $data["emailCliente"]?>"
                    data-whatevercomplemento="<?= $data["bairroCliente"]?>"
                    data-whateverid = "<?= $data["id_cliente"]?>">
                    </button>
                </a>
            </td>
        </tr>
            <?php endforeach ?>
        </tbody>
    </table>

Estou apenas fazendo um load por cima é o que me parece, teria alguma forma de corrigir isso?

Obrigado.

3 respostas

Oi Matheus, tava vendo o método load e realmente a ideia dele é pegar o retorno da url e colocar dentro do elemento. Você já coneferiu o que está sendo exatamente retornado?

Realmente o método que ele chama é este.

public function  consultaClientesSemRefresh(){
        $this->load->model("Cliente/Clientes_Model");
        $this->load->model("Estados/Estados_Model");
        $config["base_url"] = base_url('index.php/Cliente/');
        $dados = [
            'results' => $this->Clientes_Model->buscaClientes(),
            'options_estados' => $this->Estados_Model->selectEstados()
        ];
        $this->load->view("Cliente/Clientes", $dados);
    }

Ou seja carrega a minha VIEW novamente por cima da ja existente.

Não sei como o CodeIgniter trabalha exatamente. Mas, pelo que entendi, o comando $this->load->view renderiza toda uma view. Não é muito diferente em outros frameworks PHP, como por exemplo no Laravel, onde a view é o retorno de uma função. Quando você trabalha com Ajax, você não precisa retornar a view inteira.

Você deveria retornar um JSON (ou os dados em outro formato) da função consultaClientesSemRefresh(), e a tabela poderia ser recarregada no seu JavaScript. Quando você tenta retornar a view, realmente é como você disse, você carrega a sua view por cima da que está carregada.

Outra sugestão é, se você estiver trabalhando com banco de dados, você com certeza tem uma primary key na tabela. Em vez de ter todos os dados do cliente no botão, acredito que, para editar ou visualizar seus dados bastaria passar um id. Mas aí já depende de como você está trabalhando.