summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorGeorg Ehrke <ownclouddev@georgswebsite.de>2011-11-12 22:02:04 +0100
committerGeorg Ehrke <ownclouddev@georgswebsite.de>2011-11-12 22:02:04 +0100
commita303992d781db9d6714522014f4903ce89c62127 (patch)
treea43ebeb0fb4405a6b7ad7f7aeddb5802a2cb90fa /apps
parenteea20e51d8d96e91a7899704cad48811152fe143 (diff)
downloadnextcloud-server-a303992d781db9d6714522014f4903ce89c62127.tar.gz
nextcloud-server-a303992d781db9d6714522014f4903ce89c62127.zip
support for repeating events
Diffstat (limited to 'apps')
-rw-r--r--apps/calendar/ajax/events.php77
-rw-r--r--apps/calendar/lib/object.php4
2 files changed, 55 insertions, 26 deletions
diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php
index 66aeb1a35ba..f161bb88a03 100644
--- a/apps/calendar/ajax/events.php
+++ b/apps/calendar/ajax/events.php
@@ -6,10 +6,24 @@
* See the COPYING-README file.
*/
-require_once ("../../../lib/base.php");
-if(!OC_USER::isLoggedIn()) {
- die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
+require_once ('../../../lib/base.php');
+require_once('../../../3rdparty/when/When.php');
+
+function addoutput($event, $vevent, $return_event){
+ $return_event['id'] = (int)$event['id'];
+ $return_event['title'] = $event['summary'];
+ $return_event['description'] = isset($vevent->DESCRIPTION)?$vevent->DESCRIPTION->value:'';
+ $last_modified = $vevent->__get('LAST-MODIFIED');
+ if ($last_modified){
+ $lastmodified = $last_modified->getDateTime()->format('U');
+ }else{
+ $lastmodified = 0;
+ }
+ $return_event['lastmodified'] = (int)$lastmodified;
+ return $return_event;
}
+
+OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');
$start = DateTime::createFromFormat('U', $_GET['start']);
@@ -18,38 +32,53 @@ $end = DateTime::createFromFormat('U', $_GET['end']);
$events = OC_Calendar_Object::allInPeriod($_GET['calendar_id'], $start, $end);
$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London");
$return = array();
-foreach($events as $event)
-{
- $return_event = array();
+foreach($events as $event){
$object = OC_Calendar_Object::parse($event['calendardata']);
$vevent = $object->VEVENT;
$dtstart = $vevent->DTSTART;
$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
+ $return_event = array();
$start_dt = $dtstart->getDateTime();
$end_dt = $dtend->getDateTime();
- if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE)
- {
+ if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){
$return_event['allDay'] = true;
- $return_event['start'] = $start_dt->format('Y-m-d');
- $end_dt->modify('-1 sec');
- $return_event['end'] = $end_dt->format('Y-m-d');
}else{
- $start_dt->setTimezone(new DateTimeZone($user_timezone));
- $end_dt->setTimezone(new DateTimeZone($user_timezone));
- $return_event['start'] = $start_dt->format('Y-m-d H:i:s');
- $return_event['end'] = $end_dt->format('Y-m-d H:i:s');
$return_event['allDay'] = false;
}
- $return_event['id'] = (int)$event['id'];
- $return_event['title'] = $event['summary'];
- $return_event['description'] = isset($vevent->DESCRIPTION)?$vevent->DESCRIPTION->value:'';
- $last_modified = $vevent->__get('LAST-MODIFIED');
- if ($last_modified){
- $lastmodified = $last_modified->getDateTime()->format('U');
+ //Repeating Events
+ if($event['repeating'] == 1){
+ $duration = (double) $end_dt->format('U') - (double) $start_dt->format('U');
+ $r = new When();
+ $r->recur((string) $dtstart)->rrule((string) $vevent->RRULE);
+ while($result = $r->next()){
+ if($result->format('U') > $_GET['end']){
+ break;
+ }
+ if($return_event['allDay'] == true){
+ $return_event['start'] = $result->format('Y-m-d');
+ $return_event['end'] = date('Y-m-d', $result->format('U') + $duration--);
+ }else{
+ $return_event['start'] = $result->format('Y-m-d H:i:s');
+ $return_event['end'] = date('Y-m-d H:i:s', $result->format('U') + $duration);
+ }
+ $return[] = addoutput($event, $vevent, $return_event);
+ }
}else{
- $lastmodified = 0;
+ $return_event = array();
+ if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){
+ $return_event['allDay'] = true;
+ $return_event['start'] = $start_dt->format('Y-m-d');
+ $end_dt->modify('-1 sec');
+ $return_event['end'] = $end_dt->format('Y-m-d');
+ }else{
+ $start_dt->setTimezone(new DateTimeZone($user_timezone));
+ $end_dt->setTimezone(new DateTimeZone($user_timezone));
+ $return_event['start'] = $start_dt->format('Y-m-d H:i:s');
+ $return_event['end'] = $end_dt->format('Y-m-d H:i:s');
+ $return_event['allDay'] = false;
+ }
+ $return[] = addoutput($event, $vevent, $return_event);
}
- $return_event['lastmodified'] = (int)$lastmodified;
- $return[] = $return_event;
}
OC_JSON::encodedPrint($return);
+?> \ No newline at end of file
diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php
index ccc62d565e8..58d46ce6a7d 100644
--- a/apps/calendar/lib/object.php
+++ b/apps/calendar/lib/object.php
@@ -43,12 +43,12 @@ class OC_Calendar_Object{
public static function allInPeriod($id, $start, $end){
$stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?'
.' AND ((startdate >= ? AND startdate <= ? AND repeating = 0)'
- .' OR (startdate <= ? AND enddate >= ? AND repeating = 1))' );
+ .' OR (startdate <= ? AND repeating = 1))' );
$start = self::getUTCforMDB($start);
$end = self::getUTCforMDB($end);
$result = $stmt->execute(array($id,
$start, $end,
- $end, $start));
+ $end));
$calendarobjects = array();
while( $row = $result->fetchRow()){