📄 go_ical.class.inc
字号:
<?php/*Copyright Intermesh 2003Author: Merijn Schering <mschering@intermesh.nl>Version: 1.0 Release date: 14 March 2004This program is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as published by theFree Software Foundation; either version 2 of the License, or (at youroption) any later version.TODO: Attendee and VTODO support*/require_once($GO_CONFIG->class_path.'mail/phpmailer/class.phpmailer.php');class go_ical extends calendar{ var $calendar_properties = ''; var $events = array(); var $datetime_format = 'Ymd\THis'; var $date_format = 'Ymd'; var $timezone_id = ''; var $version; var $local_times; function go_ical($version='2.0', $local_times=false) { $this->db(); $this->version = $version; $this->local_times = $local_times; $this->calendar_properties = "VERSION:".$version."\r\n". "PRODID:-//Intermesh//NONSGML Group-Office//EN\r\n". "CALSCALE:GREGORIAN\r\n". "METHOD:PUBLISH\r\n"; } function export_calendar_header($with_timezones=true) { $str= "BEGIN:VCALENDAR\r\n". $this->calendar_properties; if($this->version=='2.0' && $with_timezones) { $str .= $this->export_timezone(); } return $str; } function export_calendar_footer() { return "END:VCALENDAR\r\n"; } function format_timezone($timezone) { if($timezone < 10 && $timezone > -10) { if($timezone > 0) { $timezone = '+0'.$timezone.'00'; }else { $timezone = '-0'.($timezone*-1).'00'; } }else { if($timezone > 0) { $timezone = '+'.$timezone.'00'; }else { $timezone = '-'.$timezone.'00'; } } return $timezone; } function export_timezone() { global $GO_LANGUAGE; $this->timezone_id = $GO_LANGUAGE->language['description']; $timezone = "BEGIN:VTIMEZONE\r\n".
"TZID:".$this->timezone_id."\r\n"; "LAST-MODIFIED:".date($this->date_format, get_time())."\r\n"; $dst_tz_offset_from = $this->format_timezone($_SESSION['GO_SESSION']['timezone']); $dst_tz_offset_to = $this->format_timezone($_SESSION['GO_SESSION']['DST']+$_SESSION['GO_SESSION']['timezone']); if($_SESSION['GO_SESSION']['DST'] > 0) { $timezone .= "BEGIN:DAYLIGHT\r\n". "DTSTART:19700329T030000\r\n". "TZOFFSETTO:".$dst_tz_offset_to."\r\n".
"TZOFFSETFROM:".$dst_tz_offset_from."\r\n".
"TZNAME:GMT".$dst_tz_offset_to."\r\n". "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\r\n". "END:DAYLIGHT\r\n"; } $timezone .= "BEGIN:STANDARD\r\n". "TZOFFSETTO:".$dst_tz_offset_from."\r\n".
"TZOFFSETFROM:".$dst_tz_offset_to."\r\n". "TZNAME:GMT".$dst_tz_offset_from."\r\n"; if($_SESSION['GO_SESSION']['DST'] > 0) { $timezone .= "DTSTART:19701025T040000\r\n". "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r\n"; }else { $timezone .= "DTSTART:19700101T000000\r\n"; } $timezone .= "END:STANDARD\r\n". "END:VTIMEZONE\r\n"; return $timezone; } function export_event($event_id, $with_timezones=true) { $ics = $this->export_calendar_header($with_timezones); $ics .= $this->convert_event($this->get_event($event_id)); $ics .= $this->export_calendar_footer(); return $ics; } function export_calendar($calendar_id) { $ics = $this->export_calendar_header(); $cal = new calendar(); $cal->get_events(false,true,false, $calendar_id); while($cal->next_record()) { $ics .= $this->convert_event($cal->Record); } $ics .= $this->export_calendar_footer(); return $ics; } function rfc2445_convert($string, $qp_enc=false) { //TODO: is there a better way? preg_replace? $string = str_replace("\r", '', $string); $string = str_replace("\n", '\n', $string); $string = str_replace(',', '\,', $string); $string = str_replace(';', '\;', $string); if($qp_enc) { $string = quoted_printable_encode($string); } /* if($this->version == '1.0') { $string = wordwrap($string, 72, "=\r\n "); }else { $string = wordwrap($string, 72, " \r\n "); }*/ $phpmailer = new PHPMailer(); $string = $phpmailer->WrapText($string, 72, $qp_enc); return $string; } function convert_event($event) { global $GO_CONFIG, $charset; if($this->timezone_id != '' || $this->local_times) { $timezone_offset = get_timezone_offset($event['start_time'])*3600; }else { $timezone_offset = 0; } $ical_event = "BEGIN:VEVENT\r\n". "UID:".$event['id']."\r\n"; $qp_summary = $this->rfc2445_convert($event['name'], true); $event['name'] =$this->rfc2445_convert($event['name']); if($event['name'] == $qp_summary) { $ical_event .= "SUMMARY:".$event['name']."\r\n"; }else { $ical_event .= "SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=$charset:\r\n=".$qp_summary."\r\n"; } if ($event['description'] != '') { $qp_description = $this->rfc2445_convert($event['description'], true); $event['description'] =$this->rfc2445_convert($event['description']); if($event['description'] == $qp_description) { $ical_event .= "DESCRIPTION:".$event['description']."\r\n"; }else { $ical_event .= "DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=$charset:\r\n=".$qp_description."\r\n"; } } if ($event['location'] != '') { $qp_location = $this->rfc2445_convert($event['location'], true); $event['location'] =$this->rfc2445_convert($event['location']); if($event['location'] == $qp_location) { $ical_event .= "LOCATION:".$event['location']."\r\n"; }else { $ical_event .= "LOCATION;ENCODING=QUOTED-PRINTABLE;CHARSET=$charset:\r\n=".$qp_location."\r\n"; } } $status = $this->get_status($event['status_id']); $ical_event .= "STATUS:".$status['name']."\r\n"; if($event['permissions'] == PRIVATE_EVENT) { $ical_event.="CLASS:PRIVATE\r\n"; }else { $ical_event.="CLASS:PUBLIC\r\n"; } if($this->version == '1.0' && $event['all_day_event'] == '1') { $ical_event .= "DTSTART:".date($this->datetime_format, $event['start_time'])."\r\n"; $ical_event .= "DTEND:".date($this->datetime_format, $event['start_time'])."\r\n"; }else { $DT_format = $event['all_day_event'] == '1' ? $this->date_format : $this->datetime_format; $ical_event .= "DTSTART"; if ($event['all_day_event'] == '1') { $ical_event .= ";VALUE=DATE"; } if($this->timezone_id != '') { $ical_event .= ";TZID=".$this->timezone_id.":".date($DT_format, $event['start_time']+$timezone_offset); }else { $ical_event .= ":".date($DT_format, $event['start_time']+$timezone_offset); if(!$this->local_times) $ical_event .= "Z"; } $ical_event .= "\r\nDTEND"; if ($event['all_day_event'] == '1') { $ical_event .= ";VALUE=DATE"; } if($this->timezone_id != '') { $ical_event .= ";TZID=".$this->timezone_id.":".date($DT_format, $event['end_time']+$timezone_offset); }else { $ical_event .= ":".date($DT_format, $event['end_time']+$timezone_offset); if(!$this->local_times) $ical_event .= "Z"; } $ical_event .= "\r\n"; } switch($event['repeat_type']) { case REPEAT_DAILY: if($this->version == '1.0') { $ical_event .= 'RRULE:D'.$event['repeat_every']; if ($event['repeat_forever'] == '0') { $ical_event .= ' '.date($this->datetime_format, $event['repeat_end_time']-86400).'Z'; }else { $ical_event .= ' #0'; } $ical_event .= "\r\n"; }else { $ical_event .= "RRULE:FREQ=DAILY;"; if ($event['repeat_forever'] == '0') { $ical_event .= "UNTIL=".date($this->date_format, $event['repeat_end_time']-86400)."Z;"; } $ical_event .= "INTERVAL=".$event['repeat_every']."\r\n"; } break; case REPEAT_WEEKLY: $event_days = array(); if ($event['sun'] == '1') { $event_days[] = "SU"; } if ($event['mon'] == '1') { $event_days[] = "MO"; } if ($event['tue'] == '1') { $event_days[] = "TU"; } if ($event['wed'] == '1') { $event_days[] = "WE"; } if ($event['thu'] == '1') { $event_days[] = "TH"; } if ($event['fri'] == '1') { $event_days[] = "FR"; } if ($event['sat'] == '1') { $event_days[] = "SA"; } if($this->version == '1.0') { $ical_event .= 'RRULE:W'.$event['repeat_every'].' '; $ical_event .= implode(' ', $event_days); if ($event['repeat_forever'] == '0') { $ical_event .= ' '.date($this->datetime_format, $event['repeat_end_time']).'Z'; }else { $ical_event .= ' #0'; } $ical_event .= "\r\n"; }else { $ical_event .= "RRULE:FREQ=WEEKLY;"; if ($event['repeat_forever'] == '0') { $ical_event .= "UNTIL=".date($this->date_format, $event['repeat_end_time']).";"; } $ical_event .= "INTERVAL=".$event['repeat_every'].";BYDAY="; $ical_event .= implode(',', $event_days)."\r\n"; } break; case REPEAT_MONTH_DATE: if($this->version == '1.0') { $ical_event .= 'RRULE:MD'.$event['repeat_every'].' '.date('j', $event['start_time']).'+'; if ($event['repeat_forever'] == '0') { $ical_event .= ' '.date($this->datetime_format, $event['repeat_end_time']).'Z'; }else { $ical_event .= ' #0'; } $ical_event .= "\r\n"; }else { $ical_event .= "RRULE:FREQ=MONTHLY;"; if ($event['repeat_forever'] == '0') { $ical_event .= "UNTIL=".date($this->date_format, $event['repeat_end_time']).";"; } $ical_event .= "INTERVAL=".$event['repeat_every']."\r\n"; } break; case REPEAT_MONTH_DAY: if($this->version == '1.0') { $event_days = array(); if ($event['sun'] == '1') { $event_days[] ="SU"; } if ($event['mon'] == '1') { $event_days[] = "MO"; } if ($event['tue'] == '1') { $event_days[] = "TU"; } if ($event['wed'] == '1') { $event_days[] = "WE"; } if ($event['thu'] == '1') { $event_days[] = "TH"; } if ($event['fri'] == '1') { $event_days[] = "FR"; } if ($event['sat'] == '1') { $event_days[] = "SA"; } $ical_event .= 'RRULE:MP'.$event['repeat_every'].' '.$event['month_time'].'+ '.$event_days[0]; if ($event['repeat_forever'] == '0') { $ical_event .= ' '.date($this->datetime_format, $event['repeat_end_time']).'Z'; }else { $ical_event .= ' #0'; } $ical_event .= "\r\n"; }else { $event_days = array(); if ($event['sun'] == '1') { $event_days[] = $event['month_time']."SU"; } if ($event['mon'] == '1') { $event_days[] = $event['month_time']."MO"; } if ($event['tue'] == '1') { $event_days[] = $event['month_time']."TU"; } if ($event['wed'] == '1') { $event_days[] = $event['month_time']."WE"; } if ($event['thu'] == '1') { $event_days[] = $event['month_time']."TH"; } if ($event['fri'] == '1') { $event_days[] = $event['month_time']."FR"; } if ($event['sat'] == '1') { $event_days[] = $event['month_time']."SA"; } $ical_event .= "RRULE:FREQ=MONTHLY;"; if ($event['repeat_forever'] == '0') { $ical_event .= "UNTIL=".date($this->date_format, $event['repeat_end_time']).";"; } $ical_event .= "INTERVAL=".$event['repeat_every'].";BYDAY="; $ical_event .= implode(',', $event_days)."\r\n"; } break; case REPEAT_YEARLY: if($this->version=='1.0') { $ical_event .= 'RRULE:YM'.$event['repeat_every'].' '.date('n',$event['start_time']); if ($event['repeat_forever'] == '0') { $ical_event .= ' '.date($this->datetime_format, $event['repeat_end_time']).'Z'; }else { $ical_event .= ' #0'; } $ical_event .= "\r\n"; }else { $ical_event .= "RRULE:FREQ=YEARLY;"; if ($event['repeat_forever'] == '0') { $ical_event .= "UNTIL=".date($this->date_format, $event['repeat_end_time']).";"; } $ical_event .= "INTERVAL=".$event['repeat_every'].";BYMONTH=".date('n', $event['start_time'])."\r\n"; } break; } $ical_event .= "DTSTAMP:".date($this->datetime_format, $event['ctime'])."\r\n". "X-GO-BGCOLOR:".$event['background']."\r\n". "END:VEVENT\r\n"; return $ical_event; }}?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -