dhtmlxScheduler와 PHP:Slim
이 튜토리얼은 Slim 4 프레임워크와 서버 측의 REST API를 결합하여 PHP 기반 Scheduler를 구축하는 필수 단계를 제공합니다.
이 튜토리얼은 Slim Framework v4.x를 사용합니다. 이전 버전을 사용 중이라면 Slim Framework v3.x 가이드를 참고하세요.
다른 플랫폼 및 프레임워크와의 통합을 위한 추가 튜토리얼도 제공됩니다:
- "dhtmlxScheduler와 ASP.NET Core"
- "dhtmlxScheduler와 ASP.NET MVC"
- "dhtmlxScheduler와 Node.js"
- "dhtmlxScheduler와 PHP"
- "dhtmlxScheduler와 PHP:Laravel 연동하기"
- "dhtmlxScheduler와 SalesForce LWC 통합하기"
- "dhtmlxScheduler와 Ruby on Rails 연동하기"
- "dhtmlxScheduler와 dhtmlxConnector 연동하기"
PHP 애플리케이션을 개발할 때는 처음부터 모든 것을 직접 구축하기보다는 기존 프레임워크를 사용하는 것이 일반적입니다.
이 가이드에서는 Slim 4 프레임워크와 서버 측 REST API를 함께 사용하며, 데이터 저장소로는 MySQL을 사용합니다. CRUD 연산은 PDO를 통해 처리되며, 다른 프레임워크와 함께 사용할 수 있을 만큼 유연하게 설계되어 있습니다.
완성된 데모가 GitHub에 준비되어 있습니다. 아래 단계를 따라 유사한 애플리케이션을 만들어보세요.
전체 소스 코드는 GitHub에서 확인할 수 있습니다.
1단계. 프로젝트 초기화
프로젝트 생성
시작점은 Slim 4 프레임워크용 스켈레톤 애플리케이션을 사용하는 것입니다.
Composer를 이용해 애플리케이션을 생성합니다:
$ composer create-project slim/slim-skeleton scheduler-slim-howto
$ cd scheduler-slim-howto/
2단계. 페이지에 Scheduler 추가
다음 단계는 웹 페이지에 스케줄러를 배치하는 것으로, 두 가지 간단한 하위 단계로 구성됩니다.
뷰 생성
app/templates 디렉터리 내에 basic.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.config.xml_date="%Y-%m-%d %H:%i";
scheduler.init('scheduler_here', new Date(2019,0,20), "week");
scheduler.load("/events");
var dp = scheduler.createDataProcessor("/events");
dp.init(scheduler);
dp.setTransactionMode("REST"); // use to transfer data with REST
</script>
</body>
</html>
라우트 설정
새로운 페이지가 준비되면, 브라우저에서 접근할 수 있도록 라우트를 추가해야 합니다. app/routes.php에 다음을 추가하세요:
$app->get('/', function (Request $request, Response $response) {
$payload = file_get_contents('../app/templates/basic.html');
$response->getBody()->write($payload);
return $response;
});
이제 앱을 실행하면 페이지에 스케줄러가 표시됩니다:

3단계. 데이터베이스 준비
스케줄러가 준비되었으니, 다음 단계는 데이터베이스를 설정하고 애플리케이션과 연결하는 것입니다.
데이터베이스 생성
데이터베이스는 선호하는 MySQL 클라이언트(예: phpMyAdmin) 또는 커맨드라인을 통해 생성할 수 있습니다. 아래는 캘린더 이벤트용 데이터베이스와 테이블을 생성하는 SQL 예시입니다:
CREATE DATABASE IF NOT EXISTS `scheduler`;
USE `scheduler`;
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
다음으로, app/settings.php를 열고 데이터베이스 설정 배열을 추가한 후 본인 환경에 맞게 수정하세요:
'pdo' => [
'engine' => 'mysql',
'host' => 'localhost',
'database' => 'scheduler',
'username' => 'user',
'password' => 'pass',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'options' => [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => true,
],
]
이후, app/dependencies.php를 수정하여 PDO 인스턴스를 애플리케이션 컨테이너에 주입하세요:
// Inject a new instance of PDO into the container
$containerBuilder->addDefinitions([
PDO::class => function (ContainerInterface $container) {
$config = $container->get('settings')['pdo'];
$dsn = "{$config['engine']}:host="{$config["'host']};dbname="{$config["'database']};
charSet="{$config["'charset']}";
$username = $config['username'];
$password = $config['password'];
return new PDO($dsn, $username, $password, $config['options']);
},
]);