Recurring Events in FullCalendar

后端 未结 8 1121
独厮守ぢ
独厮守ぢ 2020-11-22 09:49

I am using jQuery FullCalendar as my calendar used in my website for availability agenda.

Is there any functions/methods/options in fullcalendar that handles my recu

8条回答
  •  时光取名叫无心
    2020-11-22 10:22

    At the moment I'm doing project where I have FullCalendar and I have to do Recurring events. So this is my why how it's can be done. Hope this code help someone:)

    I have next table in database:

    CREATE TABLE IF NOT EXISTS `app_ext_calendar_events` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `users_id` int(11) NOT NULL,
      `name` varchar(255) NOT NULL,
      `description` text,
      `start_date` int(11) NOT NULL,
      `end_date` int(11) NOT NULL,
      `event_type` varchar(16) NOT NULL,
      `is_public` tinyint(1) DEFAULT NULL,
      `bg_color` varchar(16) DEFAULT NULL,
      `repeat_type` varchar(16) DEFAULT NULL,
      `repeat_interval` int(11) DEFAULT NULL,
      `repeat_days` varchar(16) DEFAULT NULL,
      `repeat_end` int(11) DEFAULT NULL,
      `repeat_limit` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_users_id` (`users_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;
    

    and I developed next php class to get events with repeat events:

    ='" . $date_from . "' and  FROM_UNIXTIME(end_date,'%Y-%m-%d')<='" . $date_to . "' and event_type='" . $calendar_type . "' and users_id='" . db_input($app_user['id']) . "'");
        while($events = db_fetch_array($events_query))
        {
          $list[] = $events; 
        }
    
        if(count($repeat_events_list = calendar::get_repeat_events($date_to,$calendar_type)))
        {
          $list = array_merge($list,$repeat_events_list);
        }
    
        return $list;
      }
    
      public static function weeks_dif($start, $end)
      {
        $year_start = date('Y',$start);
        $year_end = date('Y',$end);
    
        $week_start = date('W',$start); 
        $week_end = date('W',$end);
    
        $dif_years = $year_end - $year_start;
        $dif_weeks = $week_end - $week_start;
    
        if($dif_years==0 and $dif_weeks==0)
        {
          return 0;
        }
        elseif($dif_years==0 and $dif_weeks>0)
        {
          return $dif_weeks;
        }
        elseif($dif_years==1)
        {
          return (42-$week_start)+$week_end;
        }
        elseif($dif_years>1)
        {
          return (42-$week_start)+$week_end+(($dif_years-2)*42);
        }
    
    
      }
    
      public static function months_dif($start, $end)
      {
        // Assume YYYY-mm-dd - as is common MYSQL format
        $splitStart = explode('-', date('Y-n',$start));
        $splitEnd = explode('-', date('Y-n',$end));
    
        if (is_array($splitStart) && is_array($splitEnd)) 
        {
            $startYear = $splitStart[0];
            $startMonth = $splitStart[1];
            $endYear = $splitEnd[0];
            $endMonth = $splitEnd[1];
    
            $difYears = $endYear - $startYear;
            $difMonth = $endMonth - $startMonth;
    
            if (0 == $difYears && 0 == $difMonth) 
            { // month and year are same
                return 0;
            }
            else if (0 == $difYears && $difMonth > 0) 
            { // same year, dif months
                return $difMonth;
            }
            else if (1 == $difYears) 
            {
                $startToEnd = 13 - $startMonth; // months remaining in start year(13 to include final month
                return ($startToEnd + $endMonth); // above + end month date
            }
            else if ($difYears > 1) 
            {
                $startToEnd = 13 - $startMonth; // months remaining in start year 
                $yearsRemaing = $difYears - 2;  // minus the years of the start and the end year
                $remainingMonths = 12 * $yearsRemaing; // tally up remaining months
                $totalMonths = $startToEnd + $remainingMonths + $endMonth; // Monthsleft + full years in between + months of last year
                return $totalMonths;
            }
        }
        else 
        {
          return false;
        }
      }
    
      public static function get_repeat_events($date_to,$calendar_type)
      {
        global $app_user;
    
        //convert date to timestamp
        $date_to_timestamp = get_date_timestamp($date_to);
    
        $list = array();
    
        //get all events that already started (start_date<=date_to)      
        $events_query = db_query("select * from app_ext_calendar_events where length(repeat_type)>0 and FROM_UNIXTIME(start_date,'%Y-%m-%d')<='" . $date_to . "' and  event_type='" . $calendar_type . "' and users_id='" . db_input($app_user['id']) . "'");
        while($events = db_fetch_array($events_query))
        {
          $start_date = $events['start_date'];
    
          //set repeat end      
          $repeat_end = false;
          if($events['repeat_end']>0)
          {
            $repeat_end = $events['repeat_end'];
          } 
    
          //get repeat events by type                       
          switch($events['repeat_type'])
          {
            case 'daily': 
                //check repeat events day bay day       
                for($date = $start_date; $date<=$date_to_timestamp; $date+=86400)            
                {
                  if($date>$start_date)
                  {
                    $dif = round(abs($date-$start_date)/86400);
    
                    if($dif>0)
                    {  
                      $event_obj = $events;                                                
                      $event_obj['start_date'] = strtotime('+' . $dif . ' day',$event_obj['start_date']);                                                          
                      $event_obj['end_date'] = strtotime('+' . $dif . ' day',$event_obj['end_date']);
    
                      if(calendar::check_repeat_event_dif($dif,$event_obj,$repeat_end))
                      {                
                        $list[] = $event_obj;                
                      }
                    }
                  }
                }                                                          
              break;
            case 'weekly':  
                //check repeat events day bay day    
                for($date = $start_date; $date<=$date_to_timestamp; $date+=86400)            
                {
                  if($date>$start_date)
                  {
                    //find days dif
                    $dif = round(abs($date-$start_date)/86400);
                    //find week dif
                    $week_dif = calendar::weeks_dif($start_date, $date);
    
                    if($dif>0 and (in_array(date('N',$date),explode(',',$events['repeat_days']))))
                    {  
                      $event_obj = $events;                                                
                      $event_obj['start_date'] = strtotime('+' . $dif . ' day',$event_obj['start_date']);                                                          
                      $event_obj['end_date'] = strtotime('+' . $dif . ' day',$event_obj['end_date']);
    
                      if(calendar::check_repeat_event_dif($week_dif,$event_obj,$repeat_end))
                      {                
                        $list[] = $event_obj;                
                      }
                    }
                  }
                }                       
    
              break;            
            case 'monthly':                        
                /**
                 *in calendar we display 3 month in one view
                 *so we have to check difference for each month
                 */
    
                 //check 1                                      
                $date_to_timestamp2 = strtotime('-2 month',$date_to_timestamp);
    
                $dif =  calendar::months_dif($start_date, $date_to_timestamp2);
    
                if($dif>0)
                {  
                  $event_obj = $events;                                                
                  $event_obj['start_date'] = strtotime('+' . $dif . ' month',$event_obj['start_date']);                                                          
                  $event_obj['end_date'] = strtotime('+' . $dif . ' month',$event_obj['end_date']);
    
                  if(calendar::check_repeat_event_dif($dif,$event_obj,$repeat_end))
                  {                
                    $list[] = $event_obj;                
                  }
                }
    
                //check 2
                $date_to_timestamp1 = strtotime('-1 month',$date_to_timestamp);
    
                $dif =  calendar::months_dif($start_date, $date_to_timestamp1);
    
                if($dif>0)
                {  
                  $event_obj = $events;                                                
                  $event_obj['start_date'] = strtotime('+' . $dif . ' month',$event_obj['start_date']);                                                          
                  $event_obj['end_date'] = strtotime('+' . $dif . ' month',$event_obj['end_date']);
    
                  if(calendar::check_repeat_event_dif($dif,$event_obj,$repeat_end))
                  {                
                    $list[] = $event_obj;                
                  }
                }
    
                //check 3
                $dif =  calendar::months_dif($start_date, $date_to_timestamp);
    
                if($dif>0)
                {     
                  $event_obj = $events;                                             
                  $event_obj['start_date'] = strtotime('+' . $dif . ' month',$event_obj['start_date']);                                                          
                  $event_obj['end_date'] = strtotime('+' . $dif . ' month',$event_obj['end_date']);
    
                  if(calendar::check_repeat_event_dif($dif,$event_obj,$repeat_end))
                  {                                
                    $list[] = $event_obj;
                  }
                }
    
              break;
            case 'yearly':                        
                $dif =  date('Y',$date_to_timestamp)-date('Y',$start_date);
    
                if($dif>0)
                {             
                  $events['start_date'] = strtotime('+' . $dif . ' year',$events['start_date']);                                                          
                  $events['end_date'] = strtotime('+' . $dif . ' year',$events['end_date']);
    
                  if(calendar::check_repeat_event_dif($dif,$events,$repeat_end))
                  {
                    $list[] = $events;
                  }
                }                                                                                               
              break;
          }            
    
        }
    
        return $list;
    
      }
    
      static public function check_repeat_event_dif($dif,$events,$repeat_end)
      {
        $check = true;
    
        if($dif>0)
        {
          //check interval
          if($dif/$events['repeat_interval']!=floor($dif/$events['repeat_interval'])) $check=false;            
    
          //check repeat limit
          if($events['repeat_limit']>0)            
          if(floor($dif/$events['repeat_interval'])>$events['repeat_limit']) $check=false;
        }
        else
        {
          $check=false; 
        } 
    
        //check repeat end date            
        if($repeat_end>0)
        {
          if($repeat_end<$events['start_date'])
          {
             $check=false;
          }
        }
    
        return $check;
      }  
    
    }
    

    function get_events get all events + recurring events in my way there are 4 type of recurring events: daily, weekly, monthly,yearly + there is repeat interval, repeat date end and repeat limit.

    function get_repeat_events calculate difference for each type of event and include repeat event if exist.

    note: function db_query() can be replace to myslq_query or something else

    to prepare events to FullCalendar I'm using next code

    $list = array();        
    
      foreach(calendar::get_events($_GET['start'],$_GET['end'],'personal') as $events)
      {
        $start = date('Y-m-d H:i',$events['start_date']);
        $end = date('Y-m-d H:i',$events['end_date']);
    
    
        $list[] = array('id' => $events['id'],
                      'title' => addslashes($events['name']),
                      'description' => str_replace(array("\n\r","\n","\r"),'
    ',$events['description']), 'start' => str_replace(' 00:00','',$start), 'end' => str_replace(' 00:00','',$end), 'color'=> $events['bg_color'], 'allDay'=>(strstr($start,'00:00') and strstr($end,'00:00')), 'url' => url_for('ext/calendar/personal_form','id=' . $events['id']) ); } echo json_encode($list);

提交回复
热议问题