Комплект задачи cron и плагина "С днем рождения" для 1.10.6

+41
4.38K
Данный комплект позволяет поместить на стену профиля именинника открытку — поздравление.


Постановка задачи

Две недели назад на нашем форуме возникла вот такая тема. Мой друг Soul принялся делать очень хорошее дело — поздравлять именинников с днем рождения. Я тогда сказал, что надо бы написать задачу крон, которая будет поздравлять юбиляров автоматически.

Так у меня в голове родилось примерно такое ТЗ:
1. Поздравлялка должна запускаться от задачи cron и быть оформлена в виде плагина.
2. Скрипт постит открытку на стену профиля именинника.
3. Открытка содержит случайный рисунок (рисунки хранятся либо в папке images самого плагина, либо в другой папке, их количество заранее не известно).
4. Открытка содержит текст поздравления, который можно задать из админки плагина.
5. Открытка содержит подпись, которую можно задать из админки плагина.
6. Плагин помещает открытку имениннику в указанное в админке время, один раз в сутки (на сайте, который сейчас делаю, задача крон срабатывает каждый час).
7. Для адаптации к дизайну сайта размер картинки, обтекание текстом — должны задаваться свойствами css из админки плагина.
8. Аналогично для текста сообщения и подписи. Цвет и размер шрифта должны задаваться свойствами css из админки плагина.

Комплект

Комплект содержит:
1. Задачу cron. Это файл includes/myphp/happy_birthday.php содержит всего одну строчку, запускающую системное событие HAPPY_BIRTHDAY
2. Плагин. Папка плагина, кроме самого плагина plugins/p_happy_Birthday/plugin.php содержит еще две папки: images и timer.
— Папка images содержит рисунки. Я закинул туда пять рисунков (анимированные гифки), но вы можете забросить еще — сколько Вам надо. Имена файлов роли не играют. Плагин просматривает эту папку и берет из нее случайный рисунок, чтобы они в открытках не повторялись.
— Папка timer содержит единственный файл plugins\p_happy_Birthday\timer\timer.log. В этот файл плагин пишет себе заметку, что уже положил открытку на стенку имениннику. Это нужно для того, чтобы не бомбить именинника в каждое срабатывание задачи крон (читай — каждый час, если Планировщик настроен на срабатывание каждый час). Благодаря этому логу плагин поздравляет виновника один раз и затыкается. Он скромный.
3. Языковой файл плагина. В папке languages\ru\plugins\p_happy_Birthday.php. Думаю, тут все понятно — если вдруг захотите сделать язык админки плагина на английском, украинском или казахском языках (по крайней мере, я слышал о существовании этих локализаций).

Установка комплекта на сайт

Скачайте у меня архив и распакуйте его в корень сайта. Затем следует настроить Планировщик заданий на хостинге, задачу cron и установить плагин.

1. Настройка Планировщика заданий хостинга

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

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

2. Настройка задачи CRON.

Для настройки задачи cron из комплекта движка сайта идете в админку. Админка->Настройки->Задачи CRON. Нажимаете зеленый плюсик и создаете новую задачу (см. скриншот):
Иллюстрация

Здесь все понятно и очевидно, кроме одного момента — какой настроить интервал? На сайте, который я сейчас делаю, есть и другие задачи крон, которые должны срабатывать каждый час. Поэтому и Планировщик заданий на хостинге настроен на интервал один час. Согласитесь, было бы странно, если бы при такой настройке на стене пользователя в течение суток появлялось бы 24 открытки.

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

Чтобы Вам не ломать голову, подскажу примерное соотношение настроек Планировщика, интервала задачи CRON движка и настройки "Примерное время" плагина. Для корректной работы требуется, чтобы Планировщик срабатывал минимум раз в сутки (лучше несколько раз), интервал задачи CRON выставляете равным нулю (то есть задача запускается при каждом срабатывании Планировщика) и Примерное время плагина ставите так, чтобы оно было ПЕРЕД дневным срабатыванием Планировщика. Плагин при своем вызове сравнивает текущее время сервера с временем, зачитанным из своей настройки. Если время сервера больше или равно — тогда плагин помещает открытку на стену именинника. То есть, если Планировщик настроен на срабатывание в 0, 6, 12, 18 часов каждых суток, а вы оставите Примерное время 8:00, то открытка появится на стене именинника в 12:00.

3. Установка и настройка плагина

Установка плагина. Идите в админку Админка -> Дополнения -> Установить плагины.
Найдите данный плагин "С днем рождения!" и установите его, щелкнув по его названию.
Пройдите в Админка -> Дополнения -> Плагины и включите плагин.
По идее, он должен уже работать. Но админка плагина содержит некоторые настройки, которые Вы можете изменить, чтобы подогнать внешний вид открытки под дизайн своего сайта.
Настройки плагина
(см. скриншот ниже):
Иллюстрация
1. Введите текст сообщения. Тут естественно, сам текст поздравительной открытки. Можете писать, что хотите.
2. Введите подпись под сообщением. Аналогично. Можете вместо "Ваш админ" написать "Желаю много счастья Пух"
3. Укажите примерное время, когда поздравление поместить на стену. По умолчанию указано 8:00, но вы можете указать другое время, например, 13:43.
Примечание 1. Вообще то это время сервера (хостинга) и может отличаться от Вашего локального времени.
Примечание 2. Время указывается именно в таком формате час: минута. И никак иначе. Укажете иначе — работоспособность плагина я не гарантирую.
4. Укажите путь к папке с рисунками. Поскольку я рисунки — анимашки забросил в папку images плагина, то и указал путь к ней. Если вы вдруг решили изображения брать из другой папки, то пропишите здесь правильный путь к ней по приведенному образцу. Хотя я рекомендую просто в папку плагина с изображениями картинок накидать.
5. Дальше идет пять настроек css. Сюда можете писать свойства стилей для элементов по схеме:
Иллюстрация
При тех настройках, что Вы видите по умолчанию, открытка будет выглядеть примерно так (не забудьте, что рисунок случайный):
Иллюстрация

Как скачать.

Скачать можно бесплатно, то есть даром, из моего профиля тут.

Куда говорить спасибо

яд 410011913797936
wmr 342960323367
карточка сбербанка 67619600 0308703785

Удачи в программировании.
HostelB HostelB 8 лет назад #
Комментарий удален
+1
Rossoman Rossoman 8 лет назад #
Спасибо!
+3
letsgo letsgo 8 лет назад #
Спасибо Странник. Дело очень нужное. Надо просить теперь Fuze обратить внимание и встроить в дистрибьютив.
+1
Владимир Савенко ✝️ Владимир Савенко ✝️ 8 лет назад #
Молодец!
Огромное дело сделал.
Скромно и ненавязчиво напоминаю о нашем разговоре про оповещение друзьям на электронку или личным сообщением о дне рождения.друга.
Забыл? Или это будет в следующей версии?
+3
Странник Странник 8 лет назад #
Нет, не забыл. Причина чисто техническая. Данный плагин делает выборку из базы именно в день рождения. А напоминалка должна делать это за день, или два, или три (в зависимости от настроек). Там совсем другой sql-запрос получается. Я решил не делать окрошки, а довести до ума этот плагин.
Теперь так же потихоньку буду писать напоминалку. Второй плагин будет запускаться от той же задачи крон, что и первый, но работать отдельно. У такого решения есть еще один плюс в том, что админ сайта может решить, что первый плагин ему нужен, а второй нет - или наоборот.

Мне еще со вторым плагином (а, возможно, и с первым) придется решить одну этическую проблему. Как быть, если пользователь указал в своем профиле "не показывать дня рождения"? Все равно поздравлять или нет? Сейчас первый плагин поздравляет все равно. Я могу, конечно модифицировать плагин, чтобы он молчал, если ДР в профиле скрывается. Меня очень торопили с его опубликованием, пришлось публиковать "как есть".
Что мне сообщество подскажет?
+2
Владимир Савенко ✝️ Владимир Савенко ✝️ 8 лет назад #
Я думаю напоминание заранее - можно и не делать. Пусть будет сообщение "Сегодня Ваш друг такой то празднует свой день рождения".
А торопиться не надо. Лучше медленно но верно)))
Олег Васильевич я Олег Васильевич я 8 лет назад #
Комментарий удален
+2
Майкл Майкл 8 лет назад #
+ Спасибо, Странник!
Очень ждали!!!
0
Майкл Майкл 8 лет назад #
Всё хорошо, но может кто-то подскажет что нужно сделать, чтобы информацию о появлении записи на стене пользователя о поздравлении с Днем рождения появлялась общей ленте активности?
+1
Странник Странник 8 лет назад #
Мне тоже интересно, подскажет кто-нибудь нашему Майклу или нет?
+1
Майкл Майкл 8 лет назад #
Не-а, никто не подсказал hoho
Зажали подсказки laugh
0
Александр Александр 8 лет назад #
Уважаемый Странник, очень интересный плагин у вас получился, мои поздравления.

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

А ваш отправляет личное сообщение? (П,С. а то не все смотрят свою стену, даже я лично будучи, что после авторизации перебрасывает на профиль)
+2
Странник Странник 8 лет назад #
Спасибо.
Про хак от Марата не знал, благодарю, что подсказали.
0
Александр Александр 8 лет назад #
Теперь вы знаете всё)))
да пожалуйста,
вам огромное спасибо, что делитесь с сообществом своими прекрасными дополнениями!
0
Майкл Майкл 8 лет назад #
Пытаюсь сделать появление записи в общей ленте активности
Вставляю код
Код PHP:
  1. cmsCore::loadClass('actions');
в строку 72 файла plugins/p_happy_Birthday/plugin.php
Ничего не происходит, кто знает почему? scratch
+2
Странник Странник 8 лет назад #
Потому что вы подключили класс... и все.
+3
Странник Странник 8 лет назад #
Я вижу, сообщество от меня просит, чтобы я реализовал еще следующие действия:
1. Оповещение друзей именинника о том, что у пользователя день рождения. Оповещение идет на емайл всех друзей именинника, и одновременно в личку. В связи с этим вопрос: это должно происходить именно в день дня рождения или за один (два, три) дня?

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

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

Поэтому спрашиваю: какой из двух вариантов мне делать?

2. Майкл отдельно хочет, чтобы в Ленте событий появлялась запись о поздравлении имярек с днюхой. Мне странно, почему он к сообществу обращается, а не ко мне (вроде я не монстр и не кусаюсь).

Вопрос такой: кому нибудь кроме Майкла это нужно? Если нужно, я внесу в плагин эту функцию. Если нет - буду ждать от Майкла внятного обращения))))
+2
Нил™ Нил™ 8 лет назад #
До сих пор старался не лезть со своим особым мнением, оно заключается в том, что автоматические поздравления от различных сайтов и сервисов лично меня не радуют, и подобную опцию считаю пустой. Но напоминание друзьям это ж другое дело)) По вопросу 1) Думаю напоминание в день события где нибудь в начале суток достаточно . Есть целые сутки что бы поздравить друга. И вам меньше работы ж.
0
Александр Александр 8 лет назад #
Считаю если в ленте запись не выходит, то это минус, по идеи если бы вы сами поздравляли, то она бы там была. Это правильно, хорошо бы добавить ^^
Оповещение конечно нужно, а что тут плохого? еще бы на почту приходило им было бы еще лучше.

И можно как у Марата, чтоб приходило личное сообщение с поздравлением и отсылалось на почту, а там типа загляните к нам на сайт мы вас поздравили посмотрите на своей стене и ссылка. ну или не знаю как лучше. главное ЛС еще читают, а вот я свою стенку раз в неделю смотрю, хотя на своём сайте бываю утром и ночью иногда и весь день, то есть 2 раза в день точно, почти все своё свободное время, что то делаю и приглядываю за ним.

Хорошо бы, сразу оповещение друзьям, оповещение пользователю, всем письма счастья на почту)))
+3
Странник Странник 8 лет назад #
Еще вопрос. Нужно ли мне модифицировать плагин, чтобы он поздравлял только тех именинников, которые хотят, чтобы их поздравляли? Другими словами, поставить срабатывание плагина в зависимость от содержания поля showbirth таблицы cms_user_profiles? Другими словами, в зависимости от настройки профиля "Показывать дату рождения"?
+1
Майкл Майкл 8 лет назад #
нет, не нужно!
+1
Александр Александр 8 лет назад #
поддерживаю Майкла, пусть всех поздравляет)))
0
Майкл Майкл 8 лет назад #
Раз всех, тогда в общей ленте активности инфа нужна)))
Чего-то сам потыкался и не получилось в ленту активности сие дело внедрить sad
+2
Странник Странник 8 лет назад #
сперва сделаю оповещение друзей по почте и ЛС. эту функцию большее число народа просят. а потом сделаю внесение записи в ленту активности.
Майкл, прошу понять меня правильно, я сейчас занят в большом проекте и очень устаю. Этот плагин я делал в свободное время, отрывая от сна))))
+1
Pasha Pasha 8 лет назад #
Как-то тема мимо прошла, я вот такую ерунду пару лет назад уже делал. Могу переписать под 1.10.6 и выложить чтобы не мучаться.
+2
Soul Soul 8 лет назад #
Хоть и недельным опозданием, выскажусь и я..
Странник, спасибо от всего сообщества за проделанную работу и за поддержку темы.
Работа в данном направлении велась не раз..., но до актуальной версии icms не дошла (к сожалению) ни одна... тем ценнее для сообщества Ваша работа.
+2
Странник Странник 8 лет назад #
Надо же! Пользователь, пожелавший остаться неизвестным, мне перевел небольшую денежку за этот плагин. Пишет, чтобы я все-таки напоминалку сделал. Я так понял, Пашина напоминалка ему не по нраву (хотя лично мне она нравится).

Придется делать. Только мне подробное ТЗ нужно. Точнее, следует расписать, каким образом напоминать (email, ЛС, в ленте активности или на стену), кому (друзьям, всем, зареганым), за сколько (неделя, три дня или в день рождения) и в зависимости от настроек профиля именинника (отправлять ли напоминание, если юзер в профиле выключил показ ДР)?
+1
Soul Soul 8 лет назад #
:) очередное подтверждение того, что работа проделана не зря.
0
Странник Странник 8 лет назад #
В эту же обоймуеще один плагин, рассылающий письма на мыло друзьям именинника. Новый плагин срабатывает от того же системного события, что и этот, и оба могут работать как вместе, так и порознь.

Еще от автора

Адаптация компонента "Закладки" от 19 января 2011 к коробочной версии 1.10.7
На форуме появилась тема с пожеланиями адаптировать довольно старый компонент "Instant Bookmarks" Fuze к современным реалиям.
Утилита "Садовод" для версии InstantCMS 1.10.7.008
В этой краткой заметке описывается утилита "Садовод" для ремонта деревьев версии InstantCMS 1.10.7.008.
Изменение компонента "Баннеры" для будущей  версии 1.10.7.008
Данная статья рассказывает всем ждущим новую версию 008, что нового ожидается в будущем релизе версии 1.10.7.008.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.