Интеграция Firebase
В этом руководстве вы узнаете, как построить планировщик событий в реальном времени, интегрируя DHTMLX Scheduler с Firebase Firestore. Эта интеграция обеспечивает бесшовную синхронизацию данных обイベント между интерфейсом Scheduler и базой Firestore: все обновления происходят в реальном времени на всех подключённых клиентах.
Вы можете посмотреть соответствующий пример на GitHub: Демо DHTMLX Scheduler с Firebase Firestore.
Шаг 1: Настройка проекта
Начнём с создания нового каталога проекта и инициализации свежего фронтенд-проекта с использованием Vite:
mkdir scheduler-firebase-demo
cd scheduler-firebase-demo
npm create vite@latest . -- --template vanilla
После того как Vite настроит проект, очистите папку src, чтобы начать с нуля:
rm -rf src/*
Теперь установите необходимые зависимости:
npm i dhtmlx-scheduler firebase
Шаг 2: Создание и настройка проекта Firebase
Сначала создайте проект Firebase, выполнив следующие шаги:
- перейдите в консоль Firebase
- нажмите Создать проект
- введите имя проекта (например,
scheduler-firebase-demo) и следуйте подсказкам мастера настройки
Затем настройте Firestore, выполнив шаги ниже:
- перейдите в Firestore Database на панели управления вашего проекта Firebase
- нажмите Создать базу данных
- выберите желаемое расположение
- начните в режиме test для упрощения разработки (не забудьте настроить правила безопасности перед продакшном)
- нажмите Создать
После этого зарегистрируйте ваше веб-приложение следующим образом:
- выберите Обзор проекта в боковой панели Firebase Console
- нажмите значок веб-приложения
</>для регистрации нового веб-приложения - укажите псевдоним приложения (например,
scheduler-firebase-demo) - включите Firebase Hosting
- нажмите Register app
- скопируйте сгенерированную конфигурацию Firebase (вы будете использовать её в вашем проекте)
Наконец, настройте Firebase в вашем проекте следующим образом:
- создайте новый файл
src/firebase.jsи вставьте вашу конфигурацию Firebase, инициализируя Firebase и Firestore:
import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore";
const firebaseConfig = {
apiKey: "YOUR_API_KEY",
authDomain: "scheduler-firebase-demo.firebaseapp.com",
projectId: "scheduler-firebase-demo",
storageBucket: "scheduler-firebase-demo.appspot.com",
messagingSenderId: "YOUR_SENDER_ID",
appId: "YOUR_APP_ID",
measurementId: "YOUR_MEASUREMENT_ID"
};
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
export { db };
Замените все значения-заполнители (такие как YOUR_API_KEY, и т. п.) на реальные учетные данные вашего проекта Firebase.
- установите Firebase CLI глобально (для развёртывания и локального эмулятора) следующим образом:
npm i -g firebase-tools
Шаг 3: Интеграция DHTMLX Scheduler с Firestore
Для начала подготовьте HTML‑контейнер. Замените содержимое вашего index.html следующим образом:
<!doctype html>
<html lang="en">
<head>
<meta charSet="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width="device-width," initial-scale="1.0"" />
<title>Scheduler Firebase demo</title>
</head>
<body>
<div id="scheduler_here" class="dhx_cal_container"
style='width:100%; height: 800px;'></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
Затем укажите основную логику JavaScript, создав файл src/main.js с приведённым ниже кодом. Он связывает Scheduler UI с Firestore и обрабатывает обновления в реальном времени.
import { scheduler } from "dhtmlx-scheduler";
import { db } from "./firebase.js";
import {
collection,
query,
onSnapshot,
addDoc,
deleteDoc,
orderBy,
doc,
updateDoc,
getDocs,
} from "firebase/firestore";
import "dhtmlx-scheduler/codebase/dhtmlxscheduler.css";
const { remoteUpdates } = scheduler.ext.liveUpdates;
scheduler.plugins({
recurring: true,
});
scheduler.config.header = [
"day",
"week",
"month",
"date",
"prev",
"today",
"next",
];
scheduler.init("scheduler_here", new Date(2025, 3, 20), "week");
const eventsRef = collection(db, "events");
scheduler.createDataProcessor(async function (entity, action, ev, id) {
switch (action) {
case "create":
{
const createdDoc = await addDoc(eventsRef, ev);
if (createdDoc.id) {
return { action: "inserted", tid: createdDoc.id };
}
}
break;
case "update":
{
return updateDoc(doc(db, "events", id), ev);
}
break;
case "delete":
{
const deletedDoc = await deleteDoc(doc(db, "events", id));
if (deletedDoc) {
return { action: "deleted" };
}
}
break;
}
});
// helper functions to process event data
const processEvent = (docSnapshot) => {
const event = docSnapshot.data();
event.id = docSnapshot.id;
return event;
};
// без этого вызов не появился бы onSnapshot
const eventsQuery = query(eventsRef, orderBy("text", "desc"));
(async () => {
const EventsSnap = await getDocs(eventsQuery);
const bulkEvents = EventsSnap.docs.map((ev) => processEvent(ev));
scheduler.parse(bulkEvents);
watchRealtime();
})();
const watchRealtime = () => {
let EventsLoaded = false;
onSnapshot(eventsQuery, (querySnapshot) => {
if (!EventsLoaded) {
// первый снимок возвращает текущее состояние
// мы уже загрузили его на предыдущем шаге
EventsLoaded = true;
return;
}
querySnapshot.docChanges().forEach((change) => {
// обрабатываются только серверные изменения
if (change.doc.metadata.hasPendingWrites) return;
const event = processEvent(change.doc);
switch (change.type) {
case "added":
remoteUpdates.events({ type: "add-event", event });
break;
case "modified":
remoteUpdates.events({ type: "update-event", event });
break;
case "removed":
remoteUpdates.events({ type: "delete-event", event });
break;
}
});
});
};
Этот код интегрирует библиотеку DHTMLX Scheduler с Firebase Firestore, чтобы создать интерактивный календарь событий в приложении на JavaScript в реальном времени. Он синхронизирует данные об событиях между интерфейсом Scheduler и базой Firestore, обеспечивая мгновенное отражение изменений, сделанных в любой из частей, в другой части. Код поддерживает создание, обновление, удаление и повторяющиеся события, используя возможности Firestore в реальном времени.
Краткое резюме основных функций
-
scheduler.createDataProcessor: обрабатывает операции CRUD для событий Scheduler, синхронизируя их с Firestore:
- При "create" добавляет новый документ в коллекцию "events".
- При "update" обновляет соответствующий документ Firestore.
- При "delete" удаляет документ из Firestore.
-
processEvent(docSnapshot): преобразует снимок документа Firestore в объект события Scheduler, прикрепляя идентификатор документа.
-
(...)() IIFE : начальная загрузка данных. Загружает все существующие события из Firestore в Scheduler при загрузке страницы, затем начинает слушать обновления в реальном времени.
-
watchRealtime: использует
onSnapshotFirestore для прослушивания изменений в коллекции events и обновления интерфейса Scheduler в реальном времени. Ключевые моменты:- игнорирует начальный снимок (уже загружен)
- обрабатывает только серверные изменения (игнорирует локальные записи, ещё не подтверждённые на сервере)
- обрабатывает добавленные, изменённые и удалённые события вызовом Scheduler через
remoteUpdates
-
onSnapshot(q, callback): в реальном времени слушает изменения в коллекции Firestore "events", упорядочивая по полю "text" убыванию, и применяет соответствующие живые обновления к Scheduler UI с использованием
remoteUpdates.eventsдля добавленных, изменённых или удалённых событий.
Шаг 4: Инициализация и развёртывание проекта
Теперь нужно инициализировать Firebase Hosting и Firestore. Для этого следует:
- Из корня проекта выполните следующую команду:
firebase init
Затем выполните шаги ниже:
- используйте пробел, чтобы выбрать функции Firestore и Hosting
- выберите Use an existing project и выберите ваш проект Firebase
- для правил Firestore, индексов и публичного каталога примите значения по умолчанию
- установите публичный каталог в
dist(вывод сборки Vite) - пропустите настройку развёртывания на GitHub, если вы не хотите её настраивать
- Соберите проект, выполнив следующую команду:
npm run build
- Разверните на Firebase Hosting следующей командой:
firebase deploy
После завершения развёртывания URL хоста будет выведен в консоли.