Единичные/повторяющиеся расписания в моей CMS

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

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

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

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

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


person sKIPper76    schedule 10.02.2010    source источник
comment
С точки зрения пользовательского интерфейса вы должны проверить Календарь Google.   -  person Sonny    schedule 10.02.2010


Ответы (2)


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

person Jonathan Leffler    schedule 10.02.2010
comment
Я ознакомился с RFC. Это страшно. Просматривал это: kigkonsult.se/iCalcreator. Это библиотека PHP, совместимая с RFC 2445. Однако библиотека не выглядит простой в использовании. Все еще ищу что-нибудь попроще. - person sKIPper76; 10.02.2010
comment
@sKIPper76: Да, это страшно. Время обработки пугает. Меня раздражают программы-календари, которые дают мне варианты «изменить только этот», «более ранние» или «более поздние» (или «отменить»), когда я хочу изменить «следующие четыре из оставшихся пятнадцати». . Я бы не возражал против такой опции, как «другие правила», которые ведут к такой опции, но это довольно часто требуется. Также проверьте Календарь Google (но у него нет опции «следующие 4», которую я хотел бы). Идеи вместо ответов. - person Jonathan Leffler; 10.02.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

person seventeen    schedule 10.02.2010
comment
Я не уверен, что понял идею. Повторяющиеся расписания гораздо сложнее, чем ваше объяснение. И это то, с чем я боролся. Да, было бы неплохо, если бы я мог запросить базу данных, чтобы увидеть, есть ли какие-либо приближающиеся встречи, но мне нужно было бы знать, что хранить и как хранить это в первую очередь. Кроме того, список часовых поясов, которые предоставляет PHP, пугает. Я бы хотел, чтобы этот список был более удобным для пользователя — что-то вроде того, что Windows предлагает своим пользователям. - person sKIPper76; 10.02.2010
comment
Честно говоря, что касается проблемы с часовым поясом, мне кажется, что в этот момент трудно обойти стороной и сказать, что не повезло. Большинство библиотек не самые удобные для пользователя, какими могли бы быть. Просто так обстоят дела. Кроме того, см. Мое редактирование выше. Я включил несколько запросов, с которых вы могли бы попробовать начать. Я не сделал всю вашу работу, у меня нет на это времени, но я надеюсь, что дал вам лучшую отправную точку. - person seventeen; 11.02.2010