calendar.class.inc

来自「国外很不错的一个开源OA系统Group-Office」· INC 代码 · 共 2,387 行 · 第 1/5 页

INC
2,387
字号
	  	$this->query($sql);	  	if($this->next_record())	  	{	  		return $this->f('id');	  	}	  	return false;	  }	  function update_event($event)	  {	  	unset($event['read_permission'], $event['write_permission']);	  	if(!isset($event['mtime']) || $event['mtime'] == 0)	  	{	  		$event['mtime']  = get_gmt_time();	  	}	  	if(isset($event['completion_time']) && $event['completion_time'] > 0 && $this->copy_completed($event['id']))	  	{	  		$event['repeat_type'] = REPEAT_NONE;	  		$event['repeat_end_time'] = 0;	  	}	  	if(isset($event['exceptions']))	  	{	  		$this->delete_exceptions($event['id']);	  		foreach($event['exceptions'] as $exception_time)	  		{	  			if($exception_time!==false)	  			{	  				$exception['event_id']=$event['id'];	  				$exception['time']=$exception_time;	  				$this->add_exception($exception);	  			}	  		}	  		unset($event['exceptions']);	  	}	  	return $this->update_row('cal_events', 'id', $event);	  }	  function clear_subscriptions($event_id)	  {	  	$sql = "DELETE FROM cal_events_calendars WHERE event_id='$event_id'";	  	return $this->query($sql);	  }	  function subscribe_event($event_id, $calendar_id)	  {	  	$sql = "INSERT INTO cal_events_calendars (calendar_id, event_id) VALUES ('$calendar_id','$event_id')";	  	$this->query($sql);	  	$update_event['id'] = $event_id;	  	$update_event['mtime'] = get_gmt_time();	  	return $this->update_event($update_event);	  }	  function unsubscribe_event($event_id, $calendar_id)	  {	  	$sql = "DELETE FROM cal_events_calendars WHERE calendar_id='$calendar_id' AND event_id='$event_id'";	  	return $this->query($sql);	  }	  function event_is_subscribed($event_id, $calendar_id)	  {	  	$sql = "SELECT * FROM cal_events_calendars WHERE event_id='$event_id' AND calendar_id='$calendar_id'";	  	$this->query($sql);	  	return $this->next_record();	  }	  function get_event_subscribtions($event_id)	  {	  	$sql = "SELECT * FROM cal_events_calendars WHERE event_id='$event_id'";	  	$this->query($sql);	  	return $this->num_rows();	  }	  function get_calendars_from_event($event_id)	  {	  	$sql = "SELECT id,name,background FROM cal_calendars INNER JOIN cal_events_calendars ".	  	"ON cal_events_calendars.calendar_id=cal_calendars.id ".	  	"WHERE cal_events_calendars.event_id='$event_id'";	  	$this->query($sql);	  	return $this->num_rows();	  }	  function get_remind_time($user_id, $event_id)	  {	  	$sql = "SELECT remind_time FROM cal_reminders WHERE event_id='$event_id' AND user_id='$user_id'";	  	$this->query($sql);	  	if($this->next_record())	  	{	  		return $this->f('remind_time');	  	}	  	return false;	  }	  function add_reminder($reminder)	  {	  	return $this->insert_row('cal_reminders', $reminder);	  }	  function update_reminder($user_id, $event_id, $remind_time)	  {	  	return $this->query("UPDATE cal_reminders SET remind_time='$remind_time',email_sent='0' WHERE user_id='$user_id' AND event_id='$event_id'");	  }	  function reminder_mail_sent($user_id, $event_id)	  {	  	return $this->query("UPDATE cal_reminders SET email_sent='1' WHERE user_id='$user_id' AND event_id='$event_id'");	  }	  function delete_reminder($user_id, $event_id)	  {	  	return $this->query("DELETE FROM cal_reminders WHERE user_id='$user_id' AND event_id='$event_id'");	  }	  function delete_reminders($user_id)	  {	  	return $this->query("DELETE FROM cal_reminders WHERE user_id='$user_id'");	  }	  /*	   returns next starting time of an event in GMT timezone	   */	   function get_next_recurrence_time($event_id, $gmt_time=0, $event='')	   {	   	//echo date('Ymd G:i', $gmt_time);	   	if ($event == '')	   	{	   		if(!$event = $this->get_event($event_id))	   		{	   			return false;	   		}	   	}	   	if ($gmt_time == 0)	   	{	   		$gmt_time = get_gmt_time();	   	}	   	if($gmt_time<0)	   	{	   		$gmt_time=0;	   	}	   	$event_tzo = $event['timezone'];	   	//Daily event going into other dst zone fail	   	//if ($event['DST'] > 0 && date('I', $event['start_time']) != 0) {	   	if ($event['DST'] > 0 && date('I', $gmt_time) != 0) {	   		$event_tzo += $event['DST'];	   	}	   	$event = $this->shift_days_to_local($event, $event_tzo);	   	$event_tzo=$event_tzo*3600;	   	$event['start_time'] += $event_tzo;	   	$gmt_time += $event_tzo;	   	//echo ' -> '.date('Ymd G:i', $gmt_time).'<br />';	   	if ($event['repeat_forever'] == '0' && ($event['repeat_end_time'] < $gmt_time && $event['repeat_type'] != REPEAT_NONE))	   	{	   		return 0;	   	}	   	$duration = 0;//$event['end_time']-$event['start_time'];	   	if ($event['start_time'] > $gmt_time && $event['repeat_type'] != REPEAT_NONE)	   	{	   		$start_time = $event['start_time']-$duration;	   	}else	   	{	   		$start_time = $gmt_time;	   	}	   	$original_tzo = get_timezone_offset($event['start_time']);	   	$year = date('Y', $start_time);	   	$month = date('n', $start_time);	   	$day = date('j', $start_time);	   	$event['start_year'] = date('Y', $event['start_time']);	   	$event['start_month'] = date('n', $event['start_time']);	   	$event['start_day'] = date('j', $event['start_time']);	   	$event['start_hour'] = date('G', $event['start_time']);	   	$event['start_min'] = date('i', $event['start_time']);	   	$day_db_field[0] = 'sun';	   	$day_db_field[1] = 'mon';	   	$day_db_field[2] = 'tue';	   	$day_db_field[3] = 'wed';	   	$day_db_field[4] = 'thu';	   	$day_db_field[5] = 'fri';	   	$day_db_field[6] = 'sat';	   	switch($event['repeat_type'])	   	{	   		case REPEAT_NONE:	   			if($event['start_time'] > $gmt_time)	   			{	   				return $event['start_time']-$event_tzo;	   			}else	   			{	   				return 0;	   			}	   			break;	   		case REPEAT_WEEKLY:	   			if ($event['repeat_every'] > 1)	   			{	   				$interval = $start_time - $event['start_time'];	   				$interval_weeks = floor($interval/604800);	   				$devided = $interval_weeks/$event['repeat_every'];	   				$rounded = ceil($devided);	   				$last_repeat_week = $event['repeat_every']*$rounded*604800;	   				$last_occurence_week = $event['start_time']+$last_repeat_week;	   				$year = date('Y', $last_occurence_week);	   				$month = date('n', $last_occurence_week);	   				$day = date('j', $last_occurence_week);	   			}else	   			{	   				$last_occurence_week= $start_time;	   			}	   			$weekday = date("w", $last_occurence_week);	   			for ($loop=0;$loop<2;$loop++)	   			{	   				$day_add=$loop*$event['repeat_every']*7;	   				for ($i=0;$i<7;$i++)	   				{	   					if ($weekday>6)	   					{	   						$weekday -= 7;	   					}	   					if ($event[$day_db_field[$weekday]] == '1')	   					{	   						$occurence_time = mktime($event['start_hour'], $event['start_min'], 0, $month, $day+$i+$day_add, $year);	   						$new_tzo = get_timezone_offset($occurence_time);	   						$diff = ($original_tzo-$new_tzo)*3600;	   						$occurence_time += $diff;	   						if ($event['repeat_forever'] == '0' && ($occurence_time > $event['repeat_end_time']))	   						{	   							return 0;	   						}elseif ($occurence_time > $gmt_time)	   						{	   							return $occurence_time-$event_tzo;	   						}	   					}	   					$weekday++;	   				}	   			}	   			break;	   		case REPEAT_DAILY:	   			if ($event['repeat_every'] > 1)	   			{	   				$interval = $start_time - $event['start_time'];	   				$interval_days = floor($interval/86400);	   				$devided = $interval_days/$event['repeat_every'];	   				$rounded = ceil($devided);	   				$last_repeat_day = $event['repeat_every']*$rounded*86400;	   				$last_occurence_day = $event['start_time']+$last_repeat_day;	   				$year = date('Y', $last_occurence_day);	   				$month = date('n', $last_occurence_day);	   				$day = date('j', $last_occurence_day);	   			}	   			$occurence_time = mktime($event['start_hour'], $event['start_min'], 0, $month, $day, $year);	   			//echo date('Ymd G:i', $occurence_time).'<br>';	   			$new_tzo = get_timezone_offset($occurence_time);	   			$diff = ($original_tzo-$new_tzo)*3600;	   			$occurence_time += $diff;	   			//echo date('Ymd G:i', $occurence_time).'  '.date('Ymd G:i', $start_time).'<br />';	   			if ($occurence_time <= $gmt_time)	   			{	   				$occurence_time =  mktime($event['start_hour'], $event['start_min'], 0, $month, $day+$event['repeat_every'], $year);	   				$new_tzo = get_timezone_offset($occurence_time);	   				$diff = ($original_tzo-$new_tzo)*3600;	   				$occurence_time += $diff;	   			}	   			//echo date('Ymd', $occurence_time).'  '.date('Ymd', $start_time).'<br />';	   			if ($event['repeat_forever'] == '0' && $occurence_time > $event['repeat_end_time'])	   			{	   				return 0;	   			}else	   			{	   				return $occurence_time-$event_tzo;	   			}	   			break;	   		case REPEAT_MONTH_DATE:	   			if ($event['repeat_every'] > 1)	   			{	   				$interval_years = $year-date('Y', $event['start_time']);	   				$interval_months = $month - date('n', $event['start_time']);	   				$interval_months = 12*$interval_years+$interval_months;	   				$devided = $interval_months/$event['repeat_every'];	   				$rounded = ceil($devided);	   				$last_repeat_month = $event['repeat_every']*$rounded;	   				$repeat_year = date('Y', $event['start_time']);	   				$repeat_month = date('n', $event['start_time']);	   				$repeat_day = date('j', $event['start_time']);	   				$last_occurence_month = mktime(0,0,0, $repeat_month+$last_repeat_month, $repeat_day, $repeat_year);	   			}else	   			{	   				$last_occurence_month = $start_time;	   			}	   			$year = date('Y', $last_occurence_month);	   			$month = date('n', $last_occurence_month);	   			$occurence_time = 0;//mktime($event['start_hour'], $event['start_min'], 0, $month, $event['start_day'], $year);	   			while ($occurence_time <= $gmt_time)	   			{	   				$occurence_time = mktime($event['start_hour'], $event['start_min'], 0, $month, $event['start_day'], $year);	   				$new_tzo = get_timezone_offset($occurence_time);	   				$diff = ($original_tzo-$new_tzo)*3600;	   				$occurence_time += $diff;	   				/*echo '&nbsp;&nbsp;&nbsp;'.date('j', $occurence_time).' '.$event['start_day'].' '.date('Ymd G:i', $occurence_time).'<br>';	   				 //while(date('j', $occurence_time) != $event['start_day'])	   				 {	   				 $month+=$event['repeat_every'];	   				 $occurence_time = mktime($event['start_hour'], $event['start_min'], 0, $month, $event['start_day'], $year);	   				 $new_tzo = get_timezone_offset($occurence_time);	   				 $diff = ($original_tzo-$new_tzo)*3600;	   				 $occurence_time += $diff;	   				 echo '&nbsp;&nbsp;&nbsp;'.date('j', $occurence_time).' '.$event['start_day'].' '.date('Ymd G:i', $occurence_time).'<br>';	   				 }	*/	   				$month+=$event['repeat_every'];	   			}	   			if ($event['repeat_forever'] == '0' && $occurence_time > $event['repeat_end_time'])	   			{	   				return 0;	   			}else	   			{	   				return $occurence_time-$event_tzo;	   			}	   			break;	   		case REPEAT_MONTH_DAY:	   			if ($event['repeat_every'] > 1)	   			{	   				$interval_years = $year-date('Y', $event['start_time']);	   				$interval_months = $month - date('n', $event['start_time']);	   				$interval_months = 12*$interval_years+$interval_months;	   				$devided = $interval_months/$event['repeat_every'];	   				$rounded = ceil($devided);	   				$last_repeat_month = $event['repeat_every']*$rounded;	   				$repeat_year = date('Y', $event['start_time']);	   				$repeat_month = date('n', $event['start_time']);	   				$repeat_day = date('j', $event['start_time']);	   				$last_occurence_month = mktime(0,0,0, $repeat_month+$last_repeat_month, $repeat_day, $repeat_year);	   				//echo '&nbsp;&nbsp;&nbsp;'.date('Ymd', $last_occurence_month).' == '.$month.'<br>';	   			}else	   			{	   				$last_occurence_month = $start_time;	   			}	   			$year = date('Y', $last_occurence_month);	   			$month = date('n', $last_occurence_month);	   			$day = date('j', $last_occurence_month);	   			for($m=$month;$m<=($month+$event['repeat_every']);$m+=$event['repeat_every'])	   			{	   				//echo $m.'<br>';	   				for($d=0;$d<31;$d++)	   				{	   					//$occurence_time = mktime($event['start_hour'], $event['start_min'], 0, $m, $day+$d, $year);	   					$occurence_time = mktime($event['start_hour'], $event['start_min'], 0, $m, $d, $year);	   					$new_tzo = get_timezone_offset($occurence_time);	   					$diff = ($original_tzo-$new_tzo)*3600;	   					$occurence_time += $diff;	   					//echo date('Ymd', $occurence_time).' == '.$month.'<br>';	   					$weekday = date("w", $occurence_time);	   					//echo date('Ymd', $occurence_time).' == '.$weekday.'<br>';	   					if ($event[$day_db_field[$weekday]] == '1')	   					{	   						//echo ceil(date('j',$occurence_time)/7).' = '.$event['month_time'].'<br>';	   						if (ceil(date('j',$occurence_time)/7) == $event['month_time'])	   						{	   							if ($event['repeat_forever'] == '0' && $occurence_time > $event['repeat_end_time'])	   							{	   								return 0;	   							}elseif ($occurence_time > $gmt_time)	   							{	   								//echo 'FOUND: '.date('Ymd G:i', $occurence_time).'<br>';	   								return $occurence_time-$event_tzo;	   							}	   						}	   					}	   				}	   			}	   			break;	   		case REPEAT_YEARLY;	   		if ($event['repeat_every'] > 1)	   		{	   			$interval_years = $year-date('Y', $event['start_time']);	   			$devided = $interval_years/$event['repeat_every'];	   			$rounded = ceil($devided);	   			$last_repeat_year = $event['repeat_every']*$rounded;	   			$repeat_year = date('Y', $event['start_time']);	   			$repeat_month = date('n', $event['start_time']);	   			$repeat_day = date('j', $event['start_time']);	   			$last_occurence_year = mktime(0,0,0, $repeat_month, $repeat_day, $repeat_year+$last_repeat_year);	   		}else	   		{	   			$last_occurence_year = $start_time;	   		}	   		$year = date('Y', $last_occurence_year);	   		$occurence_time = mktime($event['start_hour'], $event['start_min'], 0, $event['start_month'], $event['start_day'], $year);	   		$new_tzo = get_timezone_offset($occurence_time);	   		$diff = ($original_tzo-$new_tzo)*3600;	   		$occurence_time += $diff;	   		if ($occurence_time <= $gmt_time)	   		{	   			$occurence_time = mktime($event['start_hour'], $event['start_min'], 0, $event['start_month'], $event['start_day'], $year+$event['repeat_every']);	   			$new_tzo = get_timezone_offset($occurence_time);	   			$diff = ($original_tzo-$new_tzo)*3600;	   			$occurence_time += $diff;	   		}	   		//echo $event['repeat_every']. ': '.$event['name'].' '.date('Ymd G:i', $occurence_time).' '.date('Ymd G:i', $start_time).' <br />';	   		if ($event['repeat_forever'] == '0' && $occurence_time > $event['repeat_end_time'])	   		{	   			return 0;	   		}else	   		{	   			return $occurence_time-$event_tzo;	   		}	   		break;	   	}	   }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?