我的CMS中的单一/重复计划

时间:2010-02-10 18:25:22

标签: php mysql calendar icalendar google-calendar-api

我正在构建一个要求允许用户存储计划的CMS。该界面类似于MS Outlook,因此重复计划几乎需要模仿该UI可以支持的内容。

当保存计划时,我们需要以某种方式在事件发生时发出警报。现在,计划是每分钟运行一次cron作业,以检查是否在那一刻安排了一个事件。

由于我们的用户来自世界各地,我们需要此调度系统为时区和DST感知。

此外,将此时间表转换为人类可读文本的能力(例如“2010年1月1日上午9点至2010年2月1日的每一天”)对我们的用户来说都是不错的。

有没有人有任何想法如何实现这个?我正在使用PHP / MySQL。

2 个答案:

答案 0 :(得分:1)

查看iCalendar规范,了解可以指定的内容......

答案 1 :(得分:1)

您的问题看起来更像是职位发布的帖子,要求某人为您编写应用程序。

这真的不是那么复杂,你要做的是什么。只需设置一个MySQL表来存储appts,包括名称,描述,开始时间戳,结束时间戳和“重复”布尔值。使用Ajax查询数据库,您希望在任何时间间隔查看是否有任何即将到来的约会。如果为true,则通知用户。

对于时间格式,您可以执行以下操作:

function format_date($timestamp1, $timestamp2,$repeating) {
    $str = "";
    if($repeating) {
        $str .= "Every Day";
    }
    $str .= "From ".date("g:i a",$timestamp1)." To ".date("g:i a",$timestamp2);
    return ($str);
}

以下是您可以查看的一些查询以及一些表创建SQL:

CREATE TABLE `appointments` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL,
    `description` text,
    `recurring` int(11) DEFAULT NULL,
    `recurrence_type` varchar(50) DEFAULT NULL,
    `starting_timestamp` int(14) DEFAULT NULL,
    `ending_timestamp` int(14) DEFAULT NULL,
    `end_recurring_timestamp` int(14) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

mysql_query("SELECT * FROM appointments 
WHERE recurring=0 
AND starting_timestamp <= ". time() + 86400 ." 
AND starting_timestamp > ". time() ." 
ORDER BY starting_timestamp DESC");

mysql_query("SELECT * FROM appointments 
WHERE recurring=1 
AND recurrence_type='DAILY' 
AND starting_timestamp <= ". time() + 86400 ." 
AND end_recurring_timestamp > ". time() ." 
ORDER BY starting_timestamp DESC");

每周和每月的重复将更复杂,并且可能需要在SQL查询之外进行操作。这可能意味着更高的开销。

对于此示例,我将日期存储为时间戳。但是,将它们存储为字符串并使用strtotime()之类的东西可能更合理。虽然,我不知道这个功能有多可靠。

你可以得到这个想法。至于时区支持,请查看http://www.ultramegatech.com/blog/2009/04/working-with-time-zones-in-php/http://www.php.net/manual/en/class.datetimezone.php