Создание повторяющихся событий

Главные вкладки

Аватар пользователя samodelkin samodelkin 8 февраля 2014 в 11:45

Добрый день.
Стоит задача реализовать возможность автоматического повторного создания нод из уже существующих. При редактировании ноды выбрал "создавать ежемесячно" и "5-го числа" и данная нода будет в нужный день автоматом создаваться. Хотелось бы узнать есть ли готовые модули по реализации повторных событий? Функционал то вроде как часто востребованный.

Комментарии

Аватар пользователя samodelkin samodelkin 13 февраля 2014 в 15:36

"Mnilionic" wrote:
Ноды обязательно дублировать? может просто привязывать одну и ту же ноду к разным датам?

Дублировать обязательно.

"ХулиGUN" wrote:
Единственное, что можно посоветовать это модули date & brain

Пока пытаюсь разобраться с date repeat

Аватар пользователя samodelkin samodelkin 22 февраля 2014 в 15:28

У кого есть опыт работы с date_repeat? и date_repeat_field? не пойму как после обработки даты уменьшать список этих самых дат, что-бы больше их не обрабатывать?

Аватар пользователя samodelkin samodelkin 22 февраля 2014 в 15:54

Пока пришел к такому способу по крону будет выполнятся некий скрипт который из нужной мне ноды будет получать даты из date repeat fields и делать свои дела. Так вот нужно из этого списка убрать уже обработанные даты что-бы при следующем запуске крона они не выполнялись. Пока склоняюсь только к изменению даты старта. Может есть более правильный путь?

Аватар пользователя Mnilionic Mnilionic 22 февраля 2014 в 16:32

Суть модуля date_repeat не в том, что к ноде можно прикрепить список а дат, а в том что нода сотвествует некоторым датам следуя некоторым алгоритмам. Например, каждый вторник начиная с сегодня и до 1 июля... Третий вторник по крону не вычесть Smile
Если вам нужно работать именно со списками дат, используйте мультиполе с обыной датой. По крону удаляйте из списка обработанную.

Если у вас очень много дат и не очень много нод (которые дублируются по этим датам) может есть смысл сделать свой модуль соответствия id_ноды | дата | статус_обработки
По крону добавляете в табличку записи и обрабатываете уже добавленные.

Аватар пользователя samodelkin samodelkin 22 февраля 2014 в 16:44

Ну если вы посмотрите в начало публикации без date_repeat мне не обойтись. Мне как раз надо делать копию ноды по правилам который заданы в date_repet_field. Только вот как это реализовать я не пойму. date_repet_field - это множественное поле в котором будут перечислены все даты в зависимости от выбранных условий. Раз модуль их уже генерит я могу их использовать, но после использования мне нужно будет убирать те которые уже обработаны.

Информации по теме с гулькин нос, такое ощущение что ни кто не делал календарь с повторными событиями на друпал или еще что-нибуть где нужно задавать повторы по условиям.

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

Самое основное мне нужен собственный обработчик который будет выполнятся при наступлении события повторения. Я думал в date_repeat будет какой-нибуть хук который это делает но увы. Может плохо смотрел.

Аватар пользователя Mnilionic Mnilionic 22 февраля 2014 в 17:02

Ну тогда думайте как запомнить или вычесть уже обработанные даты.
Попробуйте после обработки смещать начало и/или конец даты повтора чтоб в диапазон не входили уже обработанные.
Если у вас, к примеру, установлено каждое 5 число каждого месяца начиная с февраля, то после каждого обработки смещайте на один месяц вычетая уже обработанный/прошедший.

Аватар пользователя Mnilionic Mnilionic 22 февраля 2014 в 19:08

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

Аватар пользователя samodelkin samodelkin 22 февраля 2014 в 19:21

Задача проста. Есть тип нод пусть будет "событие". В данном типе есть поле где мы задем правила когда нужно ее повторить. Для этого подходит date_repeat_field из состава модуля date. По данным правилам нам нужно выполнять некий код. Скажем поставили периодичность раз в месяц вот каждый месяц нам нужно выполнить "наш код" но периоды для разных нод могут быть свои. Вот и вся задача.

date_repeat вроде должен подойти,но я до конца не понимаю как его правильно заюзать.

Что касается date_repeat_field то он сразу генерит все даты согласно выбранному правилу и помещает их во множественное поле. Если скажем для 1000 нод задать правила и срок выбрать ежедневно на 5 лет то можете посчитать сколько записей сгенерится. Для других задач возможно и нужно генерить эти даты для моей достаточно сохранить правило которое выбрал пользователь и во время проверки генерить эти даты. хотя может это и не будет лучше.

Аватар пользователя Mnilionic Mnilionic 22 февраля 2014 в 19:55

Как эти "правила" будут фильтровать ноды в базе? Если даты не сгенерировать заранее, то вам придётся каждый день по крону загружать вашу 1000 нод, и в цикле у каждой запускать алгоритм соответствия сегодняшней дате. Будет ещё хуже Smile

В данном случае не вижу ничего плохого в том, что база разрастётся (поиск по дате работает очень быстро, текст занимает мало места)

Некошерный велосипед:
Как много у вас вариантов алгоритмов подсчёта дат? Может получиться абстрагироваться от дат и сохранять метки по какому-нибудь своего формату если используется только дневные абсолютные значение, например:
eD - каждый день
5D - каждое 5ое число каждого месяца ( 1D - 31D)

и делать простую выборку что-то типа cond = eD OR cond = date(d) + D
Smile

Аватар пользователя samodelkin samodelkin 22 февраля 2014 в 20:58

"ХулиGUN" wrote:
Зачем? В чём сакральный смысл?

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

"ХулиGUN" wrote:
Какой код?

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

"Mnilionic" wrote:
В данном случае не вижу ничего плохого в том, что база разрастётся (поиск по дате работает очень быстро, текст занимает мало места)

Похоже вы правы

"ХулиGUN" wrote:
Опишите конкретно Вашу задачу, если это не вселенская тайна)))

Задача как я уже писал проста, делать копии ноды по выбранным правилам (date_repeat_field) в автоматическом режиме что тут может быть непонятного?

Аватар пользователя samodelkin samodelkin 22 февраля 2014 в 22:52

"ХулиGUN" wrote:
Тип материала "задача"(В Вашем случае это заявка) без дублирования...
Тип материала "решение задачи" с референс полем по типу "задача" (Можете как программно создавать, так и в ручную. Для более детальной отчётности можно добавлять дату)

Это все таки не совсем то. Sad каждая заявка зарывается так или иначе.

Для себя выбрал такое решение:
Делаю новый тип материала повторные заявки как раз полем entity reference и полем date_repeat_field где пользователь будет задавать правила как ему нужно повторять заявку. через hook_cron напишу свою процедуру выборки нод для клонирования и других изменений. Ограничивать выполнение крона буду путем проверки и записи обработанной даты variable_set/variable_get
На текущий момент думаю этого будет достаточно, а проверки где повтор закончился и возможно какое-то автоматическое продление будем думать на потом.

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

Аватар пользователя Mnilionic Mnilionic 23 февраля 2014 в 15:32

"samodelkin" wrote:
Хотя на мой взгляд было бы правильнее генерить только дату ближайшего повтора а в момент наступления повтора генерить следующую дату повтора исходя из правила, так можно было бы получить неограниченное кол-во повторов.

Сами предложили идеальное решение. Принцип эстафеты.