Prechádzať zdrojové kódy

Ticket #4559 - Events: Calendar enhancements.

AntonLV 2 rokov pred
rodič
commit
147e65bf10

+ 16 - 7
modules/boonex/events/classes/BxEventsDb.php

@@ -55,6 +55,8 @@ class BxEventsDb extends BxBaseModGroupsDb
 
 
     public function getEntriesByDate($sDateFrom, $sDateTo, $iEventId = 0, $aSQLPart = array())
     public function getEntriesByDate($sDateFrom, $sDateTo, $iEventId = 0, $aSQLPart = array())
     {
     {
+        $CNF = &$this->_oConfig->CNF;
+
         // validate input data
         // validate input data
         if (false === ($oDateFrom = date_create($sDateFrom, new DateTimeZone('UTC'))))
         if (false === ($oDateFrom = date_create($sDateFrom, new DateTimeZone('UTC'))))
             return array();
             return array();
@@ -64,6 +66,7 @@ class BxEventsDb extends BxBaseModGroupsDb
             return array();
             return array();
 
 
         $sModule = $this->_oConfig->getName();
         $sModule = $this->_oConfig->getName();
+        $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS']);
 
 
         // increase start and end date to cover timezones
         // increase start and end date to cover timezones
         $oDateFrom = $oDateFrom->sub(new DateInterval("P1D"));
         $oDateFrom = $oDateFrom->sub(new DateInterval("P1D"));
@@ -103,7 +106,7 @@ class BxEventsDb extends BxBaseModGroupsDb
             }
             }
 
 
             // search for regular events
             // search for regular events
-            $a = $this->getAllWithKey("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`, 0 AS `repeating`
+            $a = $this->getAllWithKey("SELECT DISTINCT `bx_events_data`.`id`, `bx_events_data`.`event_name` AS `title`, `bx_events_data`.`event_desc` AS `description`, `bx_events_data`.`date_start`, `bx_events_data`.`date_end`, `bx_events_data`.`timezone`, `bx_events_data`.`reminder`, 0 AS `repeating`
                 FROM `bx_events_data` $sJoin 
                 FROM `bx_events_data` $sJoin 
                 WHERE `bx_events_data`.`date_start` >= :timestamp_min AND `bx_events_data`.`date_start` <= :timestamp_max $sWhere
                 WHERE `bx_events_data`.`date_start` >= :timestamp_min AND `bx_events_data`.`date_start` <= :timestamp_max $sWhere
             ", 'id', $aBindings);
             ", 'id', $aBindings);
@@ -111,7 +114,7 @@ class BxEventsDb extends BxBaseModGroupsDb
             if ($a)
             if ($a)
                 $sWhere .= " AND `bx_events_data`.`id` NOT IN(" . $this->implode_escape(array_keys($a)) . ") ";
                 $sWhere .= " AND `bx_events_data`.`id` NOT IN(" . $this->implode_escape(array_keys($a)) . ") ";
 
 
-            $aRepeating = $this->getAllWithKey("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`, 1 AS `repeating`
+            $aRepeating = $this->getAllWithKey("SELECT DISTINCT `bx_events_data`.`id`, `bx_events_data`.`event_name` AS `title`, `bx_events_data`.`event_desc` AS `description`, `bx_events_data`.`date_start`, `bx_events_data`.`date_end`, `bx_events_data`.`timezone`, `bx_events_data`.`reminder`, 1 AS `repeating`
                 FROM `bx_events_data`
                 FROM `bx_events_data`
                 LEFT JOIN `bx_events_intervals` AS `i` ON (
                 LEFT JOIN `bx_events_intervals` AS `i` ON (
                     `bx_events_data`.`id` = `i`.`event_id`
                     `bx_events_data`.`id` = `i`.`event_id`
@@ -169,11 +172,17 @@ class BxEventsDb extends BxBaseModGroupsDb
                 $a[$k]['start_utc'] = $oDateStart ? $oDateStart->getTimestamp() : 0;
                 $a[$k]['start_utc'] = $oDateStart ? $oDateStart->getTimestamp() : 0;
                 $a[$k]['end_utc'] = $oDateEnd ? $oDateEnd->getTimestamp() : 0;
                 $a[$k]['end_utc'] = $oDateEnd ? $oDateEnd->getTimestamp() : 0;
                 $a[$k]['url'] = bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $this->_oConfig->CNF['URI_VIEW_ENTRY'] . '&id=' . $r['id']));
                 $a[$k]['url'] = bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $this->_oConfig->CNF['URI_VIEW_ENTRY'] . '&id=' . $r['id']));
-                if(($oEvent = BxDolProfile::getInstanceByContentAndType($r['id'], $sModule)) !== false)
-                    $a[$k]['extendedProps'] = [
-                        'class' => 'bx-events-calendar-unit',
-                        'card' => $oEvent->getUnit()
-                    ];
+                if(bx_is_api()) {
+                    $a[$k]['url'] = bx_api_get_relative_url($a[$k]['url']);
+                    $a[$k]['location'] = $oMetatags->locationsString($r['id'], false);
+                }
+                else {
+                    if(($oEvent = BxDolProfile::getInstanceByContentAndType($r['id'], $sModule)) !== false)
+                        $a[$k]['extendedProps'] = [
+                            'class' => 'bx-events-calendar-unit',
+                            'card' => $oEvent->getUnit()
+                        ];
+                }
             }
             }
 
 
             // merge with all other events
             // merge with all other events

+ 105 - 36
modules/boonex/events/classes/BxEventsModule.php

@@ -81,50 +81,102 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
 
 
     public function actionCalendarData()
     public function actionCalendarData()
     {
     {
-        // check permissions
-        $aSQLPart = array();
-        $iContentId = (int)bx_get('event');
-        $iContextId = (int)bx_get('context_id');
-        
-        if ($iContentId) {
-            $aContentInfo = $this->_oDb->getContentInfoById($iContentId);
-            if (CHECK_ACTION_RESULT_ALLOWED !== $this->checkAllowedView($aContentInfo)) {
-                $this->_oTemplate->displayAccessDenied();
-                exit;
-            }
-            $aSQLPart = array();
+        $aParams = [
+            'type' => ($sType = bx_get('type')) !== false ? $sType : 'browse',
+            'start' => bx_get('start'),
+            'end' => bx_get('end')
+        ];
+        if(($iEventId = bx_get('event')) !== false)
+            $aParams['event_id'] = (int)$iEventId;
+        if(($iProfileId = bx_get('profile_id')) !== false)
+            $aParams['profile_id'] = (int)$iProfileId;
+        if(($iContextId = bx_get('context_id')) !== false)
+            $aParams['context_id'] = (int)$iContextId;
+    
+        header('Content-Type: application/json; charset=utf-8');
+        echo json_encode($this->serviceCalendarData($aParams));
+    }
+    
+    public function serviceCalendarData($aParams = [])
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if($this->_bIsApi && is_string($aParams)) {
+            $aParams = json_decode($aParams, true);
+            if(!empty($aParams['params']))
+                $aParams = $aParams['params'];
         }
         }
-        else {
-            $oPrivacy = BxDolPrivacy::getObjectInstance($this->_oConfig->CNF['OBJECT_PRIVACY_VIEW']);
-            if($iContextId){
-                if (!$this->serviceIsEnableForContext($iContextId)){
-                    exit;
-                }
-                else{
-                    $aSQLPart = $oPrivacy ? $oPrivacy->getContentByGroupAsSQLPart(- $iContextId) : array();
-                }
-            }
-            else{
-                $aSQLPart = $oPrivacy ? $oPrivacy->getContentPublicAsSQLPart(0, $oPrivacy->getPartiallyVisiblePrivacyGroups()) : array();
-            }
+
+        $sModule = $this->getName();
+        $oPrivacy = BxDolPrivacy::getObjectInstance($CNF['OBJECT_PRIVACY_VIEW']);
+
+        $iNow = time();
+        $sStart = !empty($aParams['start']) ? $aParams['start'] : date('d.m.Y', $iNow);
+        $sEnd = !empty($aParams['end']) ? $aParams['end'] : date('d.m.Y', $iNow + 3600 * 24 * 365);
+
+        $iContentId = 0;
+        $iContextId = 0;
+        $aSQLPart = [];
+        switch($aParams['type']) {
+            case 'event':
+                $iContentId = !empty($aParams['event_id']) ? (int)$aParams['event_id'] : 0;
+                $aContentInfo = $this->_oDb->getContentInfoById($iContentId);
+                if(CHECK_ACTION_RESULT_ALLOWED !== $this->checkAllowedView($aContentInfo))
+                    $this->_oTemplate->displayAccessDenied();
+                break;
+
+            case 'author':
+                $iProfileId = !empty($aParams['profile_id']) ? (int)$aParams['profile_id'] : 0;
+
+                $aSQLPart = [
+                    'where' => $this->_oDb->prepareAsString("AND `{$CNF['TABLE_ENTRIES']}`.`{$CNF['FIELD_AUTHOR']}`=?", $iProfileId)
+                ];
+                break;
+
+            case 'joined':
+                $iProfileId = !empty($aParams['profile_id']) ? (int)$aParams['profile_id'] : 0;
+
+                $oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTIONS']);
+                if(!$oConnection)
+                    return [];
+
+                $aEventsJoined = $oConnection->getConnectedContent($iProfileId, true);
+                if(empty($aEventsJoined) || !is_array($aEventsJoined))
+                    return [];
+
+                $aSQLPart = [
+                    'join' => "INNER JOIN `sys_profiles` ON `{$CNF['TABLE_ENTRIES']}`.`{$CNF['FIELD_ID']}`=`sys_profiles`.`content_id` AND `sys_profiles`.`type`='{$sModule}'",
+                    'where' => "AND `sys_profiles`.`id` IN (" . $this->_oDb->implode_escape($aEventsJoined) . ")"
+                ];
+                break;
+
+            case 'context':
+                $iContextId = !empty($aParams['context_id']) ? (int)$aParams['context_id'] : 0;
+                if(!$this->serviceIsEnableForContext($iContextId))
+                    return [];
+
+                $aSQLPart = $oPrivacy->getContentByGroupAsSQLPart(-$iContextId);
+                break;
+            
+            default:
+                $aSQLPart = $oPrivacy->getContentPublicAsSQLPart(0, $oPrivacy->getPartiallyVisiblePrivacyGroups());
         }
         }
 
 
         // get entries
         // get entries
-        $aEntries = $this->_oDb->getEntriesByDate(bx_get('start'), bx_get('end'), bx_get('event'), $aSQLPart);
-        
+        $aEntries = $this->_oDb->getEntriesByDate($sStart, $sEnd, $iContentId, $aSQLPart);
+
         bx_alert($this->getName(), 'calendar_data', 0, false, array(
         bx_alert($this->getName(), 'calendar_data', 0, false, array(
             'event' => $iContentId,
             'event' => $iContentId,
             'context_id' => $iContextId,
             'context_id' => $iContextId,
-            'start' => bx_get('start'),
-            'end' =>  bx_get('end'),
+            'start' => $sStart,
+            'end' =>  $sEnd,
             'sql_part' => &$aSQLPart,
             'sql_part' => &$aSQLPart,
             'data' => &$aEntries,
             'data' => &$aEntries,
         ));
         ));
-        
-        header('Content-Type: application/json; charset=utf-8');
-        echo json_encode($aEntries);
+
+        return $aEntries;
     }
     }
-    
+
     public function serviceIsIcalExportAvaliable($iContentId)
     public function serviceIsIcalExportAvaliable($iContentId)
     {
     {
         return true;
         return true;
@@ -167,6 +219,7 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
         return array_merge($a, array (
         return array_merge($a, array (
             'BrowsePastProfiles' => '',
             'BrowsePastProfiles' => '',
             'Calendar' => '',
             'Calendar' => '',
+            'CalendarData' => ''
         ));
         ));
     }
     }
 
 
@@ -324,10 +377,23 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
     /** 
     /** 
      * @ref bx_events-calendar "calendar"
      * @ref bx_events-calendar "calendar"
      */
      */
-    public function serviceCalendar($aData = array(), $sTemplate = 'calendar.html')
+    public function serviceCalendar($aData = [], $sTemplate = 'calendar.html')
     {
     {
-        if(isset($aData['context_id']) && !$this->serviceIsEnableForContext($aData['context_id']))
-            return '';
+        if(isset($aData['event']) && !isset($aData['type']))
+            $aData['type'] = 'event';
+
+        if(isset($aData['profile_id']) && !isset($aData['type']))
+            $aData['type'] = 'joined';
+
+        if(isset($aData['context_id'])) {
+            if(!$this->serviceIsEnableForContext($aData['context_id']))
+                return '';
+
+            $aData['type'] = 'context';
+        }
+
+        if(!isset($aData['type']))
+            $aData['type'] = 'browse';
 
 
         $oCalendar = new BxTemplCalendar([
         $oCalendar = new BxTemplCalendar([
             'eventSources' => [
             'eventSources' => [
@@ -335,6 +401,9 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
             ],
             ],
         ], $this->_oTemplate);
         ], $this->_oTemplate);
 
 
+        if (bx_is_api())
+            return [bx_api_get_block('calendar', ['request_url' => $this->getName() . '/calendar_data&params[]=' . json_encode(['params' => $aData])])];
+        
         $this->_oTemplate->addCss(['main.css']);
         $this->_oTemplate->addCss(['main.css']);
         return $oCalendar->display($sTemplate);
         return $oCalendar->display($sTemplate);
     }
     }

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

@@ -200,6 +200,8 @@
     <string name="_bx_events_page_block_title_sys_favorites_of_author"><![CDATA[Favorite Events]]></string>
     <string name="_bx_events_page_block_title_sys_favorites_of_author"><![CDATA[Favorite Events]]></string>
     <string name="_bx_events_page_block_title_sys_joined_entries"><![CDATA[Joined Events]]></string>
     <string name="_bx_events_page_block_title_sys_joined_entries"><![CDATA[Joined Events]]></string>
     <string name="_bx_events_page_block_title_joined_entries"><![CDATA[Joined Events]]></string>
     <string name="_bx_events_page_block_title_joined_entries"><![CDATA[Joined Events]]></string>
+    <string name="_bx_events_page_block_title_sys_joined_calendar"><![CDATA[Joined Events Calendar]]></string>
+    <string name="_bx_events_page_block_title_joined_calendar"><![CDATA[Joined Events Calendar]]></string>
     <string name="_bx_events_page_block_title_sys_followed_entries"><![CDATA[Following]]></string>
     <string name="_bx_events_page_block_title_sys_followed_entries"><![CDATA[Following]]></string>
     <string name="_bx_events_page_block_title_followed_entries"><![CDATA[Following]]></string>
     <string name="_bx_events_page_block_title_followed_entries"><![CDATA[Following]]></string>
     <string name="_bx_events_page_block_title_create_profile"><![CDATA[Create Event]]></string>
     <string name="_bx_events_page_block_title_create_profile"><![CDATA[Create Event]]></string>

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

@@ -230,7 +230,8 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_entries_actions', '_bx_events_page_block_title_entries_actions', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:18:"my_entries_actions";}', 0, 0, 1, 1),
 ('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_entries_actions', '_bx_events_page_block_title_entries_actions', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:18:"my_entries_actions";}', 0, 0, 1, 1),
 ('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_entries_of_author', '_bx_events_page_block_title_entries_of_author', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:22:"browse_created_entries";}', 0, 0, 0, 2),
 ('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_entries_of_author', '_bx_events_page_block_title_entries_of_author', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:22:"browse_created_entries";}', 0, 0, 0, 2),
 ('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_favorites_of_author', '_bx_events_page_block_title_favorites_of_author', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:21:"browse_favorite_lists";s:6:"params";a:2:{s:10:"profile_id";s:12:"{profile_id}";s:6:"params";a:3:{s:9:"unit_view";s:8:"showcase";s:13:"empty_message";b:0;s:13:"ajax_paginate";b:0;}}}', 0, 1, 1, 2),
 ('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_favorites_of_author', '_bx_events_page_block_title_favorites_of_author', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:21:"browse_favorite_lists";s:6:"params";a:2:{s:10:"profile_id";s:12:"{profile_id}";s:6:"params";a:3:{s:9:"unit_view";s:8:"showcase";s:13:"empty_message";b:0;s:13:"ajax_paginate";b:0;}}}', 0, 1, 1, 2),
-('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_joined_entries', '_bx_events_page_block_title_joined_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:21:"browse_joined_entries";s:6:"params";a:2:{i:0;i:0;i:1;b:1;}}', 0, 0, 1, 4);
+('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_joined_entries', '_bx_events_page_block_title_joined_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:21:"browse_joined_entries";s:6:"params";a:2:{i:0;i:0;i:1;b:1;}}', 0, 0, 1, 4),
+('bx_events_joined', 1, 'bx_events', '_bx_events_page_block_title_sys_joined_calendar', '_bx_events_page_block_title_joined_calendar', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:9:"bx_events";s:6:"method";s:8:"calendar";s:6:"params";a:1:{i:0;a:1:{s:10:"profile_id";s:12:"{profile_id}";}}}', 0, 0, 1, 5);
 
 
 
 
 -- PAGE: favorites by list
 -- PAGE: favorites by list