📄 calendar.class.inc
字号:
<?php/*Copyright Intermesh 2003Author: Merijn Schering <mschering@intermesh.nl>Version: 1.0 Release date: 08 July 2003This 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.*/define('REPEAT_NONE', 0);define('REPEAT_DAILY', 1);define('REPEAT_WEEKLY', 2);define('REPEAT_MONTH_DATE', 3);define('REPEAT_MONTH_DAY', 4);define('REPEAT_YEARLY', 5);define('DB_DATETIME_FORMAT', 'Y-m-d H:i:00');define('DB_DATE_FORMAT', 'Y-m-d');define('DB_TIME_FORMAT', 'H:i:00');define('PARTICIPANTS_WRITE', '0');define('EVERYBODY_READ', '1');define('EVERYBODY_WRITE', '2');define('PRIVATE_EVENT', '3');define('CUSTOM', '4');require_once($GO_CONFIG->class_path.'xml/xml.class.inc');class calendar extends db{ var $events = array(); var $events_sort = array(); //used to sort the events at start_time var $all_day_events = array(); var $backgrounds = array(); function calendar() { $this->db(); } function get_statuses($type='VEVENT') { $sql = "SELECT * FROM cal_statuses WHERE type='$type'"; $this->query($sql); return $this->num_rows(); } function get_status($status_id) { $sql = "SELECT * FROM cal_statuses WHERE id='$status_id'"; $this->query($sql); if($this->next_record()) { return $this->Record; } return false; } function get_status_id($name) { $sql = "SELECT * FROM cal_statuses WHERE name='$name'"; $this->query($sql); if($this->next_record()) { return $this->f('id'); } return false; } function add_custom_field($group_id, $field) { $existing_group = $this->get_group($group_id); if($existing_group['custom_fields'] == '') { $existing_group ['custom_fields'] = '<fields></fields>'; } $fieldsNode = text_to_xml ($existing_group['custom_fields']); $field['id'] = count($fieldsNode->children())+1; $fieldsNode->new_child('input', $field); $group['id'] = $group_id; $group['custom_fields'] = mysql_escape_string($fieldsNode->get_xml()); if($this->update_group($group)) { return $field['id']; } return false; } function group_values_to_xml($values, $group_id) { $doc = text_to_xml('<fields></fields>'); $custom_fields = $this->get_custom_fields($group_id); foreach( $custom_fields as $inputNode) { $types[$inputNode->get_attribute('name')] = $inputNode->get_attribute('type'); $value = isset($values[$inputNode->get_attribute('name')]) ? $values[$inputNode->get_attribute('name')] : ''; $doc->new_child('input', array('name'=>$inputNode->get_attribute('name'), 'type'=>$inputNode->get_attribute('type'), 'value'=>$value)); } return $doc->get_xml(); } function group_xml_to_values($xml) { $values = array(); if(!empty($xml)) { $doc = text_to_xml($xml); foreach($doc->children() as $input) { $value = array('name'=>$input->get_attribute('name'), 'type'=>$input->get_attribute('type'), 'value'=>$input->get_attribute('value')); $values[] = $value; } } return $values; } function get_custom_fields($group_id) { $group = $this->get_group($group_id); if($group['custom_fields'] == '') { $group ['custom_fields'] = '<fields></fields>'; } $fieldsNode = text_to_xml ($group['custom_fields']); return $fieldsNode->children(); } function delete_custom_field($group_id, $custom_field_id) { $newxml = text_to_xml('<fields></fields>'); $fields = $this->get_custom_fields($group_id); $id=1; foreach($fields as $input) { if($input->get_attribute('id') != $custom_field_id) { $newxml->new_child('input', array('id'=>$id, 'name'=>$input->get_attribute('name'), 'type'=>$input->get_attribute('type'))); $id++; } } $group['id'] = $group_id; $group['custom_fields'] = mysql_escape_string($newxml->get_xml()); return $this->update_group($group); } function update_custom_field($group_id, $field) { $existing_group = $this->get_group($group_id); if($existing_group['custom_fields'] == '') { $existing_group ['custom_fields'] = '<fields></fields>'; } $xml = text_to_xml ($existing_group['custom_fields']); for($i=0;$i<$xml->_children;$i++) { if($xml->_children[$i]->get_attribute('id') == $field['id']) { $xml->_children[$i]->_attribs=$field; $group['id'] = $group_id; $group['custom_fields'] = mysql_escape_string($xml->get_xml()); return $this->update_group($group); } } return false; } function get_custom_field($group_id, $field_id) { $fields = $this->get_custom_fields($group_id); for($i=0;$i<$fields;$i++) { if($fields[$i]->get_attribute('id') == $field_id) { return $fields[$i]->_attribs; } } return false; } function add_group_admin($group_id, $user_id) { $sql = "INSERT INTO cal_group_admins VALUES('$group_id', '$user_id');"; return $this->query($sql); } function delete_group_admin($group_id, $user_id) { $sql = "DELETE FROM cal_group_admins WHERE group_id='$group_id' AND user_id='$user_id';"; return $this->query($sql); } function get_group_admins($group_id) { $sql = "SELECT * FROM cal_group_admins WHERE group_id='$group_id'"; $this->query($sql); return $this->num_rows(); } function get_resource_groups() { $sql = "SELECT * FROM cal_groups WHERE id!=1 ORDER BY name ASC"; $this->query($sql); return $this->num_rows(); } function get_writable_resource_groups($user_id) { $sql = "SELECT DISTINCT cal_groups.* FROM cal_groups ". "INNER JOIN acl ON cal_groups.acl_write = acl.acl_id ". "LEFT JOIN users_groups ON acl.group_id=users_groups.group_id ". "WHERE (acl.user_id=$user_id ". "OR users_groups.user_id=$user_id) ". "AND cal_groups.id!=1 ORDER BY name ASC"; $this->query($sql); return $this->num_rows(); } function get_groups() { $sql = "SELECT * FROM cal_groups ORDER BY name ASC"; $this->query($sql); return $this->num_rows(); } function add_group($group) { $group['id'] = $this->nextid('cal_groups'); if($group['id'] && $this->insert_row('cal_groups',$group)) { return $group['id']; } } function get_event_resources($event_id) { if($event_id>0) { $sql = "SELECT cal_events.*,cal_events_calendars.calendar_id FROM cal_events ". "INNER JOIN cal_events_calendars ON cal_events.id=cal_events_calendars.event_id ". "WHERE cal_events.event_id='$event_id'"; $this->query($sql); return $this->num_rows(); } return false; } function get_event_resource($event_id, $calendar_id) { if($event_id>0 && $calendar_id>0) { $sql = "SELECT cal_events.*,cal_events_calendars.calendar_id FROM cal_events ". "INNER JOIN cal_events_calendars ON cal_events.id=cal_events_calendars.event_id ". "WHERE cal_events.event_id='$event_id' AND cal_events_calendars.calendar_id='$calendar_id'"; $this->query($sql); if($this->next_record()) { return $this->Record; } } return false; } function update_group($group) { return $this->update_row('cal_groups', 'id', $group); } function delete_group($group_id) { $cal = new calendar(); $this->get_calendars($group_id); while($this->next_record()) { $cal->delete_calendar($this->f('id')); } return $this->query("DELETE FROM cal_groups WHERE id='$group_id'"); } function get_group($group_id) { $sql = "SELECT * FROM cal_groups WHERE id='$group_id'"; $this->query($sql); if($this->next_record()) { return $this->Record; } return false; } function get_group_by_name($group_name) { $sql = "SELECT * FROM cal_groups WHERE name='$group_name'"; $this->query($sql); if($this->next_record()) { return $this->Record; } return false; } function copy_completed($event_id) { global $GO_SECURITY, $GO_LINKS; /* If a recurring task is completed we copy it to a new task and recur that again */ $event = $this->get_event($event_id); if($event['repeat_type'] > REPEAT_NONE && $next_recurrence_time = $this->get_next_recurrence_time(0,$event['start_time'] ,$event)) { unset($event['completion_time'], $event['id']); $old_link_id = $event['link_id']; $event['link_id'] = $GO_LINKS->get_link_id(); $GO_LINKS->copy_links($old_link_id, $event['link_id'] , 1); $old_acl_read = $event['acl_read']; $old_acl_write = $event['acl_write']; $event['acl_read'] = $GO_SECURITY->get_new_acl('Event read'); $event['acl_write'] = $GO_SECURITY->get_new_acl('Event write'); $GO_SECURITY->copy_acl($old_acl_read, $event['acl_read']); $GO_SECURITY->copy_acl($old_acl_write, $event['acl_write']); $duration = $event['end_time']-$event['start_time']; $event['start_time'] = $next_recurrence_time; $event['end_time'] = $next_recurrence_time+$duration; if(!isset($event['todo']) || $event['todo'] == '') { $event['todo'] = '0'; } if($new_event_id = $this->add_event($event)) { $cal = new calendar(); $this->get_event_subscribtions($event_id); while($this->next_record()) { $cal->subscribe_event($new_event_id, $this->f('calendar_id')); } } } return true; } function copy_event($event_id, $new_values=array()) { global $GO_SECURITY; if($src_event = $dst_event = $this->get_event($event_id)) { unset($dst_event['id']); $dst_event['acl_read'] = $GO_SECURITY->get_new_acl('event read'); $dst_event['acl_write'] = $GO_SECURITY->get_new_acl('event write'); $GO_SECURITY->copy_acl($src_event['acl_read'], $dst_event['acl_read']); $GO_SECURITY->copy_acl($src_event['acl_write'], $dst_event['acl_write']); foreach($new_values as $key=>$value) { $dst_event[$key] = $value; } $dst_event = array_map('addslashes', $dst_event); return $this->add_event($dst_event); } return false; } /* takes a sting YYYY-MM-DD HH:MM in GMT time and converts it to an array with hour, min etc. with a timezone offset. If 0000 or 00 is set in a date (not time) then it will be replaced with current locale date. */ function explode_datetime($datetime_stamp, $timezone_offset) { $local_time = get_time(); $datetime_array = explode(' ', $datetime_stamp); $date_stamp = $datetime_array[0]; $time_stamp = isset($datetime_array[1]) ? $datetime_array[1] : '00:00:00'; $date_array = explode('-',$date_stamp); $year = $date_array[0] == '0000' ? date('Y', $local_time) : $date_array[0]; $month = $date_array[1] == '00' ? date('n', $local_time) : $date_array[1]; $day = $date_array[2] == '00' ? date('j', $local_time) : $date_array[2];; $time_array = explode(':',$time_stamp); $hour = $time_array[0]; $min = $time_array[1]; $unix_time = mktime($hour, $min, 0, $month, $day, $year); $unix_time = $unix_time+($timezone_offset*3600); $result['year'] = date('Y', $unix_time); $result['month'] = date('n', $unix_time); $result['day'] = date('j', $unix_time); $result['hour'] = date('G', $unix_time); $result['min'] = date('i', $unix_time); return $result; } function add_view($user_id, $name, $start_hour, $end_hour, $event_colors_override, $time_interval, $acl_read, $acl_write) { $view_id = $this->nextid("cal_views"); if ($view_id > 0) { $sql = "INSERT INTO cal_views (id, user_id, name, start_hour, end_hour, event_colors_override, time_interval, acl_read, acl_write) ". "VALUES ('$view_id', '$user_id', '$name', '$start_hour', '$end_hour', '$event_colors_override', '$time_interval', '$acl_read', '$acl_write')"; $this->query($sql); return $view_id; } return false; } function update_view($view_id, $name, $start_hour, $end_hour, $event_colors_override, $time_interval) { $sql = "UPDATE cal_views SET name='$name', start_hour='$start_hour', ". "end_hour='$end_hour', event_colors_override='$event_colors_override', time_interval='$time_interval' WHERE id='$view_id'"; return $this->query($sql); } function delete_view($view_id) { if($this->query("DELETE FROM cal_views_calendars WHERE view_id='$view_id'")) { return $this->query("DELETE FROM cal_views WHERE id='$view_id'"); } } function get_user_views($user_id) { $sql = "SELECT * FROM cal_views WHERE user_id='$user_id'"; $this->query($sql); return $this->num_rows(); } function get_authorized_views($user_id) { $sql = "SELECT DISTINCT cal_views . * ". "FROM cal_views ". " INNER JOIN acl ON ( cal_views.acl_read = acl.acl_id ". "OR cal_views.acl_write = acl.acl_id ) ". "LEFT JOIN users_groups ON acl.group_id = users_groups.group_id ". "WHERE acl.user_id=$user_id ". "OR users_groups.user_id=$user_id". " ORDER BY cal_views.name ASC"; $this->query($sql); return $this->num_rows(); } function get_writable_views($user_id) { $sql = "SELECT DISTINCT cal_views . * ". "FROM cal_views ". " INNER JOIN acl ON cal_views.acl_write = acl.acl_id ". "LEFT JOIN users_groups ON acl.group_id = users_groups.group_id ". "WHERE acl.user_id=$user_id ". "OR users_groups.user_id=$user_id". " ORDER BY cal_views.name ASC"; $this->query($sql); return $this->num_rows(); } function get_view($view_id) { $sql = "SELECT * FROM cal_views WHERE id='$view_id'"; $this->query($sql); if($this->next_record()) { return $this->Record; } return false; } function get_view_calendars($view_id) { $sql = "SELECT cal_calendars.name, cal_calendars.user_id, cal_calendars.id, cal_views_calendars.background FROM cal_calendars ". "INNER JOIN cal_views_calendars ON cal_calendars.id=cal_views_calendars.calendar_id ". "WHERE cal_views_calendars.view_id='$view_id' ORDER BY cal_calendars.name ASC"; $this->query($sql); $calendars = array(); while($this->next_record()) { $calendars[] = $this->Record; } if(isset($calendars)) { return $calendars; } } function add_calendar_to_view($calendar_id, $background, $view_id) { $sql = "INSERT INTO cal_views_calendars (view_id, background, calendar_id) ". "VALUES ('$view_id' ,'$background', '$calendar_id')"; return $this->query($sql); } function remove_calendar_from_view($calendar_id, $view_id) { $sql = "DELETE FROM cal_views_calendars WHERE calendar_id='$calendar_id' AND view_id='$view_id'"; return $this->query($sql); } function remove_calendars_from_view($view_id) { $sql = "DELETE FROM cal_views_calendars WHERE view_id='$view_id'"; return $this->query($sql); } function get_view_calendar($calendar_id, $view_id) { $sql = "SELECT * FROM cal_views_calendars WHERE calendar_id='$calendar_id' AND view_id='$view_id'"; $this->query($sql); if($this->next_record()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -