dhtmlxScheduler 与 PHP 集成教程
本教程为您提供了使用 PHP 构建 Scheduler(调度器)应用的所有核心步骤,无需依赖任何框架。
本示例采用 MySQL 作为数据存储,并通过 PDO 接口 访问数据库。您需要 PHP 5.4 或更高版本,并启用 PDO_MYSQL 扩展,以及安装 MySQL 或 MariaDB。
如果您想了解如何在其它平台或框架下进行服务端集成,可以参考以下教程:
- dhtmlxScheduler와 ASP.NET Core
- dhtmlxScheduler와 ASP.NET MVC
- dhtmlxScheduler와 Node.js
- dhtmlxScheduler와 PHP:Slim
- dhtmlxScheduler와 PHP:Laravel 연동하기
- dhtmlxScheduler와 SalesForce LWC 통합하기
- dhtmlxScheduler와 Ruby on Rails 연동하기
- dhtmlxScheduler 와 dhtmlxConnector 연동하기
您还可以访问 GitHub 上的完整演示,按照分步说明搭建应用。
完整源码可在 GitHub 获取。
步骤 1. 创建项目
首先,为您的应用创建一个新的目录。
新建一个空文件夹,并命名为 scheduler-howto-php-plain。
步骤 2. 在页面中添加 Scheduler
接下来,创建一个页面来承载 scheduler。
在 scheduler-howto-php-plain 文件夹内,创建一个 index.html 文件,并添加以下内容:
<!doctype html>
<html>
<head>
<title> Getting started with dhtmlxScheduler</title>
<meta charSet="utf-8"/>
<script src="https://cdn.dhtmlx.com/scheduler/edge/dhtmlxscheduler.js"></script>
<link href="https://cdn.dhtmlx.com/scheduler/edge/dhtmlxscheduler.css"
rel="stylesheet" type="text/css" charSet="utf-8">
<style>
html, body{
margin:0px;
padding:0px;
height:100%;
overflow:hidden;
}
</style>
</head>
<body>
<div id="scheduler_here" className="dhx_cal_container">
<div className="dhx_cal_navline">
<div className="dhx_cal_prev_button"> </div>
<div className="dhx_cal_next_button"> </div>
<div className="dhx_cal_today_button"></div>
<div className="dhx_cal_date"></div>
<div className="dhx_cal_tab" name="day_tab"></div>
<div className="dhx_cal_tab" name="week_tab"></div>
<div className="dhx_cal_tab" name="month_tab"></div>
</div>
<div className="dhx_cal_header"></div>
<div className="dhx_cal_data"></div>
</div>
<script>
scheduler.init('scheduler_here', new Date(2019,0,20), "week");
scheduler.load("data/api.php");
</script>
</body>
</html>
运行应用后,调度器将显示在页面上:

步骤 3. 准备数据库
此时,scheduler 还是空的。下一步需要创建数据库并与应用连接。
创 建数据库
您可以通过常用的 MySQL 客户端(如 phpMyAdmin),或使用命令行来创建数据库。使用以下 SQL 语句新建数据库和事件表:
CREATE DATABASE IF NOT EXISTS `scheduler_howto_php`;
USE `scheduler_howto_php`;
DROP TABLE IF EXISTS `events`;
CREATE TABLE `events` (
`id` int(11) AUTO_INCREMENT,
`start_date` datetime NOT NULL,
`end_date` datetime NOT NULL,
`text` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET="utf8;"
如果用 MySQL 控制台操作,可以先将上述 SQL 保存为 dump.sql 文件,然后执行:
$ mysql -uuser -ppass scheduler < mysql_dump.sql
步骤 4. 加载数据
数据库准备好后,就可以加载数据到 scheduler 了。
在项目目录下新建一个名为 data 的文件夹。
首先,在 data/config.php 文件中定义数据库连接参数:
<?php
$dsn = "mysql:host=localhost;dbname=scheduler_howto_php";
$username = "root";
$password = "";
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
);
请根据实际的数据库配置,修改 "localhost"、 "scheduler_howto_php"、 "root" 和 "" 为相应的值。
接下来,添加一个 PHP 脚本,客户端将通过它从数据库加载数据并保存 scheduler 的更改。
在 data 文件夹下创建 api.php 文件,首先建立数据库连接:
<?php
require_once("config.php");
$db = new PDO($dsn, $username, $password, $options);
然后,实现一个函数用于从数据库读取 scheduler 事件:
function read($db, $requestParams){
$queryParams = [];
$queryText = "SELECT * FROM `events`";
$query = $db->prepare($queryText);
$query->execute($queryParams);
$events = $query->fetchAll();
return $events;
}
之后,创建请求处理器以响应前端请求:
switch ($_SERVER["REQUEST_METHOD"]) {
case "GET":
$result = read($db, $_GET);
break;
case "POST":
// we'll implement this later
break;
default:
throw new Exception("Unexpected Method");
break;
}
header("Content-Type: application/json");
echo json_encode($result);
如果您已经在数据库中添加了一些事件,它们现在会显示在 scheduler 上。
动态加载
目前,scheduler 会一次性从数据库加载所有事件记录。如果数据量较小,这种方式没问题。但对于如预订或计划等应用,旧数据会不断累积,数据量会越来越大。经过几个月的使用,每次加载页面都可能传 输数兆字节的事件数据。
为避免这种情况,可以启用动态加载。scheduler 会将当前显示的日期范围作为参数发送,服务端只返回该范围内的事件。每次用户切换日期范围时,scheduler 只请求相关的数据。
要在客户端启用动态加载,使用 setLoadMode 选项,并设置为 "day"、"week" 或 "month"。例如,在客户端代码中添加:
scheduler.init("scheduler_here", new Date(2019, 0, 20), "week");
scheduler.setLoadMode("day"); /*!*/
// load data from the backend
scheduler.load("data/api.php");
在服务端,可以通过如下方式调整 read 函数:
function read($db, $requestParams){
$queryParams = [];
$queryText = "SELECT * FROM `events`";
// handle dynamic loading
if (isset($requestParams["from"]) && isset($requestParams["to"])) { /*!*/
$queryText .= " WHERE `end_date`>=? AND `start_date` < ?;"; /*!*/
$queryParams = [$requestParams["from"], $requestParams["to"]]; /*!*/
} /*!*/
$query = $db->prepare($queryText);
$query->execute($queryParams);
$events = $query->fetchAll();
return $events;
}