Skip to content
This repository was archived by the owner on Oct 17, 2021. It is now read-only.

Commit d7c1968

Browse files
committed
refactor weekly recurrence part 1
1 parent 2a661cf commit d7c1968

File tree

4 files changed

+148
-94
lines changed

4 files changed

+148
-94
lines changed

addEvent-json.php

+71-71
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
11
<?php
2+
ini_set('display_errors', 1);
3+
ini_set('display_startup_errors', 1);
4+
error_reporting(E_ALL);
5+
6+
require 'class.Event.php';
7+
28
// if post
3-
if (isset($_POST['title'])){
9+
if (isset($_POST['title'])) {
10+
11+
// get date info
12+
$jsonString = file_get_contents('json/events.json');
13+
$data = json_decode($jsonString, true);
14+
15+
$last_rid = end($data)['rid'];
16+
// split start, end into date, time
17+
$startDate = explode(" ", $_POST['start'])[0];
18+
$startTime = explode(" ", $_POST['start'])[1];
19+
$endDate = explode(" ", $_POST['end'])[0];
20+
$endTime = explode(" ", $_POST['end'])[1];
21+
422
// weekday array
5-
$postDates = array(
23+
$dayOfWeekArray = array(
624
array('M',1,'monday'),
725
array('T',2,'tuesday'),
826
array('W',3,'wednesday'),
@@ -12,112 +30,94 @@
1230
array('U',7,'sunday'),
1331
);
1432
// compute days in range
15-
function getDatesInRange($dateFromString, $dateToString, $dow, $dowNum) {
16-
$dateFrom = new \DateTime($dateFromString);
17-
$dateTo = new \DateTime($dateToString);
33+
function getWeekDatesInRange($dateFrom, $dateTo, $dayOfWeek, $dayOfWeekNumber) {
1834
// array of dates
19-
$dates = [];
35+
$allDayRecurrences = [];
2036
// return empty if dateFrom > dateTo
2137
if ($dateFrom > $dateTo) {
22-
return $dates;
38+
return $allDayRecurrences;
2339
}
2440
// get next closest dow if dowNUM != dateFrom
25-
if ($dowNum != $dateFrom->format('N')) {
26-
$dateFrom->modify('next '. $dow);
41+
if ($dayOfWeekNumber != $dateFrom->format('N')) {
42+
$dateFrom->modify('next '. $dayOfWeek);
2743
}
2844
// if dateFrom <= dateTo, modify by 1 week
2945
while ($dateFrom <= $dateTo) {
30-
$dates[] = $dateFrom->format('Y-m-d');
46+
$allDayRecurrences[] = $dateFrom->format('Y-m-d');
3147
$dateFrom->modify('+1 week');
3248
}
33-
return $dates;
49+
return $allDayRecurrences;
3450
}
3551

36-
// get date info
37-
$jsonString = file_get_contents('json/events.json');
38-
$data = json_decode($jsonString, true);
39-
// get, set id, rid
40-
$last_item = end($data);
41-
$last_item_id = $last_item['id'];
42-
$last_item_rid = $last_item['rid'];
43-
// split start, end into date, time
44-
$start = explode(" ", $_POST['start']);
45-
$end = explode(" ", $_POST['end']);
52+
function startFunc($dayRecurrence, $startTime) {
53+
$_POST['start'] = $dayRecurrence . " " . $startTime;
54+
// if all day event, set the date only
55+
if ($startTime === '00:00:00') {
56+
$_POST['start'] = $dayRecurrence;
57+
}
58+
return $_POST['start'];
59+
}
60+
61+
function endFunc($dayRecurrence, $startDate, $endTime, $endDate) {
62+
// set recurrence date, time for each date
63+
$_POST['end'] = $dayRecurrence . " " . $endTime;
64+
65+
66+
if ($endTime === '00:00:00') {
67+
//if all day or multi day, calculate day interval
68+
$diff = (strtotime($endDate) - strtotime($startDate))/60/60/24;
69+
$_POST['end'] = date('Y-m-d', strtotime( $dayRecurrence . " + " . $diff . " day"));
70+
}
71+
return $_POST['end'];
72+
}
4673

4774
// if event is recurrence
4875
if ($_POST['recurrence']) {
4976
// initialize vars
50-
$dateFromString = $start[0];
51-
$endDate = $_POST['endDate'];
52-
$dateToString = $endDate;
77+
$dateFromString = $startDate;
78+
$dateToString = $_POST['endDate'];
5379
// for each dow
5480
foreach ($_POST['dowID'] as $key => $value) {
5581
// initialize vars
56-
$dowNum = $postDates[$value][1];
57-
$dow = $postDates[$value][2];
82+
$dayOfWeekNumber = $dayOfWeekArray[$value][1];
83+
$dayOfWeek = $dayOfWeekArray[$value][2];
84+
$dateFrom = new \DateTime($dateFromString);
85+
$dateTo = new \DateTime($dateToString);
86+
5887
// call days in range function
59-
$dates = getDatesInRange($dateFromString, $dateToString, $dow, $dowNum);
88+
$allDayRecurrences = getWeekDatesInRange($dateFrom, $dateTo, $dayOfWeek, $dayOfWeekNumber);
6089
// loop each day for dow
61-
$counter = count($dates);
62-
for ($x = 0; $x < $counter; $x++) {
63-
// date from array dates
64-
$date = $dates[$x];
65-
// set recurrence date, time for each date
66-
$_POST['start'] = $date . " " . $start[1];
67-
$_POST['end'] = $date . " " . $end[1];
68-
// if all day event, set the date only
69-
if($start[1] == '00:00:00') {
70-
$_POST['start'] = $date;
71-
}
72-
if($end[1] == '00:00:00') {
73-
//if all day or multi day, calculate day interval
74-
$start_date = strtotime($start[0]);
75-
$end_date = strtotime($end[0]);
76-
$diff = ($end_date - $start_date)/60/60/24;
77-
$_POST['end'] = date('Y-m-d', strtotime($date . " + " . $diff . " day"));
78-
}
90+
foreach ($allDayRecurrences as $dayRecurrence) {
91+
$_POST['start'] = startFunc($dayRecurrence, $startTime);
92+
$_POST['end'] = endFunc($dayRecurrence, $startDate, $endTime, $endDate);
93+
7994
// add date to array
80-
$extra = array(
81-
'id' => ++$last_item_id,
82-
'rid' => $last_item_rid+1,
83-
'recurrence' => 'true',
95+
$addEvent = array(
96+
'id' => ++ end($data)['id'],
97+
'rid' => $last_rid + 1,
98+
'eventType' => 'repeating event',
8499
'title' => $_POST['title'],
85100
'description' => $_POST['description'],
86101
'start' => $_POST['start'],
87102
'end' => $_POST['end'],
88103
'color' => $_POST['color'],
89104
);
90105
// save date info
91-
$data[] = $extra;
106+
$data[] = $addEvent;
92107
$newJsonString = json_encode($data);
93108
file_put_contents('json/events.json', $newJsonString);
94109
}
95110
}
96111
// if single event
97112
} else {
98-
// if all day event, set the date only
99-
if($start[1] == '00:00:00') {
100-
$_POST['start'] = $start[0];
101-
}
102-
if($end[1] == '00:00:00') {
103-
$_POST['end'] = $end[0];
104-
}
105-
// add date to array
106-
$extra = array(
107-
'id' => ++$last_item_id,
108-
'recurrence' => 'false',
109-
'title' => $_POST['title'],
110-
'description' => $_POST['description'],
111-
'start' => $_POST['start'],
112-
'end' => $_POST['end'],
113-
'color' => $_POST['color'],
114-
);
115-
// save date info
116-
$data[] = $extra;
113+
// Creating the object
114+
$addSingleEvent = new Event(++ end($data)['id'], 'single event', $_POST['title'], $_POST['description'], $_POST['start'], $_POST['end'], $_POST['color']);
115+
// Converting object to associative array
116+
$data[] = $addSingleEvent;
117117
$newJsonString = json_encode($data);
118118
file_put_contents('json/events.json', $newJsonString);
119119
}
120120
}
121121
// back to fullCalendar
122-
header('Location: '.$_SERVER['HTTP_REFERER']);
123-
?>
122+
header('Location: '.$_SERVER['HTTP_REFERER']);
123+
?>

class.Event.php

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
class Event {
4+
/* Member variables */
5+
var $id;
6+
var $eventType;
7+
var $title;
8+
var $description;
9+
var $start;
10+
var $end;
11+
var $color;
12+
13+
function __construct( $__id, $__eventType, $__title, $__description, $__start, $__end, $__color )
14+
{
15+
$this->id = $__id;
16+
$this->eventType = $__eventType;
17+
$this->title = $__title;
18+
$this->description = $__description;
19+
$this->setStart($__start);
20+
$this->setEnd($__end);
21+
$this->color = $__color;
22+
}
23+
24+
public function setStart($__start) {
25+
$startTime = explode(" ", $_POST['start'])[1];
26+
$startDate = explode(" ", $_POST['start'])[0];
27+
28+
if ($startTime === '00:00:00') {
29+
$this->start = $startDate;
30+
} else {
31+
$this->start = $__start;
32+
}
33+
}
34+
35+
public function setEnd($__end) {
36+
$endTime = explode(" ", $_POST['end'])[1];
37+
$endDate = explode(" ", $_POST['end'])[0];
38+
39+
if ($endTime === '00:00:00') {
40+
$this->end = $endDate;
41+
} else {
42+
$this->end = $__end;
43+
}
44+
}
45+
}
46+
47+
?>

index-json.php

+29-22
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@
5656
.btn {
5757
margin-left: 10px!important;
5858
}
59+
@media (min-width: 576px) {
60+
.modal-dialog {
61+
max-width: 550px;
62+
}
63+
}
5964
</style>
6065

6166
</head>
@@ -125,7 +130,7 @@
125130
</div>
126131
</div>
127132
<div class="form-group">
128-
<label class="col-sm-12 control-label">Recurrence</label>
133+
<label class="col-sm-12 control-label">Event Type</label>
129134
<div class="col-sm-12">
130135
<label class="recurrence label-off" for="rec" id="recurrence">Enable
131136
<input class="nocheckbox" type="checkbox" id="rec" name="recurrence" value="recurrence"></label>
@@ -255,6 +260,14 @@
255260
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
256261
</div>
257262
<div class="modal-body">
263+
<div class="row">
264+
<div class="form-group">
265+
<label for="rstatus" class="col-sm-12 control-label">Event Type</label>
266+
<div class="col-sm-12">
267+
<input type="text" name="rstatus" class="form-control" id="rstatus" readonly>
268+
</div>
269+
</div>
270+
</div>
258271
<div class="row">
259272
<div class="form-group">
260273
<label for="start" class="col-sm-12 control-label">Start date</label>
@@ -308,28 +321,22 @@
308321
</div>
309322
</div>
310323
<div id="editRecurrence">
311-
<div class="modal-header">
312-
<h5 class="modal-title" id="myModalLabel">Edit Recurrence</h5>
313-
</div>
314-
<div class="modal-body">
315-
<div class="row">
316-
<div class="form-group">
317-
<label for="rstatus" class="col-sm-12 control-label">Recurrence Status</label>
318-
<div class="col-sm-12">
319-
<input type="text" name="rstatus" class="form-control" id="rstatus" readonly>
320-
</div>
321-
</div>
322-
<div class="form-group">
323-
<label class="col-sm-12 control-label">Delete Recurrence</label>
324-
<div class="col-sm-12">
325-
<label class="deleteRecurrence label-off" for="delRec" id="deleteRecurrence">Delete
326-
<input class="nocheckbox" type="checkbox" id="delRec" name="deleteRecurrence" value="deleteRecurrence"></label>
324+
<div class="modal-header">
325+
<h5 class="modal-title" id="myModalLabel">Edit Recurrence</h5>
326+
</div>
327+
<div class="modal-body">
328+
<div class="row">
329+
<div class="form-group">
330+
<label class="col-sm-12 control-label">Delete Recurrence</label>
331+
<div class="col-sm-12">
332+
<label class="deleteRecurrence label-off" for="delRec" id="deleteRecurrence">Delete
333+
<input class="nocheckbox" type="checkbox" id="delRec" name="deleteRecurrence" value="deleteRecurrence"></label>
334+
</div>
327335
</div>
328336
</div>
337+
<input type="hidden" name="id" class="form-control" id="id">
338+
<input type="hidden" name="rid" class="form-control" id="rid">
329339
</div>
330-
<input type="hidden" name="id" class="form-control" id="id">
331-
<input type="hidden" name="rid" class="form-control" id="rid">
332-
</div>
333340
</div>
334341
<div class="modal-footer">
335342
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
@@ -416,8 +423,8 @@
416423
$('#ModalEdit #title').val(event.title);
417424
$('#ModalEdit #description').val(event.description);
418425
$('#ModalEdit #color').val(event.color);
419-
$('#ModalEdit #rstatus').val(event.recurrence);
420-
if (event.recurrence === 'true') {
426+
$('#ModalEdit #rstatus').val(event.eventType);
427+
if (event.eventType === 'repeating event') {
421428
$('#editRecurrence').show();
422429
} else {
423430
$('#editRecurrence').hide();

json/events.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"id":1,"recurrence":"false","title":"All Day Events","description":"some text for all day event","start":"2019-01-01","end":"2019-01-02","color":"#40E0D0"},{"id":2,"recurrence":"false","title":"Long Event","description":"some text for long event","start":"2019-01-07","end":"2019-01-10","color":"#FF0000"},{"id":3,"recurrence":"false","title":"Conference","description":"some text for conference","start":"2019-01-10","end":"2019-01-12","color":"#40E0D0"},{"id":4,"recurrence":"false","title":"Meeting","description":"some text for meeting","start":"2019-01-11 10:30:00","end":"2019-01-11 12:30:00","color":"#000"},{"id":5,"recurrence":"false","title":"Lunch","description":"some text for lunch","start":"2019-01-11 12:00:00","end":"2019-01-11 14:00:00","color":"#0071c5"},{"id":6,"recurrence":"false","title":"Short Event","description":"some text for short event","start":"2019-01-09 16:00:00","end":"2019-01-09 16:30:00","color":"#0071c5"},{"id":7,"recurrence":"false","title":"Dinner","description":"some text for dinner","start":"2019-01-11 16:00:00","end":"2019-01-11 17:30:00","color":"#0071c5"},{"id":8,"recurrence":"false","title":"Happy Hour","description":"some text for happy hour","start":"2019-01-11 17:30:00","end":"2019-01-11 19:30:00","color":"#0071c5"},{"id":9,"recurrence":"false","title":"Birthday Party","description":"some text for birthday party","start":"2019-01-13 09:00:00","end":"2019-01-13 12:00:00","color":"#FFD700"},{"id":10,"recurrence":"false","title":"Vacation","description":"some text for vacation","start":"2019-01-18","end":"2019-01-21","color":"#008000"},{"id":11,"recurrence":"false","title":"Double click to change","description":"some text for double click","start":"2019-01-22","end":"2019-01-23","color":"#000"},{"id":12,"recurrence":"false","title":"Shopping","description":"some text for shopping","start":"2019-01-31 17:30:00","end":"2019-01-31 18:30:00","color":"#FF8C00"},{"id":13,"rid":1,"recurrence":"true","title":"Repeating Event","description":"This occurrence is different","start":"2019-01-21 10:00:00","end":"2019-01-21 11:00:00","color":"#FF0000"},{"id":14,"rid":1,"recurrence":"true","title":"Repeating Event","description":"This is a repeating event","start":"2019-01-28 11:00:00","end":"2019-01-28 12:00:00","color":"#0071c5"},{"id":15,"rid":1,"recurrence":"true","title":"Repeating Event","description":"This is a repeating event","start":"2019-01-23 11:00:00","end":"2019-01-23 12:00:00","color":"#0071c5"},{"id":16,"rid":1,"recurrence":"true","title":"Repeating Event","description":"This is a repeating event","start":"2019-01-30 11:00:00","end":"2019-01-30 12:00:00","color":"#0071c5"},{"id":17,"rid":2,"recurrence":"true","title":"All Day Repeating Event","description":"You can also schedule multi day recurrences","start":"2019-01-05","end":"2019-01-06","color":"#FF8C00"},{"id":18,"rid":2,"recurrence":"true","title":"All Day Repeating Event","description":"You can also schedule multi day recurrences","start":"2019-01-12","end":"2019-01-13","color":"#FF8C00"}]
1+
[{"id":1,"eventType":"single event","title":"All Day Events","description":"some text for all day event","start":"2019-01-01","end":"2019-01-02","color":"#40E0D0"},{"id":2,"eventType":"single event","title":"Long Event","description":"some text for long event","start":"2019-01-07","end":"2019-01-10","color":"#FF0000"},{"id":3,"eventType":"single event","title":"Conference","description":"some text for conference","start":"2019-01-10","end":"2019-01-12","color":"#40E0D0"},{"id":4,"eventType":"single event","title":"Meeting","description":"some text for meeting","start":"2019-01-11 10:30:00","end":"2019-01-11 12:30:00","color":"#000"},{"id":5,"eventType":"single event","title":"Lunch","description":"some text for lunch","start":"2019-01-11 12:00:00","end":"2019-01-11 14:00:00","color":"#0071c5"},{"id":6,"eventType":"single event","title":"Short Event","description":"some text for short event","start":"2019-01-09 16:00:00","end":"2019-01-09 16:30:00","color":"#0071c5"},{"id":7,"eventType":"single event","title":"Dinner","description":"some text for dinner","start":"2019-01-11 16:00:00","end":"2019-01-11 17:30:00","color":"#0071c5"},{"id":8,"eventType":"single event","title":"Happy Hour","description":"some text for happy hour","start":"2019-01-11 17:30:00","end":"2019-01-11 19:30:00","color":"#0071c5"},{"id":9,"eventType":"single event","title":"Birthday Party","description":"some text for birthday party","start":"2019-01-13 09:00:00","end":"2019-01-13 12:00:00","color":"#FFD700"},{"id":10,"eventType":"single event","title":"Vacation","description":"some text for vacation","start":"2019-01-18","end":"2019-01-21","color":"#008000"},{"id":11,"eventType":"single event","title":"Double click to change","description":"some text for double click","start":"2019-01-22","end":"2019-01-23","color":"#000"},{"id":12,"eventType":"single event","title":"Shopping","description":"some text for shopping","start":"2019-01-31 17:30:00","end":"2019-01-31 18:30:00","color":"#FF8C00"},{"id":13,"rid":1,"eventType":"repeating event","title":"Repeating Event","description":"This occurrence is different","start":"2019-01-21 10:00:00","end":"2019-01-21 11:00:00","color":"#FF0000"},{"id":14,"rid":1,"eventType":"repeating event","title":"Repeating Event","description":"This is a repeating event","start":"2019-01-28 11:00:00","end":"2019-01-28 12:00:00","color":"#0071c5"},{"id":15,"rid":1,"eventType":"repeating event","title":"Repeating Event","description":"This is a repeating event","start":"2019-01-23 11:00:00","end":"2019-01-23 12:00:00","color":"#0071c5"},{"id":16,"rid":1,"eventType":"repeating event","title":"Repeating Event","description":"This is a repeating event","start":"2019-01-30 11:00:00","end":"2019-01-30 12:00:00","color":"#0071c5"},{"id":17,"rid":2,"eventType":"repeating event","title":"All Day Repeating Event","description":"You can also schedule multi day recurrences","start":"2019-01-05","end":"2019-01-06","color":"#FF8C00"},{"id":18,"rid":2,"eventType":"repeating event","title":"All Day Repeating Event","description":"You can also schedule multi day recurrences","start":"2019-01-12","end":"2019-01-13","color":"#FF8C00"}]

0 commit comments

Comments
 (0)