modern-events-calendar-lite/app/libraries/schedule.php

162 lines
No EOL
5.6 KiB
PHP
Executable file

<?php
/** no direct access **/
defined('MECEXEC') or die();
/**
* Webnus MEC schedule class.
* @author Webnus <info@webnus.net>
*/
class MEC_schedule extends MEC_base
{
private $db;
private $main;
private $render;
public function __construct()
{
$this->db = $this->getDB();
$this->main = $this->getMain();
$this->render = $this->getRender();
}
public function cron()
{
// Get All Events
$events = $this->main->get_events();
// Append Schedule for Events
foreach($events as $event)
{
$maximum = 50;
$repeat_type = get_post_meta($event->ID, 'mec_repeat_type', true);
// Reschedule Schedule for Normal and Custom Days Events
if($repeat_type === '' or $repeat_type === 'custom_days') $this->reschedule($event->ID, 200);
else $this->append($event->ID, $maximum);
}
}
public function reschedule($event_id, $maximum = 200)
{
// Clean Current Schedule
$this->clean($event_id);
// Event Start Date
$start = get_post_meta($event_id, 'mec_start_date', true);
if(trim($start) == '' or $start == '0000-00-00') $start = date('Y-m-d', strtotime('-1 Year'));
else $start = date('Y-m-d', strtotime('-1 Day', strtotime($start)));
// New Schedule
$this->schedule($event_id, $start, $maximum);
}
public function append($event_id, $maximum = 25)
{
// Get Start Date
$start = $this->time($event_id, 'max', 'Y-m-d');
// Don't create dates more than next 7 years!
if(strtotime($start) > strtotime('+7 years', current_time('timestamp', 0))) return;
// Append Schedule
$this->schedule($event_id, $start, $maximum);
}
public function schedule($event_id, $start, $maximum = 100)
{
// Get event dates
$dates = $this->render->dates($event_id, NULL, $maximum, $start);
// No new date found!
if(!is_array($dates) || !count($dates)) return false;
// All Day Event
$allday = get_post_meta($event_id, 'mec_allday', true);
// Public Event
$public = get_post_meta($event_id, 'mec_public', true);
if(trim($public) === '') $public = 1;
// Create Public Column If Not Exists
if(!$this->db->columns('mec_dates', 'public')) $this->db->q("ALTER TABLE `#__mec_dates` ADD `public` INT(4) UNSIGNED NOT NULL DEFAULT 1 AFTER `tend`;");
foreach($dates as $date)
{
$sd = $date['start']['date'];
$ed = $date['end']['date'];
$start_hour = isset($date['start']['hour']) ? sprintf("%02d", $date['start']['hour']) : '08';
$start_minute = isset($date['start']['minutes']) ? sprintf("%02d", $date['start']['minutes']) : '00';
$start_ampm = $date['start']['ampm'] ?? 'AM';
if($start_hour == '00')
{
$start_hour = '';
$start_minute = '';
$start_ampm = '';
}
$start_time = $start_hour.':'.$start_minute.' '.$start_ampm;
$end_hour = isset($date['end']['hour']) ? sprintf("%02d", $date['end']['hour']) : '06';
$end_minute = isset($date['end']['minutes']) ? sprintf("%02d", $date['end']['minutes']) : '00';
$end_ampm = $date['end']['ampm'] ?? 'PM';
if($end_hour == '00')
{
$end_hour = '';
$end_minute = '';
$end_ampm = '';
}
$end_time = $end_hour.':'.$end_minute.' '.$end_ampm;
// All Day Event
if($allday)
{
$start_time = '12:01 AM';
$end_time = '11:59 PM';
}
$st = strtotime(trim($date['start']['date'].' '.$start_time, ' :'));
$et = strtotime(trim($date['end']['date'].' '.$end_time, ' :'));
$date_id = $this->db->select("SELECT `id` FROM `#__mec_dates` WHERE `post_id`='$event_id' AND `tstart`='$st' AND `tend`='$et'", 'loadResult');
// Add new Date
if(!$date_id) $this->db->q("INSERT INTO `#__mec_dates` (`post_id`,`dstart`,`dend`,`tstart`,`tend`,`public`) VALUES ('$event_id','$sd','$ed','$st','$et','$public');");
// Update Existing Record
else $this->db->q("UPDATE `#__mec_dates` SET `tstart`='$st', `tend`='$et', `public`='$public' WHERE `id`='$date_id';");
}
return true;
}
public function clean($event_id)
{
// Remove All Scheduled Dates
return $this->db->q("DELETE FROM `#__mec_dates` WHERE `post_id`='$event_id'");
}
public function time($event_id, $type = 'max', $format = 'Y-m-d')
{
$time = $this->db->select("SELECT ".(strtolower($type) == 'min' ? 'MIN' : 'MAX')."(`tstart`) FROM `#__mec_dates` WHERE `post_id`='$event_id'", 'loadResult');
if(!$time) $time = time();
return date($format, $time);
}
public function get_reschedule_maximum($repeat_type)
{
if($repeat_type == 'daily') return 370;
elseif($repeat_type == 'weekday') return 270;
elseif($repeat_type == 'advanced') return 250;
elseif($repeat_type == 'weekend') return 200;
elseif($repeat_type == 'certain_weekdays') return 200;
elseif($repeat_type == 'weekly') return 100;
elseif($repeat_type == 'monthly') return 50;
elseif($repeat_type == 'yearly') return 50;
else return 50;
}
}