Добрый день.
Стоит задача реализовать возможность автоматического повторного создания нод из уже существующих. При редактировании ноды выбрал "создавать ежемесячно" и "5-го числа" и данная нода будет в нужный день автоматом создаваться. Хотелось бы узнать есть ли готовые модули по реализации повторных событий? Функционал то вроде как часто востребованный.
Комментарии
Ноды обязательно дублировать? может просто привязывать одну и ту же ноду к разным датам?
Дублировать обязательно.
Пока пытаюсь разобраться с date repeat
У кого есть опыт работы с date_repeat? и date_repeat_field? не пойму как после обработки даты уменьшать список этих самых дат, что-бы больше их не обрабатывать?
"как после обработки даты" какой обработки?
Пока пришел к такому способу по крону будет выполнятся некий скрипт который из нужной мне ноды будет получать даты из date repeat fields и делать свои дела. Так вот нужно из этого списка убрать уже обработанные даты что-бы при следующем запуске крона они не выполнялись. Пока склоняюсь только к изменению даты старта. Может есть более правильный путь?
Суть модуля date_repeat не в том, что к ноде можно прикрепить список а дат, а в том что нода сотвествует некоторым датам следуя некоторым алгоритмам. Например, каждый вторник начиная с сегодня и до 1 июля... Третий вторник по крону не вычесть
Если вам нужно работать именно со списками дат, используйте мультиполе с обыной датой. По крону удаляйте из списка обработанную.
Если у вас очень много дат и не очень много нод (которые дублируются по этим датам) может есть смысл сделать свой модуль соответствия id_ноды | дата | статус_обработки
По крону добавляете в табличку записи и обрабатываете уже добавленные.
Ну если вы посмотрите в начало публикации без date_repeat мне не обойтись. Мне как раз надо делать копию ноды по правилам который заданы в date_repet_field. Только вот как это реализовать я не пойму. date_repet_field - это множественное поле в котором будут перечислены все даты в зависимости от выбранных условий. Раз модуль их уже генерит я могу их использовать, но после использования мне нужно будет убирать те которые уже обработаны.
Информации по теме с гулькин нос, такое ощущение что ни кто не делал календарь с повторными событиями на друпал или еще что-нибуть где нужно задавать повторы по условиям.
Date_repet_fields мне подходит тем что не нужно писать свое поле которое будет задавать эти самые условия, только я не понимаю зачем они сразу все эти даты генерят база будет разрастаться не хила так.
Самое основное мне нужен собственный обработчик который будет выполнятся при наступлении события повторения. Я думал в date_repeat будет какой-нибуть хук который это делает но увы. Может плохо смотрел.
Ну тогда думайте как запомнить или вычесть уже обработанные даты.
Попробуйте после обработки смещать начало и/или конец даты повтора чтоб в диапазон не входили уже обработанные.
Если у вас, к примеру, установлено каждое 5 число каждого месяца начиная с февраля, то после каждого обработки смещайте на один месяц вычетая уже обработанный/прошедший.
К такому способу и склоняюсь, но как-то не кошерно на мой взгляд.
Если даты не генерить заранее, то как будет выборка из базы по этим датам происходить?
Расскажите подробнее о своей задаче, может её можно по другому пути решить.
Задача проста. Есть тип нод пусть будет "событие". В данном типе есть поле где мы задем правила когда нужно ее повторить. Для этого подходит date_repeat_field из состава модуля date. По данным правилам нам нужно выполнять некий код. Скажем поставили периодичность раз в месяц вот каждый месяц нам нужно выполнить "наш код" но периоды для разных нод могут быть свои. Вот и вся задача.
date_repeat вроде должен подойти,но я до конца не понимаю как его правильно заюзать.
Что касается date_repeat_field то он сразу генерит все даты согласно выбранному правилу и помещает их во множественное поле. Если скажем для 1000 нод задать правила и срок выбрать ежедневно на 5 лет то можете посчитать сколько записей сгенерится. Для других задач возможно и нужно генерить эти даты для моей достаточно сохранить правило которое выбрал пользователь и во время проверки генерить эти даты. хотя может это и не будет лучше.
Как эти "правила" будут фильтровать ноды в базе? Если даты не сгенерировать заранее, то вам придётся каждый день по крону загружать вашу 1000 нод, и в цикле у каждой запускать алгоритм соответствия сегодняшней дате. Будет ещё хуже
В данном случае не вижу ничего плохого в том, что база разрастётся (поиск по дате работает очень быстро, текст занимает мало места)
Некошерный велосипед:
Как много у вас вариантов алгоритмов подсчёта дат? Может получиться абстрагироваться от дат и сохранять метки по какому-нибудь своего формату если используется только дневные абсолютные значение, например:
eD - каждый день
5D - каждое 5ое число каждого месяца ( 1D - 31D)
и делать простую выборку что-то типа cond = eD OR cond = date(d) + D

Есть заявки пользователей которые они каждый день делают и есть регулярные которые они делают скажем раз в день. Что-бы их каждый раз не делать нужен механизм что-бы они создавались автоматом. Копия нужна обязательно т.к. это по сути отдельная заявка и не должна быть связана с другими.
В данном случае код который будет дублировать ноду, меняя некоторые поля, но это не имеет значения.
Похоже вы правы
Задача как я уже писал проста, делать копии ноды по выбранным правилам (date_repeat_field) в автоматическом режиме что тут может быть непонятного?
Это все таки не совсем то.
Для себя выбрал такое решение:
Делаю новый тип материала повторные заявки как раз полем entity reference и полем date_repeat_field где пользователь будет задавать правила как ему нужно повторять заявку. через hook_cron напишу свою процедуру выборки нод для клонирования и других изменений. Ограничивать выполнение крона буду путем проверки и записи обработанной даты variable_set/variable_get
На текущий момент думаю этого будет достаточно, а проверки где повтор закончился и возможно какое-то автоматическое продление будем думать на потом.
Хотя на мой взгляд было бы правильнее генерить только дату ближайшего повтора а в момент наступления повтора генерить следующую дату повтора исходя из правила, так можно было бы получить неограниченное кол-во повторов.
Сами предложили идеальное решение. Принцип эстафеты.