Простая практичная PHP-логика для повторения - PullRequest
2 голосов
/ 27 февраля 2009

Я отправил это ранее , но, поскольку кто-то отказался от голосования и сказал, что он уже получен, никто не ответит.

Я знаю, что здесь есть похожие посты:

но они не отвечают на мой запрос, который представляет собой практический, простой и реальный пример логики для повторяющейся настройки календаря, без использования другой инфраструктуры или инструментов / сценариев, кроме прямого PHP и MySQL.

Я согласен, что эта статья http://martinfowler.com/apsupp/recurring.pdf хороша, но она настолько абстрактна, что я не могу ее понять.

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

Итак, вопрос: как мне создать повторяющийся календарь с использованием PHP и MySQL?

Ответы [ 2 ]

1 голос
/ 27 февраля 2009

Вы должны стремиться понять статью Фаулера. Это действительно покрывает это.

В том-то и дело, что это сложная проблема. Редактирование логики «на лету» - это не то, что пользователи действительно хотят делать. Скорее, они хотят, чтобы вы, как программист, предвидели, что они захотят сделать, и предоставили для него правило - они не хотят, например, выяснять, как вычислять вторую среду месяца. 1003 *

Похоже, ваша настоящая проблема заключается в моделировании повторения в MySQL. Вы можете использовать спецификацию Google , которая может быть сохранена в базе данных и ранее покрыта Stack Overflow. Часть Фаулера также предоставляет некоторые хорошие отправные точки с точки зрения четко определенных классов, которые могут быть представлены в СУБД.

Это сложная проблема. И хотя SO хочет, чтобы вы добились успеха, мы можем только привести вас в поток. Мы не можем заставить вас пить.

0 голосов
/ 02 марта 2009

Для практического, реального примера повторяющейся календарной логики посмотрите на свой КПК или его эквивалент.

Несколько лет назад я собрал календарь в интранет-приложении и в основном скопировал то, что было у моего Palm для повторяющихся опций. Это имело смысл для людей, поэтому я оценил это как успех. Но он не сохранил чистоту в базе данных. Мой код заканчивался множеством тщательных проверок на соответствие данных различным правилам, чтобы исправить ситуацию, если что-то выглядело неправильно. Помогло, что мы активно использовали это, поскольку я развивал это. :-)

Что касается хранения, запись календаря включала флаг, указывающий, является ли она частью повторяющейся серии или нет. Если это не так, это была неповторяющаяся запись. Если это так, то для редактирования у него было несколько вариантов, одним из которых было разорвать ряд в этой записи. Повторяющиеся записи были внесены в базу данных как отдельные элементы; это был тип денормализации, который был сделан из соображений производительности. Среди прочего, это означало, что другой код, который хотел проверить календарь, не должен был беспокоиться о повторяющихся элементах. Мы решили «бесконечную» проблему, всегда требуя даты окончания серии.

На самом деле для настройки повторяющихся элементов использовался некоторый JavaScript в пользовательском интерфейсе для управления различными настройками. Запись в базе данных имела комбинацию значений, чтобы указать область повторения (например, ежедневно, еженедельно, ...) повторяющегося шага (например, 1 неделя, 2 недели, ...) и любое изменение (например, еженедельно) «Понедельник, среда, четверг каждую неделю»).

Наконец, у нас была логика, которую я так и не смог полностью реализовать, которая обрабатывает часовые пояса и летнее время. Это сложно, потому что вы должны разрешить переключение выборочно. То есть, некоторые элементы календаря будут оставаться во времени локально для конечного пользователя, другие будут привязаны к определенному месту, и могут или не могут сдвигаться при переходе на летнее время. Я покинул эту компанию до того, как решил эту проблему.

Наконец, я отвечаю на это, потому что я не видел все остальные вопросы. :-) Но иди почитай и пойми, что PDF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...