Como cadastrar evento FullCalendar com PHP


Neste tutorial, será apresentado como cadastrar um evento no FullCalendar com PHP. 

Primeiramente, será mostrado como criar o formulário na janela modal com o Bootstrap. 

Em seguida, será apresentado como receber os dados do formulário com JavaScript e salvá-los no banco de dados com PHP. 

Por fim, será mostrado como atualizar a lista de eventos no FullCalendar.

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 ver detalhes do evento na janela modal com FullCalendar e Bootstrap".

Criada no arquivo "index.php" a janela modal com o formulário para cadastrar evento no FullCalendar.

<!-- Modal Cadastrar -->
<div class="modal fade" id="cadastrarModal" tabindex="-1" aria-labelledby="cadastrarModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h1 class="modal-title fs-5" id="cadastrarModalLabel">Cadastrar o Evento</h1>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">

                <span id="msgCadEvento"></span>

                <form method="POST" id="formCadEvento">

                    <div class="row mb-3">
                        <label for="cad_title" class="col-sm-2 col-form-label">Título</label>
                        <div class="col-sm-10">
                            <input type="text" name="cad_title" class="form-control" id="cad_title" placeholder="Título do evento">
                        </div>
                    </div>

                    <div class="row mb-3">
                        <label for="cad_start" class="col-sm-2 col-form-label">Início</label>
                        <div class="col-sm-10">
                            <input type="datetime-local" name="cad_start" class="form-control" id="cad_start">
                        </div>
                    </div>

                    <div class="row mb-3">
                        <label for="cad_end" class="col-sm-2 col-form-label">Fim</label>
                        <div class="col-sm-10">
                            <input type="datetime-local" name="cad_end" class="form-control" id="cad_end">
                        </div>
                    </div>

                    <div class="row mb-3">
                        <label for="cad_color" class="col-sm-2 col-form-label">Cor</label>
                        <div class="col-sm-10">
                            <select name="cad_color" class="form-control" id="cad_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="submit" name="btnCadEvento" class="btn btn-success" id="btnCadEvento">Cadastrar</button>

                </form>

            </div>
        </div>
    </div>
</div>

Em seguida, no "js/custom.js", é implementado para receber o seletor "formCadEvento", que identifica o formulário. Com o seletor recuperado, é verificado se o mesmo existe e aguarda o clique do usuário no botão cadastrar.

// Receber o SELETOR do formulário cadastrar evento
const formCadEvento = document.getElementById("formCadEvento");

// Somente acessa o IF quando existir o SELETOR "formCadEvento"
if (formCadEvento) {

	// Aguardar o usuario clicar no botao cadastrar
	formCadEvento.addEventListener("submit", async (e) => {

		// Não permitir a atualização da pagina
		e.preventDefault();

	});
}

Necessário receber os dados do formulário com JavaScript, enviá-los para o arquivo "cadastrar_evento.php", que será responsável por cadastrar no banco de dados.

// Receber o SELETOR do formulário cadastrar evento
const formCadEvento = document.getElementById("formCadEvento");

// Somente acessa o IF quando existir o SELETOR "formCadEvento"
if (formCadEvento) {

	// Aguardar o usuario clicar no botao cadastrar
	formCadEvento.addEventListener("submit", async (e) => {

		// Não permitir a atualização da pagina
		e.preventDefault();

		// Apresentar no botão o texto salvando
		btnCadEvento.value = "Salvando...";

		// Receber os dados do formulário
		const dadosForm = new FormData(formCadEvento);

		// Chamar o arquivo PHP responsável em salvar o evento
		const dados = await fetch("cadastrar_evento.php", {
			method: "POST",
			body: dadosForm
		});

	});
}

Necessário criar o arquivo "cadastrar_evento.php". Nele, é incluída a conexão com o banco de dados, implementada a recepção dos dados do JavaScript com PHP, criada a QUERY SQL para o cadastro no banco de dados e, por fim, a mensagem de sucesso ou erro é retornada ao 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 cadastrar evento no banco de dados
$query_cad_event = "INSERT INTO events (title, color, start, end) VALUES (:title, :color, :start, :end)";

// Prepara a QUERY
$cad_event = $conn->prepare($query_cad_event);

// Substituir o link pelo valor
$cad_event->bindParam(':title', $dados['cad_title']);
$cad_event->bindParam(':color', $dados['cad_color']);
$cad_event->bindParam(':start', $dados['cad_start']);
$cad_event->bindParam(':end', $dados['cad_end']);

// Verificar se consegui cadastrar corretamente
if ($cad_event->execute()) {
    $retorna = ['status' => true, 'msg' => 'Evento cadastrado com sucesso!', 'id' => $conn->lastInsertId(), 'title' => $dados['cad_title'], 'color' => $dados['cad_color'], 'start' => $dados['cad_start'], 'end' => $dados['cad_end']];
} else {
    $retorna = ['status' => false, 'msg' => 'Erro: Evento não cadastrado!'];
}

// Converter o array em objeto e retornar para o JavaScript
echo json_encode($retorna);

No JavaScript, é verificado o status que o arquivo PHP retorna. Se for um erro, a mensagem de erro é enviada para o HTML; caso contrário, a mensagem de sucesso é enviada ao HTML, o formulário é limpo, o evento é adicionado ao FullCalendar e a janela modal é fechada.

// Realizar a leitura dos dados retornados pelo PHP
const resposta = await dados.json();

// Acessa o IF quando não cadastrar com sucesso
if (!resposta['status']) {

    // Enviar a mensagem para o HTML
    msgCadEvento.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
    msgCadEvento.innerHTML = "";

    // Limpar o formulário
    formCadEvento.reset();

    // Criar o objeto com os dados do evento
    const novoEvento = {
        id: resposta['id'],
        title: resposta['title'],
        color: resposta['color'],
        start: resposta['start'],
        end: resposta['end'],
    }

    // Adicionar o evento ao calendário
    calendar.addEvent(novoEvento);

    // Chamar a função para remover a mensagem após 3 segundo
    removerMsg();

    // Fechar a janela modal
    cadastrarModal.hide();
}

// Apresentar no botão o texto Cadastrar
btnCadEvento.value = "Cadastrar";

Baixar o código-fonte completo do projeto.

Bom, era isso. Espero que o tutorial tenha sido útil!