Преглед на файлове

Events: Enhancements. Point 1.

AntonLV преди 2 години
родител
ревизия
7e2d1fed9f

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

@@ -22,6 +22,7 @@ class BxEventsConfig extends BxBaseModGroupsConfig
             'invite-to-event' => 'checkAllowedInvite',
             'delete-event-profile' => 'checkAllowedDelete',
             'approve-event-profile' => 'checkAllowedApprove',
+            'profile-check-in' =>  'checkAllowedCheckIn',
             'ical-export' => 'checkAllowedIcalExport',
         ));
 
@@ -34,6 +35,7 @@ class BxEventsConfig extends BxBaseModGroupsConfig
             'TABLE_ENTRIES' => $aModule['db_prefix'] . 'data',
             'TABLE_ENTRIES_FULLTEXT' => 'search_fields',
             'TABLE_ADMINS' => $aModule['db_prefix'] . 'admins',
+            'TABLE_CHECK_IN' => $aModule['db_prefix'] . 'check_in',
             'TABLE_INVITES' => $aModule['db_prefix'] . 'invites',
             'TABLE_PRICES' => $aModule['db_prefix'] . 'prices',
 

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

@@ -195,6 +195,26 @@ class BxEventsDb extends BxBaseModGroupsDb
 
         return $aEntries;
     }
+
+    public function checkIn($iProfileId, $iId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        return $this->query("INSERT INTO `" . $CNF['TABLE_CHECK_IN'] . "` SET `profile_id` = :profile_id, `event_id` = :event_id ON DUPLICATE KEY UPDATE `event_id` = :event_id", [
+            'profile_id' => $iProfileId,
+            'event_id' => $iId
+        ]) !== false;
+    }
+    
+    public function isCheckedIn($iProfileId, $iId)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        return (int)$this->getOne("SELECT `id` FROM `" . $CNF['TABLE_CHECK_IN'] . "` WHERE `profile_id` = :profile_id AND `event_id` = :event_id LIMIT 1", [
+            'profile_id' => $iProfileId,
+            'event_id' => $iId
+        ]) > 0;
+    }
 }
 
 /** @} */

+ 5 - 0
modules/boonex/events/classes/BxEventsMenuViewActions.php

@@ -17,7 +17,12 @@ class BxEventsMenuViewActions extends BxBaseModGroupsMenuViewActions
     public function __construct($aObject, $oTemplate = false)
     {
         $this->MODULE = 'bx_events';
+
         parent::__construct($aObject, $oTemplate);
+
+        $this->addMarkers([
+            'js_object_entry' => $this->_oModule->_oConfig->getJsObject('entry')
+        ]);
     }
 }
 

+ 5 - 0
modules/boonex/events/classes/BxEventsMenuViewActionsAll.php

@@ -66,6 +66,11 @@ class BxEventsMenuViewActionsAll extends BxBaseModGroupsMenuViewActionsAll
         return $this->_getMenuItemByNameActionsMore($aItem);
     }
 
+    protected function _getMenuItemProfileCheckIn($aItem)
+    {
+        return $this->_getMenuItemByNameActions($aItem);
+    }
+
     protected function _getMenuItemProfileSetBadges($aItem)
     {
         return $this->_getMenuItemByNameActions($aItem);

+ 61 - 4
modules/boonex/events/classes/BxEventsModule.php

@@ -28,6 +28,18 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
         ));
     }
 
+    public function actionCheckIn()
+    {
+    	$iId = (int)bx_get('id');
+    	if(empty($iId) || empty($this->_iProfileId))
+            return echoJson(['code' => 1]);
+
+        if(!$this->serviceCheckIn($iId, $this->_iProfileId))
+            return echoJson(['code' => 2]);
+
+        return echoJson(['code' => 0, 'reload' => 1]);
+    }
+
     public function actionCalendarSync($iContentId = 0)
     {
         $aContentInfo = (int)$iContentId ? $this->_oDb->getContentInfoById((int)$iContentId) : null;
@@ -96,7 +108,24 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
         header('Content-Type: application/json; charset=utf-8');
         echo json_encode($this->serviceCalendarData($aParams));
     }
-    
+
+    public function serviceCheckIn($iId, $iProfileId = 0)
+    {
+        if(!$iProfileId)
+            $iProfileId = $this->_iProfileId;
+        if(!$iProfileId)
+            return false;
+        
+        $aDataEntry = $this->_oDb->getContentInfoById($iId);
+        if(empty($aDataEntry) || !is_array($aDataEntry))
+            return false;
+
+        if($this->checkAllowedCheckIn($aDataEntry) !== CHECK_ACTION_RESULT_ALLOWED)
+            return false;
+
+        return $this->_oDb->checkIn($iProfileId, $iId);
+    }
+
     public function serviceCalendarData($aParams = [])
     {
         $CNF = &$this->_oConfig->CNF;
@@ -239,12 +268,12 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
 
     public function serviceGetSafeServices()
     {
-        $a = parent::serviceGetSafeServices();
-        return array_merge($a, array (
+        return array_merge(parent::serviceGetSafeServices(), [
+            'CheckIn' => '',
             'BrowsePastProfiles' => '',
             'Calendar' => '',
             'CalendarData' => ''
-        ));
+        ]);
     }
 
     /**
@@ -677,6 +706,23 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
         }
     }
 
+    public function checkAllowedCheckIn($aDataEntry, $isPerformAction = false)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $sError = _t('_sys_txt_access_denied');
+        if(!$this->_iProfileId || !$this->isFan($aDataEntry[$CNF['FIELD_ID']], $this->_iProfileId))
+            return $sError;
+
+        if(!$this->isOngoing($aDataEntry))
+            return $sError;
+
+        if($this->_oDb->isCheckedIn($this->_iProfileId, $aDataEntry[$CNF['FIELD_ID']]))
+            return $sError;
+
+        return CHECK_ACTION_RESULT_ALLOWED;
+    }
+
     public function checkAllowedIcalExport ($aDataEntry, $isPerformAction = false)
     {
         return $aDataEntry['date_start'] && $aDataEntry['date_end'] ? CHECK_ACTION_RESULT_ALLOWED : _t('_sys_txt_access_denied');
@@ -730,6 +776,17 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
         }
         return $iCounter;
     }
+    
+    public function isOngoing($aDataEntry)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(empty($aDataEntry[$CNF['FIELD_DATE_START']]) || empty($aDataEntry[$CNF['FIELD_DATE_END']]))
+            return false;
+
+        $iTime = time();
+        return $iTime >= $aDataEntry[$CNF['FIELD_DATE_START']] && $iTime <= $aDataEntry[$CNF['FIELD_DATE_END']];
+    }
 }
 
 /** @} */

+ 11 - 0
modules/boonex/events/classes/BxEventsPageEntry.php

@@ -17,8 +17,19 @@ class BxEventsPageEntry extends BxBaseModGroupsPageEntry
     public function __construct($aObject, $oTemplate = false)
     {
         $this->MODULE = 'bx_events';
+
         parent::__construct($aObject, $oTemplate);
     }
+    
+    public function getCode ()
+    {
+        $sResult = parent::getCode();
+        if(!empty($sResult))
+            $sResult .= $this->_oModule->_oTemplate->getJsCode('entry');
+
+        $this->_oModule->_oTemplate->addJs(['entry.js']);
+        return $sResult;
+    }
 }
 
 /** @} */

+ 3 - 2
modules/boonex/events/install/langs/en.xml

@@ -333,11 +333,12 @@
     <string name="_bx_events_menu_item_title_leave_group_cancel_request"><![CDATA[Cancel]]></string>
     <string name="_bx_events_menu_item_title_leave_group_reject_request"><![CDATA[Decline]]></string>
 
-<string name="_bx_events_menu_item_title_system_pay_and_join"><![CDATA[Pay & Join]]></string>
+    <string name="_bx_events_menu_item_title_system_pay_and_join"><![CDATA[Pay & Join]]></string>
     <string name="_bx_events_menu_item_title_pay_and_join"><![CDATA[Pay & Join]]></string>
-
     <string name="_bx_events_menu_item_title_system_subscribe"><![CDATA[Follow]]></string>
     <string name="_bx_events_menu_item_title_subscribe"><![CDATA[Interested]]></string>
+    <string name="_bx_events_menu_item_title_system_check_in"><![CDATA[Check In]]></string>
+    <string name="_bx_events_menu_item_title_check_in"><![CDATA[Check In]]></string>
     <string name="_bx_events_menu_item_title_system_view_entries_in_context"><![CDATA[Events]]></string>
     <string name="_bx_events_menu_item_title_view_entries_in_context"><![CDATA[Events]]></string>
     <string name="_bx_events_menu_item_title_system_unsubscribe"><![CDATA[Unfollow]]></string>

+ 2 - 0
modules/boonex/events/install/sql/enable.sql

@@ -296,6 +296,7 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_events_view_actions', 'bx_events', 'join-event-profile', '_bx_events_menu_item_title_system_pay_and_join', '_bx_events_menu_item_title_pay_and_join', 'page.php?i=join-event-profile&profile_id={profile_id}', '', '', 'sign-in-alt', '', 0, 2147483647, 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:22:"is_paid_join_avaliable";s:6:"params";a:1:{i:0;s:12:"{profile_id}";}}', 1, 0, 0, 5),
 ('bx_events_view_actions', 'bx_events', 'profile-fan-add', '_bx_events_menu_item_title_system_become_fan', '{title_add_fan}', 'javascript:void(0)', 'bx_conn_action(this, \'bx_events_fans\', \'add\', \'{profile_id}\')', '', 'sign-in-alt', '', 0, 2147483647, 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:22:"is_free_join_avaliable";s:6:"params";a:1:{i:0;s:12:"{profile_id}";}}', 1, 0, 0, 5),
 ('bx_events_view_actions', 'bx_events', 'profile-subscribe-add', '_bx_events_menu_item_title_system_subscribe', '_bx_events_menu_item_title_subscribe', 'javascript:void(0)', 'bx_conn_action(this, \'sys_profiles_subscriptions\', \'add\', \'{profile_id}\')', '', 'check', '', 0, 2147483647, '', 1, 0, 1, 20),
+('bx_events_view_actions', 'bx_events', 'profile-check-in', '_bx_events_menu_item_title_system_check_in', '_bx_events_menu_item_title_check_in', 'javascript:void(0)', 'javascript:{js_object_entry}.checkIn(this, {content_id});', '', 'check', '', 0, 2147483647, '', 1, 0, 1, 25),
 ('bx_events_view_actions', 'bx_events', 'profile-set-badges', '_sys_menu_item_title_system_set_badges', '_sys_menu_item_title_set_badges', 'javascript:void(0)', 'bx_menu_popup(''sys_set_badges'', window, {}, {module: ''bx_events'', content_id: {content_id}});', '', 'check-circle', '', 0, 192, 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:19:"is_badges_avaliable";}', 1, 0, 1, 30),
 ('bx_events_view_actions', 'bx_events', 'ical-export', '', '_bx_events_menu_item_title_ical_export', 'modules/?r=events/calendar_sync/{content_id}', '', '', 'calendar-plus', '', 0, 2147483647, 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:24:"is_ical_export_avaliable";s:6:"params";a:1:{i:0;s:12:"{content_id}";}}', 1, 0, 1, 40),
 ('bx_events_view_actions', 'bx_events', 'profile-actions-more', '_bx_events_menu_item_title_system_more_actions', '_bx_events_menu_item_title_more_actions', 'javascript:void(0)', 'bx_menu_popup(''bx_events_view_actions_more'', this, {}, {profile_id:{profile_id}});', '', 'cog', 'bx_events_view_actions_more', 1, 2147483647, '', 1, 0, 1, 9999);
@@ -331,6 +332,7 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_events_view_actions_all', 'bx_events', 'profile-fan-remove', '_bx_events_menu_item_title_system_leave_group', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 20),
 ('bx_events_view_actions_all', 'bx_events', 'profile-subscribe-add', '_bx_events_menu_item_title_system_subscribe', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 30),
 ('bx_events_view_actions_all', 'bx_events', 'profile-subscribe-remove', '_bx_events_menu_item_title_system_unsubscribe', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 40),
+('bx_events_view_actions_all', 'bx_events', 'profile-check-in', '_bx_events_menu_item_title_system_check_in', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 45),
 ('bx_events_view_actions_all', 'bx_events', 'profile-set-badges', '_sys_menu_item_title_system_set_badges', '', '', '', '', '', '', '', 0, 192, 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:19:"is_badges_avaliable";}', 1, 0, 50),
 ('bx_events_view_actions_all', 'bx_events', 'ical-export', '', '_bx_events_menu_item_title_ical_export', 'modules/?r=events/calendar_sync/{content_id}', '', '', 'calendar-plus', '', '', 0, 2147483647, 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:24:"is_ical_export_avaliable";s:6:"params";a:1:{i:0;s:12:"{content_id}";}}', 1, 0, 60),
 ('bx_events_view_actions_all', 'bx_events', 'comment', '_sys_menu_item_title_system_va_comment', '', '', '', '', '', '', '', 0, 2147483647, '', 0, 0, 200),

+ 9 - 0
modules/boonex/events/install/sql/install.sql

@@ -242,6 +242,15 @@ CREATE TABLE IF NOT EXISTS `bx_events_admins` (
   UNIQUE KEY `admin` (`group_profile_id`,`fan_id`)
 );
 
+-- TABLE: check-in
+CREATE TABLE IF NOT EXISTS `bx_events_check_in` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `profile_id` int(10) unsigned NOT NULL,
+  `event_id` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `profile_id` (`profile_id`)
+);
+
 -- TABLE: favorites
 CREATE TABLE `bx_events_favorites_track` (
   `id` int(11) NOT NULL AUTO_INCREMENT,

+ 1 - 1
modules/boonex/events/install/sql/uninstall.sql

@@ -1,6 +1,6 @@
 
 -- TABLES
-DROP TABLE IF EXISTS `bx_events_data`, `bx_events_intervals`, `bx_events_pics`, `bx_events_pics_resized`, `bx_events_cmts`, `bx_events_cmts_notes`, `bx_events_views_track`, `bx_events_meta_keywords`, `bx_events_meta_locations`, `bx_events_meta_mentions`, `bx_events_fans`, `bx_events_admins`, `bx_events_votes`, `bx_events_votes_track`, `bx_events_reports`, `bx_events_reports_track`, `bx_events_favorites_track`, `bx_events_favorites_lists`, `bx_events_scores`, `bx_events_scores_track`, `bx_events_invites`, `bx_events_prices`;
+DROP TABLE IF EXISTS `bx_events_data`, `bx_events_intervals`, `bx_events_pics`, `bx_events_pics_resized`, `bx_events_cmts`, `bx_events_cmts_notes`, `bx_events_views_track`, `bx_events_meta_keywords`, `bx_events_meta_locations`, `bx_events_meta_mentions`, `bx_events_fans`, `bx_events_admins`, `bx_events_check_in`, `bx_events_votes`, `bx_events_votes_track`, `bx_events_reports`, `bx_events_reports_track`, `bx_events_favorites_track`, `bx_events_favorites_lists`, `bx_events_scores`, `bx_events_scores_track`, `bx_events_invites`, `bx_events_prices`;
 
 -- PROFILES
 DELETE FROM sys_profiles WHERE `type` = 'bx_events';

+ 33 - 0
modules/boonex/events/js/entry.js

@@ -27,4 +27,37 @@ BxEventsEntry.prototype.init = function() {
         $("[name = 'timezone']").val(moment.tz.guess());
 };
 
+BxEventsEntry.prototype.checkIn = function(oElement, iId) {
+    var $this = this;
+    var oParams = this._getDefaultData();
+    oParams['id'] = iId;
+
+    if(oElement)
+        this.loadingInButton(oElement, true);
+
+    jQuery.get (
+        this._sActionsUrl + 'check_in',
+        oParams,
+        function(oData) {
+            if(oElement)
+                $this.loadingInButton(oElement, false);
+
+            processJsonData(oData);
+        },
+        'json'
+    );
+};
+
+BxEventsEntry.prototype.loadingInButton = function(e, bShow) {
+    if($(e).length)
+        bx_loading_btn($(e), bShow);
+    else
+        bx_loading($('body'), bShow);	
+};
+
+BxEventsEntry.prototype._getDefaultData = function() {
+    var oDate = new Date();
+    return jQuery.extend({}, this._oRequestParams, {_t:oDate.getTime()});
+};
+
 /** @} */

+ 2 - 0
modules/boonex/russian/data/langs/bx_events/ru.xml

@@ -300,6 +300,8 @@
 
     <string name="_bx_events_menu_item_title_system_subscribe"><![CDATA[Получать уведомления]]></string>
     <string name="_bx_events_menu_item_title_subscribe"><![CDATA[Заинтересован]]></string>
+    <string name="_bx_events_menu_item_title_system_check_in"><![CDATA[Зарегистрироваться]]></string>
+    <string name="_bx_events_menu_item_title_check_in"><![CDATA[Зарегистрироваться]]></string>
     <string name="_bx_events_menu_item_title_system_view_entries_in_context"><![CDATA[События]]></string>
     <string name="_bx_events_menu_item_title_view_entries_in_context"><![CDATA[События]]></string>
     <string name="_bx_events_menu_item_title_system_unsubscribe"><![CDATA[Отключить уведомления]]></string>