Como editar evento no FullCalendar com PHP
Neste tutorial, será apresentado como editar evento no FullCalendar com PHP.
Primeiramente, será mostrado como enviar os dados para o formulário editar com JavaScript.
Em seguida, será apresentado como criar formulário editar evento no FullCalendar.
Por fim, será mostrado como editar no banco de dados o evento.
Download do código fonte desenvolvido na aula: Download
Curso de PHP Developer: Mais Detalhes do Curso
Playlist completa sobre como usar Fullcalendar com PHP: Acessar
Receber as aulas gratuitas do curso de PHP Developer: Acessar
Para começar, é utilizado como base o projeto da aula "Como cadastrar evento FullCalendar com PHP".
No arquivo "index.php", na janela modal de visualização, acrescentado o formulário de edição.
<div class="modal fade" id="visualizarModal" tabindex="-1" aria-labelledby="visualizarModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="visualizarModalLabel">Visualizar o Evento</h1>
<h1 class="modal-title fs-5" id="editarModalLabel" style="display: none;">Editar o Evento</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div id="visualizarEvento">
<dl class="row">
<dt class="col-sm-3">ID: </dt>
<dd class="col-sm-9" id="visualizar_id"></dd>
<dt class="col-sm-3">Título: </dt>
<dd class="col-sm-9" id="visualizar_title"></dd>
<dt class="col-sm-3">Início: </dt>
<dd class="col-sm-9" id="visualizar_start"></dd>
<dt class="col-sm-3">Fim: </dt>
<dd class="col-sm-9" id="visualizar_end"></dd>
</dl>
<button class="btn btn-warning" id="btnViewEditEvento">Editar</button>
</div>
<div id="editarEvento" style="display: none;">
<span id="msgEditEvento"></span>
<form method="POST" id="formEditEvento">
<input type="hidden" name="edit_id" id="edit_id">
<div class="row mb-3">
<label for="edit_title" class="col-sm-2 col-form-label">Título</label>
<div class="col-sm-10">
<input type="text" name="edit_title" class="form-control" id="edit_title" placeholder="Título do evento">
</div>
</div>
<div class="row mb-3">
<label for="edit_start" class="col-sm-2 col-form-label">Início</label>
<div class="col-sm-10">
<input type="datetime-local" name="edit_start" class="form-control" id="edit_start">
</div>
</div>
<div class="row mb-3">
<label for="edit_end" class="col-sm-2 col-form-label">Fim</label>
<div class="col-sm-10">
<input type="datetime-local" name="edit_end" class="form-control" id="edit_end">
</div>
</div>
<div class="row mb-3">
<label for="edit_color" class="col-sm-2 col-form-label">Cor</label>
<div class="col-sm-10">
<select name="edit_color" class="form-control" id="edit_color">
<option value="">Selecione</option>
<option style="color:#FFD700;" value="#FFD700">Amarelo</option>
<option style="color:#0071c5;" value="#0071c5">Azul Turquesa</option>
<option style="color:#FF4500;" value="#FF4500">Laranja</option>
<option style="color:#8B4513;" value="#8B4513">Marrom</option>
<option style="color:#1C1C1C;" value="#1C1C1C">Preto</option>
<option style="color:#436EEE;" value="#436EEE">Royal Blue</option>
<option style="color:#A020F0;" value="#A020F0">Roxo</option>
<option style="color:#40E0D0;" value="#40E0D0">Turquesa</option>
<option style="color:#228B22;" value="#228B22">Verde</option>
<option style="color:#8B0000;" value="#8B0000">Vermelho</option>
</select>
</div>
</div>
<button type="button" name="btnViewEvento" class="btn btn-primary" id="btnViewEvento">Cancelar</button>
<button type="submit" name="btnEditEvento" class="btn btn-warning" id="btnEditEvento">Salvar</button>
</form>
</div>
</div>
</div>
</div>
</div>
Por padrão o formulário editar é ocultado, somente é apresentado quando clicar no botão editar, para apresentar o formulário e ocultar o conteúdo é implementado no JavaScript.
// Receber o SELETOR ocultar detalhes do evento e apresentar o formulário editar evento
const btnViewEditEvento = document.getElementById("btnViewEditEvento");
// Somente acessa o IF quando existir o SELETOR "btnViewEditEvento"
if (btnViewEditEvento) {
// Aguardar o usuario clicar no botao editar
btnViewEditEvento.addEventListener("click", () => {
// Ocultar os detalhes do evento
document.getElementById("visualizarEvento").style.display = "none";
document.getElementById("visualizarModalLabel").style.display = "none";
// Apresentar o formulário editar do evento
document.getElementById("editarEvento").style.display = "block";
document.getElementById("editarModalLabel").style.display = "block";
});
}
Para preencher o formulário com os dados do evento que será editado, no arquivo "custom.js", na parte que identifica o clique do usuário sobre o evento, os dados são enviados para o formulário.
// Identificar o clique do usuário sobre o evento
eventClick: function (info) {
// Apresentar os detalhes do evento
document.getElementById("visualizarEvento").style.display = "block";
document.getElementById("visualizarModalLabel").style.display = "block";
// Ocultar o formulário editar do evento
document.getElementById("editarEvento").style.display = "none";
document.getElementById("editarModalLabel").style.display = "none";
// Enviar os dados do evento para o formulário editar
document.getElementById("edit_id").value = info.event.id;
document.getElementById("edit_title").value = info.event.title;
document.getElementById("edit_start").value = converterData(info.event.start);
document.getElementById("edit_end").value = info.event.end !== null ? converterData(info.event.end) : converterData(info.event.start);
document.getElementById("edit_color").value = info.event.backgroundColor;
// Abrir a janela modal visualizar
visualizarModal.show();
}
Em seguida, quando o usuário clicar em salvar os dados do formulário, chama o JavaScript responsável por receber os dados do formulário e enviá-los para o arquivo "editar_evento.php".
// Receber o SELETOR do formulário editar evento
const formEditEvento = document.getElementById("formEditEvento");
// Receber o SELETOR da mensagem editar evento
const msgEditEvento = document.getElementById("msgEditEvento");
// Receber o SELETOR do botão editar evento
const btnEditEvento = document.getElementById("btnEditEvento");
// Somente acessa o IF quando existir o SELETOR "formEditEvento"
if (formEditEvento) {
// Aguardar o usuario clicar no botao editar
formEditEvento.addEventListener("submit", async (e) => {
// Não permitir a atualização da pagina
e.preventDefault();
// Apresentar no botão o texto salvando
btnEditEvento.value = "Salvando...";
// Receber os dados do formulário
const dadosForm = new FormData(formEditEvento);
// Chamar o arquivo PHP responsável em editar o evento
const dados = await fetch("editar_evento.php", {
method: "POST",
body: dadosForm
});
// Apresentar no botão o texto salvar
btnEditEvento.value = "Salvar";
});
}
No arquivo "editar_evento.php", é necessário receber os dados enviados pelo JavaScript. Em seguida, a edição do evento no banco de dados é realizada e o status é retornado para o JavaScript.
<?php
// Incluir o arquivo com a conexão com banco de dados
include_once './conexao.php';
// Receber os dados enviado pelo JavaScript
$dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);
// Criar a QUERY editar evento no banco de dados
$query_edit_event = "UPDATE events SET title=:title, color=:color, start=:start, end=:end WHERE id=:id";
// Prepara a QUERY
$edit_event = $conn->prepare($query_edit_event);
// Substituir o link pelo valor
$edit_event->bindParam(':title', $dados['edit_title']);
$edit_event->bindParam(':color', $dados['edit_color']);
$edit_event->bindParam(':start', $dados['edit_start']);
$edit_event->bindParam(':end', $dados['edit_end']);
$edit_event->bindParam(':id', $dados['edit_id']);
// Verificar se consegui editar corretamente
if ($edit_event->execute()) {
$retorna = ['status' => true, 'msg' => 'Evento editado com sucesso!', 'id' => $dados['edit_id'], 'title' => $dados['edit_title'], 'color' => $dados['edit_color'], 'start' => $dados['edit_start'], 'end' => $dados['edit_end']];
} else {
$retorna = ['status' => false, 'msg' => 'Erro: Evento não editado!'];
}
// Converter o array em objeto e retornar para o JavaScript
echo json_encode($retorna);
No JavaScript, é realizada a leitura das informações retornadas pelo arquivo PHP, verificando o status. Se não conseguiu editar, envia mensagem de erro para o HTML apresentar ao usuário; se conseguiu editar, envia mensagem de sucesso para o HTML, limpa o formulário, atualiza os dados do evento no calendário e fecha a janela modal.
// Realizar a leitura dos dados retornados pelo PHP
const resposta = await dados.json();
// Acessa o IF quando não editar com sucesso
if (!resposta['status']) {
// Enviar a mensagem para o HTML
msgEditEvento.innerHTML = `<div class="alert alert-danger" role="alert">${resposta['msg']}</div>`;
} else {
// Enviar a mensagem para o HTML
msg.innerHTML = `<div class="alert alert-success" role="alert">${resposta['msg']}</div>`;
// Enviar a mensagem para o HTML
msgEditEvento.innerHTML = "";
// Limpar o formulário
formEditEvento.reset();
// Recuperar o evento no FullCalendar pelo id
const eventoExiste = calendar.getEventById(resposta['id']);
// Verificar se encontrou o evento no FullCalendar pelo id
if(eventoExiste){
// Atualizar os atributos do evento com os novos valores do banco de dados
eventoExiste.setProp('title', resposta['title']);
eventoExiste.setProp('color', resposta['color']);
eventoExiste.setStart(resposta['start']);
eventoExiste.setEnd(resposta['end']);
}
// Chamar a função para remover a mensagem após 3 segundo
removerMsg();
// Fechar a janela modal
visualizarModal.hide();
}
Baixar o código-fonte completo do projeto.
Bom, era isso. Espero que o tutorial tenha sido útil!