Beispiel #1
0
 /**
  * Prepares new/edited event properties before save
  */
 private function write_preprocess(&$event, $action)
 {
     // convert dates into DateTime objects in user's current timezone
     $event['start'] = new DateTime($event['start'], $this->timezone);
     $event['end'] = new DateTime($event['end'], $this->timezone);
     $event['allday'] = (bool) $event['allday'];
     // start/end is all we need for 'move' action (#1480)
     if ($action == 'move') {
         return;
     }
     // convert the submitted recurrence settings
     if (is_array($event['recurrence'])) {
         $event['recurrence'] = $this->lib->from_client_recurrence($event['recurrence'], $event['start']);
     }
     // convert the submitted alarm values
     if ($event['valarms']) {
         $event['valarms'] = libcalendaring::from_client_alarms($event['valarms']);
     }
     $attachments = array();
     $eventid = 'cal-' . $event['id'];
     if (is_array($_SESSION[self::SESSION_KEY]) && $_SESSION[self::SESSION_KEY]['id'] == $eventid) {
         if (!empty($_SESSION[self::SESSION_KEY]['attachments'])) {
             foreach ($_SESSION[self::SESSION_KEY]['attachments'] as $id => $attachment) {
                 if (is_array($event['attachments']) && in_array($id, $event['attachments'])) {
                     $attachments[$id] = $this->rc->plugins->exec_hook('attachment_get', $attachment);
                 }
             }
         }
     }
     $event['attachments'] = $attachments;
     // convert link references into simple URIs
     if (array_key_exists('links', $event)) {
         $event['links'] = array_map(function ($link) {
             return is_array($link) ? $link['uri'] : strval($link);
         }, (array) $event['links']);
     }
     // check for organizer in attendees
     if ($action == 'new' || $action == 'edit') {
         if (!$event['attendees']) {
             $event['attendees'] = array();
         }
         $emails = $this->get_user_emails();
         $organizer = $owner = false;
         foreach ((array) $event['attendees'] as $i => $attendee) {
             if ($attendee['role'] == 'ORGANIZER') {
                 $organizer = $i;
             }
             if ($attendee['email'] == in_array(strtolower($attendee['email']), $emails)) {
                 $owner = $i;
             }
             if (!isset($attendee['rsvp'])) {
                 $event['attendees'][$i]['rsvp'] = true;
             } else {
                 if (is_string($attendee['rsvp'])) {
                     $event['attendees'][$i]['rsvp'] = $attendee['rsvp'] == 'true' || $attendee['rsvp'] == '1';
                 }
             }
         }
         // set new organizer identity
         if ($organizer !== false && !empty($event['_identity']) && ($identity = $this->rc->user->get_identity($event['_identity']))) {
             $event['attendees'][$organizer]['name'] = $identity['name'];
             $event['attendees'][$organizer]['email'] = $identity['email'];
         }
         // set owner as organizer if yet missing
         if ($organizer === false && $owner !== false) {
             $event['attendees'][$owner]['role'] = 'ORGANIZER';
             unset($event['attendees'][$owner]['rsvp']);
         }
     }
     // mapping url => vurl because of the fullcalendar client script
     if (array_key_exists('vurl', $event)) {
         $event['url'] = $event['vurl'];
         unset($event['vurl']);
     }
 }
 /**
  * repares new/edited task properties before save
  */
 private function prepare_task($rec)
 {
     // try to be smart and extract date from raw input
     if ($rec['raw']) {
         foreach (array('today', 'tomorrow', 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat') as $word) {
             $locwords[] = '/^' . preg_quote(mb_strtolower($this->gettext($word))) . '\\b/i';
             $normwords[] = $word;
             $datewords[] = $word;
         }
         foreach (array('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'now', 'dec') as $month) {
             $locwords[] = '/(' . preg_quote(mb_strtolower($this->gettext('long' . $month))) . '|' . preg_quote(mb_strtolower($this->gettext($month))) . ')\\b/i';
             $normwords[] = $month;
             $datewords[] = $month;
         }
         foreach (array('on', 'this', 'next', 'at') as $word) {
             $fillwords[] = preg_quote(mb_strtolower($this->gettext($word)));
             $fillwords[] = $word;
         }
         $raw = trim($rec['raw']);
         $date_str = '';
         // translate localized keywords
         $raw = preg_replace('/^(' . join('|', $fillwords) . ')\\s*/i', '', $raw);
         $raw = preg_replace($locwords, $normwords, $raw);
         // find date pattern
         $date_pattern = '!^(\\d+[./-]\\s*)?((?:\\d+[./-])|' . join('|', $datewords) . ')\\.?(\\s+\\d{4})?[:;,]?\\s+!i';
         if (preg_match($date_pattern, $raw, $m)) {
             $date_str .= $m[1] . $m[2] . $m[3];
             $raw = preg_replace(array($date_pattern, '/^(' . join('|', $fillwords) . ')\\s*/i'), '', $raw);
             // add year to date string
             if ($m[1] && !$m[3]) {
                 $date_str .= date('Y');
             }
         }
         // find time pattern
         $time_pattern = '/^(\\d+([:.]\\d+)?(\\s*[hapm.]+)?),?\\s+/i';
         if (preg_match($time_pattern, $raw, $m)) {
             $has_time = true;
             $date_str .= ($date_str ? ' ' : 'today ') . $m[1];
             $raw = preg_replace($time_pattern, '', $raw);
         }
         // yes, raw input matched a (valid) date
         if (strlen($date_str) && strtotime($date_str) && ($date = new DateTime($date_str, $this->timezone))) {
             $rec['date'] = $date->format('Y-m-d');
             if ($has_time) {
                 $rec['time'] = $date->format('H:i');
             }
             $rec['title'] = $raw;
         } else {
             $rec['title'] = $rec['raw'];
         }
     }
     // normalize input from client
     if (isset($rec['complete'])) {
         $rec['complete'] = floatval($rec['complete']);
         if ($rec['complete'] > 1) {
             $rec['complete'] /= 100;
         }
     }
     if (isset($rec['flagged'])) {
         $rec['flagged'] = intval($rec['flagged']);
     }
     // fix for garbage input
     if ($rec['description'] == 'null') {
         $rec['description'] = '';
     }
     foreach ($rec as $key => $val) {
         if ($val === 'null') {
             $rec[$key] = null;
         }
     }
     if (!empty($rec['date'])) {
         $this->normalize_dates($rec, 'date', 'time');
     }
     if (!empty($rec['startdate'])) {
         $this->normalize_dates($rec, 'startdate', 'starttime');
     }
     // convert tags to array, filter out empty entries
     if (isset($rec['tags']) && !is_array($rec['tags'])) {
         $rec['tags'] = array_filter((array) $rec['tags']);
     }
     // convert the submitted alarm values
     if ($rec['valarms']) {
         $valarms = array();
         foreach (libcalendaring::from_client_alarms($rec['valarms']) as $alarm) {
             // alarms can only work with a date (either task start, due or absolute alarm date)
             if (is_a($alarm['trigger'], 'DateTime') || $rec['date'] || $rec['startdate']) {
                 $valarms[] = $alarm;
             }
         }
         $rec['valarms'] = $valarms;
     }
     // convert the submitted recurrence settings
     if (is_array($rec['recurrence'])) {
         $refdate = null;
         if (!empty($rec['date'])) {
             $refdate = new DateTime($rec['date'] . ' ' . $rec['time'], $this->timezone);
         } else {
             if (!empty($rec['startdate'])) {
                 $refdate = new DateTime($rec['startdate'] . ' ' . $rec['starttime'], $this->timezone);
             }
         }
         if ($refdate) {
             $rec['recurrence'] = $this->lib->from_client_recurrence($rec['recurrence'], $refdate);
             // translate count into an absolute end date.
             // why? because when shifting completed tasks to the next recurrence,
             // the initial start date to count from gets lost.
             if ($rec['recurrence']['COUNT']) {
                 $engine = libcalendaring::get_recurrence();
                 $engine->init($rec['recurrence'], $refdate);
                 if ($until = $engine->end()) {
                     $rec['recurrence']['UNTIL'] = $until;
                     unset($rec['recurrence']['COUNT']);
                 }
             }
         } else {
             // recurrence requires a reference date
             $rec['recurrence'] = '';
         }
     }
     $attachments = array();
     $taskid = $rec['id'];
     if (is_array($_SESSION[self::SESSION_KEY]) && $_SESSION[self::SESSION_KEY]['id'] == $taskid) {
         if (!empty($_SESSION[self::SESSION_KEY]['attachments'])) {
             foreach ($_SESSION[self::SESSION_KEY]['attachments'] as $id => $attachment) {
                 if (is_array($rec['attachments']) && in_array($id, $rec['attachments'])) {
                     $attachments[$id] = $this->rc->plugins->exec_hook('attachment_get', $attachment);
                     unset($attachments[$id]['abort'], $attachments[$id]['group']);
                 }
             }
         }
     }
     $rec['attachments'] = $attachments;
     // convert link references into simple URIs
     if (array_key_exists('links', $rec)) {
         $rec['links'] = array_map(function ($link) {
             return is_array($link) ? $link['uri'] : strval($link);
         }, (array) $rec['links']);
     }
     // convert invalid data
     if (isset($rec['attendees']) && !is_array($rec['attendees'])) {
         $rec['attendees'] = array();
     }
     foreach ((array) $rec['attendees'] as $i => $attendee) {
         if (is_string($attendee['rsvp'])) {
             $rec['attendees'][$i]['rsvp'] = $attendee['rsvp'] == 'true' || $attendee['rsvp'] == '1';
         }
     }
     // copy the task status to my attendee partstat
     if (!empty($rec['_reportpartstat'])) {
         if (($idx = $this->is_attendee($rec)) !== false) {
             if (!($rec['_reportpartstat'] == 'NEEDS-ACTION' && $rec['attendees'][$idx]['status'] == 'ACCEPTED')) {
                 $rec['attendees'][$idx]['status'] = $rec['_reportpartstat'];
             } else {
                 unset($rec['_reportpartstat']);
             }
         }
     }
     // set organizer from identity selector
     if ((isset($rec['_identity']) || !empty($rec['attendees']) && empty($rec['organizer'])) && ($identity = $this->rc->user->get_identity($rec['_identity']))) {
         $rec['organizer'] = array('name' => $identity['name'], 'email' => $identity['email']);
     }
     if (is_numeric($rec['id']) && $rec['id'] < 0) {
         unset($rec['id']);
     }
     return $rec;
 }