Единственные / Повторяющиеся Расписания в моей CMS - PullRequest
1 голос
/ 10 февраля 2010

Я создаю CMS, которая требует, чтобы пользователи могли хранить расписания. Интерфейс похож на MS Outlook, поэтому повторяющиеся расписания в значительной степени должны имитировать то, что может поддерживать этот пользовательский интерфейс.

Когда расписание сохранено, нам нужно как-то предупредить, когда должно произойти событие. Прямо сейчас планируется запускать задачу cron каждую минуту, чтобы проверить, не запланировано ли событие в эту минуту.

Поскольку наши пользователи будут со всего мира, нам нужна эта система планирования с учетом часового пояса и DST.

Кроме того, возможность преобразования этого расписания в читабельный текст (например, «Каждый день в 9 утра с 1 января 2010 года по 1 февраля 2010 года») была бы полезной для наших пользователей.

У кого-нибудь есть идеи, как это реализовать? Я использую PHP / MySQL.

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Ваш вопрос больше похож на сообщение на доске вакансий, в котором кто-то просто пишет ваше приложение для вас.

Это действительно не так сложно, что вы пытаетесь сделать. Просто настройте таблицу MySQL для хранения приложений, включая, возможно, имя, описание, начальную временную метку, конечную временную метку и «повторяющийся» логический тип. используйте Ajax для запроса к базе данных, в любой промежуток времени, который вы хотите увидеть, если есть какие-либо приближающиеся встречи. если это правда, уведомить пользователя.

для форматирования времени, вы можете сделать что-то вроде этого:

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

1 голос
/ 10 февраля 2010

Посмотрите на спецификацию iCalendar , чтобы узнать, что можно указать ...

...