Alex Trofimov 9 лет назад
Родитель
Сommit
ed77caeb3c

+ 3 - 0
modules/base/groups/classes/BxBaseModGroupsFormsEntryHelper.php

@@ -72,6 +72,9 @@ class BxBaseModGroupsFormsEntryHelper extends BxBaseModProfileFormsEntryHelper
 
     protected function inviteMembers ($oGroupProfile, $aInitialProfiles)
     {
+        if (!$aInitialProfiles)
+            return;
+
         // insert invited members, so they will join without confirmation
         foreach ($aInitialProfiles as $iProfileId) {
             if (!($oProfile = BxDolProfile::getInstance($iProfileId)))

+ 1 - 0
modules/boonex/events/classes/BxEventsConfig.php

@@ -114,6 +114,7 @@ class BxEventsConfig extends BxBaseModProfileConfig
             'EMAIL_ADMIN_BECOME_FAN' => 'bx_events_admin_become_fan',
             'EMAIL_FAN_REMOVE' => 'bx_events_fan_remove',
             'EMAIL_JOIN_REJECT' => 'bx_events_join_reject',
+            'EMAIL_REMINDER' => 'bx_events_reminder',
 
             'TRIGGER_MENU_PROFILE_VIEW_SUBMENU' => 'trigger_group_view_submenu',
             'TRIGGER_MENU_PROFILE_VIEW_ACTIONS' => 'trigger_group_view_actions',

+ 20 - 0
modules/boonex/events/classes/BxEventsCronProcessReminders.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Events Events
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxEventsCronProcessReminders extends BxDolCron
+{
+    function processing()
+    {
+        BxDolService::call('bx_events', 'process_reminders');
+    }
+}
+
+/** @} */

+ 3 - 1
modules/boonex/events/classes/BxEventsDb.php

@@ -96,7 +96,7 @@ class BxEventsDb extends BxBaseModGroupsDb
                 $aBindings['event'] = (int)$iEventId;
                 $sWhere .= " AND `bx_events_data`.`id` = :event ";
             }
-            $a = $this->getAll("SELECT DISTINCT `bx_events_data`.`id`, `bx_events_data`.`event_name` AS `title`, `bx_events_data`.`date_start`, `bx_events_data`.`date_end`, `bx_events_data`.`timezone`
+            $a = $this->getAll("SELECT DISTINCT `bx_events_data`.`id`, `bx_events_data`.`event_name` AS `title`, `bx_events_data`.`date_start`, `bx_events_data`.`date_end`, `bx_events_data`.`timezone`, `bx_events_data`.`reminder`
                 FROM `bx_events_data`
                 LEFT JOIN `bx_events_intervals` AS `i` ON (
                     `bx_events_data`.`id` = `i`.`event_id`
@@ -138,6 +138,8 @@ class BxEventsDb extends BxBaseModGroupsDb
 
                 $a[$k]['start'] = $oStart ? $oStart->format('c') : 0;
                 $a[$k]['end'] = $oEnd ? $oEnd->format('c') : 0;
+                $a[$k]['start_utc'] = $oStart ? $oStart->getTimestamp() : 0;
+                $a[$k]['end_utc'] = $oEnd ? $oEnd->getTimestamp() : 0;
                 $a[$k]['url'] = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $this->_oConfig->CNF['URI_VIEW_ENTRY'] . '&id=' . $r['id']);
             }
 

+ 69 - 0
modules/boonex/events/classes/BxEventsModule.php

@@ -60,6 +60,26 @@ class BxEventsModule extends BxBaseModGroupsModule
         return $o->display($sTemplate);
     }
 
+    /**
+     * Send remoiders to event's participants.
+     * It must be processed once every hour for the proper processing.
+     */ 
+    public function serviceProcessReminders()
+    {
+        $iNow = time();
+
+        // get all events for today and tomorrow, since the max reminder is 24 hours
+        $aEntries = $this->_oDb->getEntriesByDate('@' . time(), '@' . (time() + 86400));
+
+        foreach ($aEntries as $a) {
+            if (!$a['reminder'])
+                continue;
+            $iTimestamp = $a['start_utc'] - (3600 * $a['reminder']);
+            if ($iNow > ($iTimestamp - 3600) && $iNow < $iTimestamp)
+                $this->sendReminders($a);
+        }
+    }
+
     public function actionIntervals()
     {
         $sAction = bx_get('a');
@@ -118,6 +138,55 @@ class BxEventsModule extends BxBaseModGroupsModule
             echo 'ok';
         }
     }
+
+    /**
+     * Send reminder to event's paritcipants
+     * @param $aContentInfo content info
+     * @return number of sent reminders
+     */ 
+    protected function sendReminders($aContentInfo)
+    {
+        $CNF = $this->_oConfig->CNF;
+
+        $oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTIONS']);
+        if (!$oConnection)
+            return false;
+
+        $oGroupProfile = BxDolProfile::getInstanceByContentAndType($aContentInfo[$CNF['FIELD_ID']], $this->getName());
+        if (!$oGroupProfile)
+            return false;
+
+        $aParticipants = $oConnection->getConnectedInitiators($oGroupProfile->id(), true);
+        if (!$aParticipants)
+            return true;
+
+        $oDateBegin = new DateTime();
+        $oDateBegin->setTimestamp($aContentInfo['start_utc']);
+        $oDateBegin->setTimezone(new DateTimeZone($aContentInfo['timezone']));
+        $sEntryBegin = $oDateBegin->format('r');
+        $sEntryBeginShort = $oDateBegin->format('j M');
+        $oDateBegin->setTimezone(new DateTimeZone('UTC'));
+        $sEntryBeginUTC = $oDateBegin->format('c');
+
+        $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS']);
+        $sLocationString = $oMetatags->locationsString($aContentInfo[$CNF['FIELD_ID']], false);
+
+        $iCounter = 0;
+        foreach ($aParticipants as $iProfileId) {
+
+            $b = sendMailTemplate($CNF['EMAIL_REMINDER'], 0, $iProfileId, array(
+                'EntryUrl' => BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'] . '&id=' . $aContentInfo[$CNF['FIELD_ID']]),
+                'EntryTitle' => $aContentInfo['title'],
+                'EntryBegin' => $sEntryBegin,
+                'EntryBeginShort' => $sEntryBeginShort,
+                'EntryBeginUTC' => $sEntryBeginUTC,
+                'EntryLocation' => $sLocationString,
+            ), BX_EMAIL_NOTIFY);
+
+            $iCounter += $b ? 1 : 0;
+        }
+        return $iCounter;
+    }
 }
 
 /** @} */

+ 22 - 0
modules/boonex/events/install/langs/en.xml

@@ -53,6 +53,8 @@
     <string name="_bx_events_form_profile_input_timezone"><![CDATA[Timezone]]></string>
     <string name="_bx_events_form_profile_input_sys_time"><![CDATA[Time]]></string>
     <string name="_bx_events_form_profile_input_time"><![CDATA[Time]]></string>
+    <string name="_bx_events_form_profile_input_sys_reminder"><![CDATA[Reminder]]></string>
+    <string name="_bx_events_form_profile_input_reminder"><![CDATA[Reminder]]></string>
 
     <string name="_bx_events_form_input_repeat_year"><![CDATA[Repeat year]]></string>
     <string name="_bx_events_form_input_repeat_month"><![CDATA[Repeat month]]></string>
@@ -253,6 +255,15 @@
     <string name="_bx_events_privacy_group_closed"><![CDATA[Closed]]></string>
     <string name="_bx_events_privacy_group_secret"><![CDATA[Secret]]></string>
 
+    <string name="_bx_events_pre_lists_reminder"><![CDATA[Event reminder]]></string>
+    <string name="_bx_events_reminder_none"><![CDATA[Reminder is off]]></string>
+    <string name="_bx_events_reminder_1h"><![CDATA[1 hour]]></string>
+    <string name="_bx_events_reminder_2h"><![CDATA[2 hours]]></string>
+    <string name="_bx_events_reminder_3h"><![CDATA[3 hours]]></string>
+    <string name="_bx_events_reminder_6h"><![CDATA[6 hours]]></string>
+    <string name="_bx_events_reminder_12h"><![CDATA[12 hours]]></string>
+    <string name="_bx_events_reminder_24h"><![CDATA[24 hours]]></string>
+
     <string name="_bx_events_pre_lists_cats"><![CDATA[Event categories]]></string>
     <string name="_bx_events_cat_General"><![CDATA[General]]></string>
     <string name="_bx_events_cat_Business"><![CDATA[Business]]></string>
@@ -345,4 +356,15 @@
     <string name="_bx_events_email_invitation_body"><![CDATA[{email_header}
 <p><a href="{InviterUrl}">{InviterDisplayName}</a> invited you to <a href="{EntryUrl}">{EntryTitle} event</a>.</p>
 {email_footer}]]></string>
+
+    <string name="_bx_events_email_reminder"><![CDATA[Reminder for the event]]></string>
+    <string name="_bx_events_email_reminder_subject"><![CDATA["{EntryTitle}" event - {EntryBeginShort}]]></string>
+    <string name="_bx_events_email_reminder_body"><![CDATA[{email_header}
+<p class="vevent">
+    <a href="{EntryUrl}" class="summary">{EntryTitle}</a> event reminder:</a><br />
+    Date: <abbr class="dtstart" title="{EntryBeginUTC}">{EntryBegin}</abbr><br />
+    Location: <span class="location">{EntryLocation}</span>
+</p>
+{email_footer}]]></string>
+
 </resources>

+ 4 - 0
modules/boonex/events/install/sql/disable.sql

@@ -69,3 +69,7 @@ DELETE FROM `sys_email_templates` WHERE `Module` = 'bx_events';
 
 DELETE FROM `sys_objects_uploader` WHERE `object` IN('bx_events_cover_crop', 'bx_events_picture_crop');
 
+-- CRON
+
+DELETE FROM `sys_cron_jobs` WHERE `name` = 'bx_events_process_reminders';
+

+ 7 - 1
modules/boonex/events/install/sql/enable.sql

@@ -434,7 +434,8 @@ INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `B
 ('bx_events', '_bx_events_email_fan_remove', 'bx_events_fan_remove', '_bx_events_email_fan_remove_subject', '_bx_events_email_fan_remove_body'),
 ('bx_events', '_bx_events_email_fan_become_admin', 'bx_events_fan_become_admin', '_bx_events_email_fan_become_admin_subject', '_bx_events_email_fan_become_admin_body'),
 ('bx_events', '_bx_events_email_admin_become_fan', 'bx_events_admin_become_fan', '_bx_events_email_admin_become_fan_subject', '_bx_events_email_admin_become_fan_body'),
-('bx_events', '_bx_events_email_invitation', 'bx_events_invitation', '_bx_events_email_invitation_subject', '_bx_events_email_invitation_body');
+('bx_events', '_bx_events_email_invitation', 'bx_events_invitation', '_bx_events_email_invitation_subject', '_bx_events_email_invitation_body'),
+('bx_events', '_bx_events_email_reminder', 'bx_events_reminder', '_bx_events_email_reminder_subject', '_bx_events_email_reminder_body');
 
 -- UPLOADERS
 
@@ -442,3 +443,8 @@ INSERT INTO `sys_objects_uploader` (`object`, `active`, `override_class_name`, `
 ('bx_events_cover_crop', 1, 'BxEventsUploaderCoverCrop', 'modules/boonex/events/classes/BxEventsUploaderCoverCrop.php'),
 ('bx_events_picture_crop', 1, 'BxEventsUploaderPictureCrop', 'modules/boonex/events/classes/BxEventsUploaderPictureCrop.php');
 
+-- CRON
+
+INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
+('bx_events_process_reminders', '55 * * * *', 'BxEventsCronProcessReminders', 'modules/boonex/events/classes/BxEventsCronProcessReminders.php', '');
+

+ 20 - 4
modules/boonex/events/install/sql/install.sql

@@ -21,6 +21,7 @@ CREATE TABLE IF NOT EXISTS `bx_events_data` (
   `favorites` int(11) NOT NULL default '0',
   `reports` int(11) NOT NULL default '0',
   `join_confirmation` tinyint(4) NOT NULL DEFAULT '1',
+  `reminder` int(11) NOT NULL DEFAULT '1',
   `allow_view_to` varchar(255) DEFAULT NULL,
   PRIMARY KEY (`id`),
   FULLTEXT KEY `search_fields` (`event_name`, `event_desc`)
@@ -215,6 +216,7 @@ INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `ch
 ('bx_event', 'bx_events', 'delete_confirm', 1, '', 0, 'checkbox', '_bx_events_form_profile_input_sys_delete_confirm', '_bx_events_form_profile_input_delete_confirm', '_bx_events_form_profile_input_delete_confirm_info', 1, 0, 0, '', '', '', 'avail', '', '_bx_events_form_profile_input_delete_confirm_error', '', '', 1, 0),
 ('bx_event', 'bx_events', 'do_submit', '_sys_form_account_input_submit', '', 0, 'submit', '_bx_events_form_profile_input_sys_do_submit', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_event', 'bx_events', 'event_cat', '', '#!bx_events_cats', 0, 'select', '_bx_events_form_profile_input_sys_event_cat', '_bx_events_form_profile_input_event_cat', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_events_form_profile_input_event_cat_err', 'Xss', '', 1, 1),
+('bx_event', 'bx_events', 'reminder', '', '#!bx_events_reminder', 0, 'select', '_bx_events_form_profile_input_sys_reminder', '_bx_events_form_profile_input_reminder', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 1),
 ('bx_event', 'bx_events', 'event_desc', '', '', 0, 'textarea', '_bx_events_form_profile_input_sys_event_desc', '_bx_events_form_profile_input_event_desc', '', 0, 0, 0, '', '', '', '', '', '', 'XssMultiline', '', 1, 1),
 ('bx_event', 'bx_events', 'event_name', '', '', 0, 'text', '_bx_events_form_profile_input_sys_event_name', '_bx_events_form_profile_input_event_name', '', 1, 0, 0, '', '', '', 'avail', '', '_bx_events_form_profile_input_event_name_err', 'Xss', '', 1, 0),
 ('bx_event', 'bx_events', 'initial_members', '', '', 0, 'custom', '_bx_events_form_profile_input_sys_initial_members', '_bx_events_form_profile_input_initial_members', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 1),
@@ -240,8 +242,9 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 ('bx_event_add', 'timezone', 2147483647, 1, 12),
 ('bx_event_add', 'reoccurring', 2147483647, 1, 13),
 ('bx_event_add', 'join_confirmation', 2147483647, 1, 14),
-('bx_event_add', 'allow_view_to', 2147483647, 1, 15),
-('bx_event_add', 'do_submit', 2147483647, 1, 16),
+('bx_event_add', 'reminder', 2147483647, 1, 15),
+('bx_event_add', 'allow_view_to', 2147483647, 1, 16),
+('bx_event_add', 'do_submit', 2147483647, 1, 17),
 
 ('bx_event_invite', 'initial_members', 2147483647, 1, 1),
 ('bx_event_invite', 'do_submit', 2147483647, 1, 2),
@@ -267,8 +270,9 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 ('bx_event_edit', 'timezone', 2147483647, 1, 12),
 ('bx_event_edit', 'reoccurring', 2147483647, 1, 13),
 ('bx_event_edit', 'join_confirmation', 2147483647, 1, 14),
-('bx_event_edit', 'allow_view_to', 2147483647, 1, 15),
-('bx_event_edit', 'do_submit', 2147483647, 1, 16),
+('bx_event_edit', 'reminder', 2147483647, 1, 15),
+('bx_event_edit', 'allow_view_to', 2147483647, 1, 16),
+('bx_event_edit', 'do_submit', 2147483647, 1, 17),
 
 ('bx_event_edit_cover', 'allow_view_to', 2147483647, 0, 1),
 ('bx_event_edit_cover', 'time', 2147483647, 0, 2),
@@ -321,6 +325,18 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 
 -- PRE-VALUES
 
+INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
+('bx_events_reminder', '_bx_events_pre_lists_reminder', 'bx_events', '0');
+
+INSERT INTO `sys_form_pre_values`(`Key`, `Value`, `Order`, `LKey`, `LKey2`) VALUES
+('bx_events_reminder', '0', 0, '_bx_events_reminder_none', ''),
+('bx_events_reminder', '1', 1, '_bx_events_reminder_1h', ''),
+('bx_events_reminder', '2', 2, '_bx_events_reminder_2h', ''),
+('bx_events_reminder', '3', 3, '_bx_events_reminder_3h', ''),
+('bx_events_reminder', '6', 4, '_bx_events_reminder_6h', ''),
+('bx_events_reminder', '12', 5, '_bx_events_reminder_12h', ''),
+('bx_events_reminder', '24', 6, '_bx_events_reminder_24h', '');
+
 INSERT INTO `sys_form_pre_lists`(`key`, `title`, `module`, `use_for_sets`) VALUES
 ('bx_events_cats', '_bx_events_pre_lists_cats', 'bx_events', '0');
 

+ 23 - 1
modules/boonex/russian/data/langs/bx_events/ru.xml

@@ -51,7 +51,9 @@
     <string name="_bx_events_form_profile_input_timezone"><![CDATA[Часовой пояс]]></string>
     <string name="_bx_events_form_profile_input_sys_time"><![CDATA[Время]]></string>
     <string name="_bx_events_form_profile_input_time"><![CDATA[Время]]></string>
-
+    <string name="_bx_events_form_profile_input_sys_reminder"><![CDATA[Напоминание]]></string>
+    <string name="_bx_events_form_profile_input_reminder"><![CDATA[Напоминание]]></string>
+    
     <string name="_bx_events_form_input_repeat_year"><![CDATA[Повторять: год]]></string>
     <string name="_bx_events_form_input_repeat_month"><![CDATA[Повторять: месяц]]></string>
     <string name="_bx_events_form_input_repeat_week_of_month"><![CDATA[Повторять: неделя в месяце]]></string>
@@ -252,6 +254,15 @@
     <string name="_bx_events_privacy_group_closed"><![CDATA[Закрытое событие]]></string>
     <string name="_bx_events_privacy_group_secret"><![CDATA[Секретное событие]]></string>
 
+    <string name="_bx_events_pre_lists_reminder"><![CDATA[Напоминание о событии]]></string>
+    <string name="_bx_events_reminder_none"><![CDATA[Выключено]]></string>
+    <string name="_bx_events_reminder_1h"><![CDATA[За 1 час]]></string>
+    <string name="_bx_events_reminder_2h"><![CDATA[За 2 часа]]></string>
+    <string name="_bx_events_reminder_3h"><![CDATA[За 3 часа]]></string>
+    <string name="_bx_events_reminder_6h"><![CDATA[За 6 часов]]></string>
+    <string name="_bx_events_reminder_12h"><![CDATA[За 12 часов]]></string>
+    <string name="_bx_events_reminder_24h"><![CDATA[За 24 часа]]></string>
+    
     <string name="_bx_events_pre_lists_cats"><![CDATA[Категории событий]]></string>
     <string name="_bx_events_cat_General"><![CDATA[Обобщение]]></string>
     <string name="_bx_events_cat_Business"><![CDATA[Бизнес]]></string>
@@ -344,4 +355,15 @@
     <string name="_bx_events_email_invitation_body"><![CDATA[{email_header}
 <p><a href="{InviterUrl}">{InviterDisplayName}</a> пригласил Вас на событие <a href="{EntryUrl}">{EntryTitle}</a>.</p>
 {email_footer}]]></string>
+
+    <string name="_bx_events_email_reminder"><![CDATA[Напоминание о предстроящем событии]]></string>
+    <string name="_bx_events_email_reminder_subject"><![CDATA[Событие "{EntryTitle}" - {EntryBeginShort}]]></string>
+    <string name="_bx_events_email_reminder_body"><![CDATA[{email_header}
+<p class="vevent">
+    Напоминание о событии <a href="{EntryUrl}" class="summary">{EntryTitle}</a>:<br />
+    Дата: <abbr class="dtstart" title="{EntryBeginUTC}">{EntryBegin}</a><br />
+    Место: <span class="location">{EntryLocation}</span> 
+</p>
+{email_footer}]]></string>
+
 </resources>