Skip to content

Commit e865613

Browse files
committed
[dev] add initial commit
0 parents  commit e865613

File tree

8 files changed

+477
-0
lines changed

8 files changed

+477
-0
lines changed

README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# dhtmlxScheduler with plain PHP Backend
2+
3+
Implementing scheduler backend in plain PHP without extra libraries and frameworks.
4+
5+
## Requirements
6+
7+
- Web server that supports php (apache, nginx, php-fpm, build-in php server, etc)
8+
- MySql
9+
- PHP 5.4+ with **php_pdo** extension installed
10+
11+
How to install **php_pdo**: https://www.php.net/manual/en/pdo.installation.php
12+
13+
## Setup
14+
15+
- clone or download the repository into the root folder of your web server (e.g. `htdocs` for Apache)
16+
17+
```
18+
$ git clone git@github.com:DHTMLX/scheduler-howto-php-plain.git
19+
$ cd ./scheduler-howto-php-plain
20+
```
21+
22+
- import database from **mysql_dump.sql**
23+
- update db connection settings in data/config.php
24+
25+
- open `http://localhost/scheduler-howto-php-plain`
26+
27+
## Links
28+
29+
- Tutorial: coming soon

basic.html

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<meta http-equiv="X-UA-Compatible" content="ie=edge">
7+
<title>How to start - connector - basic</title>
8+
<script src="https://cdn.dhtmlx.com/scheduler/edge/dhtmlxscheduler.js" type="text/javascript"></script>
9+
<link rel="stylesheet" href="https://cdn.dhtmlx.com/scheduler/edge/dhtmlxscheduler_material.css" type="text/css">
10+
<style type="text/css">
11+
html, body{
12+
margin:0px;
13+
padding:0px;
14+
height:100%;
15+
overflow:hidden;
16+
}
17+
</style>
18+
</head>
19+
<body>
20+
<div id="scheduler_here" class="dhx_cal_container" style="width:100%; height:100%;">
21+
<div class="dhx_cal_navline">
22+
<div class="dhx_cal_prev_button">&nbsp;</div>
23+
<div class="dhx_cal_next_button">&nbsp;</div>
24+
<div class="dhx_cal_today_button"></div>
25+
<div class="dhx_cal_date"></div>
26+
<div class="dhx_cal_tab" name="day_tab"></div>
27+
<div class="dhx_cal_tab" name="week_tab"></div>
28+
<div class="dhx_cal_tab" name="month_tab"></div>
29+
</div>
30+
<div class="dhx_cal_header"></div>
31+
<div class="dhx_cal_data"></div>
32+
</div>
33+
<script>
34+
scheduler.setLoadMode("day");
35+
scheduler.init("scheduler_here", new Date(),"month");
36+
scheduler.load("data/api.php");
37+
38+
var dp = new dataProcessor("data/api.php");
39+
dp.init(scheduler);
40+
dp.setTransactionMode("JSON"); // use to transfer data with JSON
41+
</script>
42+
</body>
43+
</html>

data/api.php

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
require_once("config.php");
3+
4+
function read($db, $requestParams){
5+
$queryParams = [];
6+
$queryText = "SELECT * FROM `events`";
7+
if (isset($requestParams["from"]) && isset($requestParams["to"])) {
8+
$queryText .= " WHERE `end_date`>=? AND `start_date` < ?;";
9+
$queryParams = [$requestParams["from"], $requestParams["to"]];
10+
}
11+
$query = $db->prepare($queryText);
12+
$query->execute($queryParams);
13+
$events = $query->fetchAll();
14+
foreach($events as $index=>$event){
15+
$events[$index]["text"] = htmlentities($event["text"]);
16+
}
17+
return $events;
18+
}
19+
20+
function create($db, $event){
21+
$queryText = "INSERT INTO `events` SET
22+
`start_date`=?,
23+
`end_date`=?,
24+
`text`=?";
25+
$queryParams = [
26+
$event["start_date"],
27+
$event["end_date"],
28+
$event["text"]
29+
];
30+
31+
$query = $db->prepare($queryText);
32+
$query->execute($queryParams);
33+
return $db->lastInsertId();
34+
}
35+
36+
function update($db, $event, $id){
37+
$queryText = "UPDATE `events` SET
38+
`start_date`=?,
39+
`end_date`=?,
40+
`text`=?
41+
WHERE `id`=?";
42+
43+
$queryParams = [
44+
$event["start_date"],
45+
$event["end_date"],
46+
$event["text"],
47+
$id
48+
];
49+
50+
$query = $db->prepare($queryText);
51+
$query->execute($queryParams);
52+
}
53+
54+
function delete($db, $id){
55+
$queryText = "DELETE FROM `events` WHERE `id`=? ;";
56+
57+
$query = $db->prepare($queryText);
58+
$query->execute([$id]);
59+
}
60+
61+
try {
62+
$db = new PDO($dsn, $username, $password, $options);
63+
switch ($_SERVER["REQUEST_METHOD"]) {
64+
case "GET":
65+
$result = read($db, $_GET);
66+
break;
67+
case "POST":
68+
$requestPayload = json_decode(file_get_contents("php://input"));
69+
$id = $requestPayload->id;
70+
$action = $requestPayload->action;
71+
$body = (array) $requestPayload->data;
72+
73+
$result = [
74+
"action" => $action
75+
];
76+
77+
if ($action == "inserted") {;
78+
$databaseId = create($db, $body);
79+
$result["tid"] = $databaseId;
80+
} elseif($action == "updated") {
81+
update($db, $body, $id);
82+
} elseif($action == "deleted") {
83+
delete($db, $id);
84+
}
85+
break;
86+
default: throw new Exception("Unexpected Method"); break;
87+
}
88+
} catch (Exception $e) {
89+
http_response_code(500);
90+
$result = [
91+
"action" => "error",
92+
"message" => $e->getMessage()
93+
];
94+
}
95+
96+
header("Access-Control-Allow-Origin: *");
97+
header("Access-Control-Allow-Methods: *");
98+
header("Content-Type: application/json");
99+
echo json_encode($result);

data/api_recurring.php

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
<?php
2+
require_once("config.php");
3+
4+
function read($db, $requestParams){
5+
$queryParams = [];
6+
$queryText = "SELECT * FROM `recurring_events`";
7+
if (isset($requestParams["from"]) && isset($requestParams["to"])) {
8+
$queryText .= " WHERE `end_date`>=? AND `start_date` < ?;";
9+
$queryParams = [$requestParams["from"], $requestParams["to"]];
10+
}
11+
$query = $db->prepare($queryText);
12+
$query->execute($queryParams);
13+
$events = $query->fetchAll(PDO::FETCH_ASSOC);
14+
foreach($events as $index=>$event){
15+
$events[$index]["text"] = htmlentities($event["text"]);
16+
}
17+
return $events;
18+
}
19+
20+
function create($db, $event){
21+
$queryText = "INSERT INTO `recurring_events` SET
22+
`start_date`=?,
23+
`end_date`=?,
24+
`text`=?,
25+
26+
`event_pid`=?,
27+
`event_length`=?,
28+
`rec_type`=?";
29+
$queryParams = [
30+
$event["start_date"],
31+
$event["end_date"],
32+
$event["text"],
33+
// recurring events columns
34+
$event["event_pid"] ? $event["event_pid"] : 0,
35+
$event["event_length"] ? $event["event_length"] : 0,
36+
$event["rec_type"]
37+
];
38+
39+
$query = $db->prepare($queryText);
40+
$query->execute($queryParams);
41+
42+
return $db->lastInsertId();
43+
}
44+
45+
function update($db, $event, $id){
46+
$queryText = "UPDATE `recurring_events` SET
47+
`start_date`=?,
48+
`end_date`=?,
49+
`text`=?,
50+
`event_pid`=?,
51+
`event_length`=?,
52+
`rec_type`=?
53+
WHERE `id`=?";
54+
55+
$queryParams = [
56+
$event["start_date"],
57+
$event["end_date"],
58+
$event["text"],
59+
60+
$event["event_pid"] ? $event["event_pid"] : 0,
61+
$event["event_length"] ? $event["event_length"] : 0,
62+
$event["rec_type"],//!
63+
$id
64+
];
65+
if ($event["rec_type"] && $event["rec_type"] != "none") {
66+
//all modified occurrences must be deleted when you update recurring series
67+
//https://docs.dhtmlx.com/scheduler/server_integration.html#savingrecurringevents
68+
$subQueryText = "DELETE FROM `recurring_events` WHERE `event_pid`=? ;";
69+
$subQuery = $db->prepare($subQueryText);
70+
$subQuery->execute([$id]);
71+
}
72+
73+
$query = $db->prepare($queryText);
74+
$query->execute($queryParams);
75+
}
76+
77+
function delete($db, $id){
78+
// some logic specific to recurring events support
79+
// https://docs.dhtmlx.com/scheduler/server_integration.html#savingrecurringevents
80+
$subQueryText = "SELECT * FROM `recurring_events` WHERE id=? LIMIT 1;";
81+
$subQuery = $db->prepare($subQueryText);
82+
$subQuery->execute([$id]);
83+
$event = $subQuery->fetch();
84+
85+
if ($event["event_pid"]) {
86+
// deleting a modified occurrence from a recurring series
87+
// If an event with the event_pid value was deleted - it needs updating
88+
// with rec_type==none instead of deleting.
89+
$subQueryText="UPDATE `recurring_events` SET `rec_type`='none' WHERE `id`=?;";
90+
$subQuery = $db->prepare($subQueryText);
91+
$subQuery->execute([$id]);
92+
93+
}else{
94+
if ($event["rec_type"] && $event["rec_type"] != "none") {//!
95+
// if a recurring series deleted, delete all modified occurrences of the series
96+
$subQueryText = "DELETE FROM `recurring_events` WHERE `event_pid`=? ;";
97+
$subQuery = $db->prepare($subQueryText);
98+
$subQuery->execute([$id]);
99+
}
100+
101+
/*
102+
end of recurring events data processing
103+
*/
104+
105+
$queryText = "DELETE FROM `recurring_events` WHERE `id`=? ;";
106+
$query = $db->prepare($queryText);
107+
$query->execute([$id]);
108+
}
109+
}
110+
111+
try {
112+
$db = new PDO($dsn, $username, $password, $options);
113+
switch ($_SERVER["REQUEST_METHOD"]) {
114+
case "GET":
115+
$result = read($db, $_GET);
116+
break;
117+
case "POST":
118+
$requestPayload = json_decode(file_get_contents("php://input"));
119+
$id = $requestPayload->id;
120+
$action = $requestPayload->action;
121+
$body = (array) $requestPayload->data;
122+
123+
$result = [
124+
"action" => $action
125+
];
126+
127+
if ($action == "inserted") {
128+
$databaseId = create($db, $body);
129+
$result["tid"] = $databaseId;
130+
// delete a single occurrence from recurring series
131+
if ($body["rec_type"] === "none") {
132+
$result["action"] = "deleted";//!
133+
}
134+
} elseif($action == "updated") {
135+
update($db, $body, $id);
136+
} elseif($action == "deleted") {
137+
delete($db, $id);
138+
}
139+
break;
140+
default: throw new Exception("Unexpected Method"); break;
141+
}
142+
} catch (Exception $e) {
143+
http_response_code(500);
144+
$result = [
145+
"action" => "error",
146+
"message" => $e->getMessage()
147+
];
148+
}
149+
150+
header("Access-Control-Allow-Origin: *");
151+
header("Access-Control-Allow-Methods: *");
152+
header("Content-Type: application/json");
153+
echo json_encode($result);

data/config.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
$dsn = "mysql:host=localhost;dbname=scheduler_howto_php";
3+
$username = "root";
4+
$password = "";
5+
6+
$options = array(
7+
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",
8+
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
9+
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
10+
);

0 commit comments

Comments
 (0)