Просмотр исходного кода

#2820 Events: timezone setting is ignored for date interpretation.

Alex Trofimov 6 лет назад
Родитель
Сommit
373ea51577

+ 6 - 18
modules/boonex/events/classes/BxEventsDb.php

@@ -120,26 +120,14 @@ class BxEventsDb extends BxBaseModGroupsDb
             ", $aBindings);
             ", $aBindings);
 
 
             // prepare variables for each event
             // prepare variables for each event
-            $sCurrentDay = $oDateIter->format('Y-m-d');
             foreach ($a as $k => $r) {
             foreach ($a as $k => $r) {
-                $oDateStart = new DateTime();
-                $oDateStart->setTimestamp($r['date_start']);
-                $oDateStart->setTimezone(new DateTimeZone('UTC'));
-                $oDateEnd = new DateTime();
-                $oDateEnd->setTimestamp($r['date_end']);
-                $oDateEnd->setTimezone(new DateTimeZone('UTC'));
-                $oDuration = $oDateStart->diff($oDateEnd);
+                $oDateStart = new DateTime('@' . $r['date_start']);
+                $oDateEnd = new DateTime('@' . $r['date_end']);
 
 
-                $sHoursStart = $oDateStart->format('H:i:s');
-
-                $oStart = date_create($sCurrentDay . ' ' . $sHoursStart, new DateTimeZone($r['timezone'] ? $r['timezone'] : 'UTC'));
-                $oEnd = $oStart ? clone($oStart) : null;
-                $oEnd = $oEnd ? $oEnd->add($oDuration) : null;
-
-                $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]['start'] = $oDateStart ? $oDateStart->format('c') : 0;
+                $a[$k]['end'] = $oDateEnd ? $oDateEnd->format('c') : 0;
+                $a[$k]['start_utc'] = $oDateStart ? $oDateStart->getTimestamp() : 0;
+                $a[$k]['end_utc'] = $oDateEnd ? $oDateEnd->getTimestamp() : 0;
                 $a[$k]['url'] = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $this->_oConfig->CNF['URI_VIEW_ENTRY'] . '&id=' . $r['id']);
                 $a[$k]['url'] = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $this->_oConfig->CNF['URI_VIEW_ENTRY'] . '&id=' . $r['id']);
             }
             }
 
 

+ 35 - 5
modules/boonex/events/classes/BxEventsFormEntry.php

@@ -121,8 +121,32 @@ class BxEventsFormEntry extends BxBaseModGroupsFormEntry
         return $sJsCode . parent::getCode($bDynamicMode);
         return $sJsCode . parent::getCode($bDynamicMode);
     }
     }
 
 
-    function initChecker ($aValues = array (), $aSpecificValues = array())
+    protected function fixTimezone(&$aValues, $bAdd = true)
     {
     {
+        $sTimezone = 'UTC';
+        if (isset($aValues['timezone']) && $aValues['timezone'])
+            $sTimezone = $aValues['timezone'];
+        elseif (isset($this->aInputs['timezone']['value']) && $this->aInputs['timezone']['value'])
+            $sTimezone = $this->aInputs['timezone']['value'];
+
+        $oTz = new DateTimeZone($sTimezone);
+        $oDateTz = new DateTime("now", $oTz);
+        $iTimeOffset = $oTz->getOffset($oDateTz);
+        $a = array('date_start', 'date_end');
+        foreach ($a as $sField) {
+            if (!isset($aValues[$sField]) && isset($this->aInputs[$sField]['value']) && $this->aInputs[$sField]['value']) {
+                $aValues[$sField] = $this->getCleanValue($sField);
+            }
+            if (isset($aValues[$sField]) && $aValues[$sField] && isset($this->aInputs[$sField]) && isset($this->aInputs[$sField]['db']['pass']) && 'DateTimeTs' == $this->aInputs[$sField]['db']['pass']) {
+                $aValues[$sField] += ($bAdd ? $iTimeOffset : -$iTimeOffset);
+            }
+        }
+    }
+
+    function initChecker ($aValues = array (), $aSpecificValues = array())
+    {        
+        $this->fixTimezone($aValues, true);
+
         if (isset($aValues[$this->_oModule->_oConfig->CNF['FIELD_ID']]))
         if (isset($aValues[$this->_oModule->_oConfig->CNF['FIELD_ID']]))
             $this->_iContentId = $aValues[$this->_oModule->_oConfig->CNF['FIELD_ID']];
             $this->_iContentId = $aValues[$this->_oModule->_oConfig->CNF['FIELD_ID']];
         
         
@@ -192,8 +216,9 @@ class BxEventsFormEntry extends BxBaseModGroupsFormEntry
 
 
         $iTimeStart = bx_process_input ($this->aInputs['date_start']['value'], isset($this->aInputs['date_start']['date_filter']) ? $this->aInputs['date_start']['date_filter'] : BX_DATA_DATETIME_TS, false, false);
         $iTimeStart = bx_process_input ($this->aInputs['date_start']['value'], isset($this->aInputs['date_start']['date_filter']) ? $this->aInputs['date_start']['date_filter'] : BX_DATA_DATETIME_TS, false, false);
         $iTimeEnd = bx_process_input ($this->aInputs['date_end']['value'], isset($this->aInputs['date_end']['date_filter']) ? $this->aInputs['date_end']['date_filter'] : BX_DATA_DATETIME_TS, false, false);
         $iTimeEnd = bx_process_input ($this->aInputs['date_end']['value'], isset($this->aInputs['date_end']['date_filter']) ? $this->aInputs['date_end']['date_filter'] : BX_DATA_DATETIME_TS, false, false);
-        $oDateStart = date_create(date('Y-m-d H:i:s', $iTimeStart), new DateTimeZone($this->aInputs['timezone']['value'] ? $this->aInputs['timezone']['value'] : 'UTC'));
-        $oDateEnd = date_create(date('Y-m-d H:i:s', $iTimeEnd), new DateTimeZone($this->aInputs['timezone']['value'] ? $this->aInputs['timezone']['value'] : 'UTC'));
+
+        $oDateStart = date_create("@$iTimeStart");
+        $oDateEnd = date_create("@$iTimeEnd");
 
 
         return array('start' => $oDateStart, 'end' => $oDateEnd);
         return array('start' => $oDateStart, 'end' => $oDateEnd);
     }
     }
@@ -204,6 +229,7 @@ class BxEventsFormEntry extends BxBaseModGroupsFormEntry
             return '';
             return '';
 
 
         $aStartEnd = $this->_getStartEnd();
         $aStartEnd = $this->_getStartEnd();
+
         if ($aStartEnd === false)
         if ($aStartEnd === false)
             $aInput['value'] = "Timezone, date start & date end fields are required to display this field";
             $aInput['value'] = "Timezone, date start & date end fields are required to display this field";
         else if(is_array($aStartEnd) && empty($aStartEnd))
         else if(is_array($aStartEnd) && empty($aStartEnd))
@@ -228,9 +254,9 @@ class BxEventsFormEntry extends BxBaseModGroupsFormEntry
             if(is_array($aStartEnd) && empty($aStartEnd))
             if(is_array($aStartEnd) && empty($aStartEnd))
                 return null;
                 return null;
 
 
-            $sFormat = $aStartEnd['start']->format('Y-m-d') == $aStartEnd['end']->format('Y-m-d') ? BX_FORMAT_DATE : BX_FORMAT_DATE_TIME;
+            $sFormat = getParam($aStartEnd['start']->format('Y-m-d') == $aStartEnd['end']->format('Y-m-d') ? 'bx_events_short_date_format' : 'bx_events_datetime_format');
             $oDate = 'date_start' == $aInput['name'] ? $aStartEnd['start'] : $aStartEnd['end'];
             $oDate = 'date_start' == $aInput['name'] ? $aStartEnd['start'] : $aStartEnd['end'];
-            return bx_time_js ($oDate->getTimestamp(), $sFormat, true);
+            return $oDate->format($sFormat);
         }
         }
         return parent::genViewRowValue($aInput);
         return parent::genViewRowValue($aInput);
     }
     }
@@ -265,6 +291,8 @@ class BxEventsFormEntry extends BxBaseModGroupsFormEntry
 
 
     public function insert ($aValsToAdd = array(), $isIgnore = false)
     public function insert ($aValsToAdd = array(), $isIgnore = false)
     {
     {
+        $this->fixTimezone($aValsToAdd, false);
+
         $iContentId = parent::insert ($aValsToAdd, $isIgnore);
         $iContentId = parent::insert ($aValsToAdd, $isIgnore);
 
 
         if (isset($this->aInputs['reoccurring']) && is_array($this->aInputs['reoccurring']['ghost_template']) && !isset($this->aInputs['reoccurring']['ghost_template']['inputs'])) {
         if (isset($this->aInputs['reoccurring']) && is_array($this->aInputs['reoccurring']['ghost_template']) && !isset($this->aInputs['reoccurring']['ghost_template']['inputs'])) {
@@ -278,6 +306,8 @@ class BxEventsFormEntry extends BxBaseModGroupsFormEntry
 
 
     function update ($val, $aValsToAdd = array(), &$aTrackTextFieldsChanges = null)
     function update ($val, $aValsToAdd = array(), &$aTrackTextFieldsChanges = null)
     {
     {
+        $this->fixTimezone($aValsToAdd, false);
+
         $iAffectedRows = parent::update($val, $aValsToAdd, $aTrackTextFieldsChanges);
         $iAffectedRows = parent::update($val, $aValsToAdd, $aTrackTextFieldsChanges);
 
 
         if (isset($this->aInputs['reoccurring']) && is_array($this->aInputs['reoccurring']['ghost_template']) && !isset($this->aInputs['reoccurring']['ghost_template']['inputs'])) {
         if (isset($this->aInputs['reoccurring']) && is_array($this->aInputs['reoccurring']['ghost_template']) && !isset($this->aInputs['reoccurring']['ghost_template']['inputs'])) {

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

@@ -303,8 +303,10 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
 
 
         $CNF = $this->_oConfig->CNF;
         $CNF = $this->_oConfig->CNF;
 
 
-        $oDateStart = date_create('@' . $aContentInfo['date_start'], new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
-        $oDateEnd = date_create('@' . ($aContentInfo['date_start'] > $aContentInfo['repeat_stop'] ? $aContentInfo['date_start'] : $aContentInfo['repeat_stop']), new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
+        $oDateStart = date_create('@' . $aContentInfo['date_start']);
+        $oDateStart->setTimezone(new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
+        $oDateEnd = date_create('@' . ($aContentInfo['date_start'] > $aContentInfo['repeat_stop'] ? $aContentInfo['date_start'] : $aContentInfo['repeat_stop']));
+        $oDateEnd->setTimezone(new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
 
 
         $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS']);
         $oMetatags = BxDolMetatags::getObjectInstance($CNF['OBJECT_METATAGS']);
         $sLocationString = $oMetatags ? $oMetatags->locationsString($aContentInfo[$CNF['FIELD_ID']], false) : false;
         $sLocationString = $oMetatags ? $oMetatags->locationsString($aContentInfo[$CNF['FIELD_ID']], false) : false;

+ 10 - 4
modules/boonex/events/classes/BxEventsTemplate.php

@@ -28,18 +28,24 @@ class BxEventsTemplate extends BxBaseModGroupsTemplate
 
 
         $oPrivacy = BxDolPrivacy::getObjectInstance($CNF['OBJECT_PRIVACY_VIEW']);
         $oPrivacy = BxDolPrivacy::getObjectInstance($CNF['OBJECT_PRIVACY_VIEW']);
 
 
+        $aContentInfo = $this->getModule()->_oDb->getContentInfoById($aData[$CNF['FIELD_ID']]);
+
+        $oDateStart = date_create('@' . $aContentInfo['date_start']);
+        $oDateStart->setTimezone(new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
+
+        $oDateEnd = date_create('@' . $aContentInfo['date_end']);
+        $oDateEnd->setTimezone(new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
+
         $isPublic = CHECK_ACTION_RESULT_ALLOWED === $this->getModule()->checkAllowedView($aData) || $oPrivacy->isPartiallyVisible($aData[$CNF['FIELD_ALLOW_VIEW_TO']]);        
         $isPublic = CHECK_ACTION_RESULT_ALLOWED === $this->getModule()->checkAllowedView($aData) || $oPrivacy->isPartiallyVisible($aData[$CNF['FIELD_ALLOW_VIEW_TO']]);        
         if ($isPublic) {
         if ($isPublic) {
-            $aContentInfo = $this->getModule()->_oDb->getContentInfoById($aData[$CNF['FIELD_ID']]);
-            $oDateStart = date_create('@' . $aContentInfo['date_start'], new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
             $aVars['bx_if:info']['content']['members'] = $oDateStart->format(getParam('bx_events_short_date_format'));
             $aVars['bx_if:info']['content']['members'] = $oDateStart->format(getParam('bx_events_short_date_format'));
         }
         }
 
 
         return array_merge($aVars, array(
         return array_merge($aVars, array(
 			'date_start' => $aData['date_start'],
 			'date_start' => $aData['date_start'],
-			'date_start_f' => date('j M', $aData['date_start']),
+			'date_start_f' => $oDateStart->format('j M'),
 			'date_end' => $aData['date_end'],
 			'date_end' => $aData['date_end'],
-			'date_end_f' => date('j M', $aData['date_end']),
+			'date_end_f' => $oDateEnd->format('j M'),
         ));
         ));
     }
     }
 }
 }

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

@@ -9,6 +9,7 @@
 	<string name="_bx_events_option_num_rss"><![CDATA[Number of items in RSS feed]]></string>
 	<string name="_bx_events_option_num_rss"><![CDATA[Number of items in RSS feed]]></string>
     <string name="_bx_events_option_time_format"><![CDATA[Time format]]></string>
     <string name="_bx_events_option_time_format"><![CDATA[Time format]]></string>
     <string name="_bx_events_option_short_date_format"><![CDATA[Short date format]]></string>
     <string name="_bx_events_option_short_date_format"><![CDATA[Short date format]]></string>
+    <string name="_bx_events_option_datetime_format"><![CDATA[Date and time format]]></string>
     <string name="_bx_events_option_summary_chars"><![CDATA[Number of characters in auto-cropped event summary]]></string>
     <string name="_bx_events_option_summary_chars"><![CDATA[Number of characters in auto-cropped event summary]]></string>
     <string name="_bx_events_option_searchable_fields"><![CDATA[Searchable fields]]></string>
     <string name="_bx_events_option_searchable_fields"><![CDATA[Searchable fields]]></string>
     <string name="_bx_events_option_public_subscribed_me"><![CDATA[Public list of interested members]]></string>
     <string name="_bx_events_option_public_subscribed_me"><![CDATA[Public list of interested members]]></string>

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

@@ -18,6 +18,7 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `e
 ('bx_events_per_page_browse_recommended', '10', @iCategId, '_sys_option_per_page_browse_recommended', 'digit', '', '', '', 16),
 ('bx_events_per_page_browse_recommended', '10', @iCategId, '_sys_option_per_page_browse_recommended', 'digit', '', '', '', 16),
 ('bx_events_time_format', 'H:i', @iCategId, '_bx_events_option_time_format', 'digit', '', '', '', 20),
 ('bx_events_time_format', 'H:i', @iCategId, '_bx_events_option_time_format', 'digit', '', '', '', 20),
 ('bx_events_short_date_format', 'j M y', @iCategId, '_bx_events_option_short_date_format', 'digit', '', '', '', 22),
 ('bx_events_short_date_format', 'j M y', @iCategId, '_bx_events_option_short_date_format', 'digit', '', '', '', 22),
+('bx_events_datetime_format', 'j M Y H:i', @iCategId, '_bx_events_option_datetime_format', 'digit', '', '', '', 23),
 ('bx_events_summary_chars', '700', @iCategId, '_bx_events_option_summary_chars', 'digit', '', '', '', 25),
 ('bx_events_summary_chars', '700', @iCategId, '_bx_events_option_summary_chars', 'digit', '', '', '', 25),
 ('bx_events_searchable_fields', 'event_name,event_desc', @iCategId, '_bx_events_option_searchable_fields', 'list', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:21:"get_searchable_fields";}', '', '', 30),
 ('bx_events_searchable_fields', 'event_name,event_desc', @iCategId, '_bx_events_option_searchable_fields', 'list', 'a:2:{s:6:"module";s:9:"bx_events";s:6:"method";s:21:"get_searchable_fields";}', '', '', 30),
 ('bx_events_public_subscribed_me', 'on', @iCategId, '_bx_events_option_public_subscribed_me', 'checkbox', '', '', '', 40);
 ('bx_events_public_subscribed_me', 'on', @iCategId, '_bx_events_option_public_subscribed_me', 'checkbox', '', '', '', 40);

+ 2 - 1
modules/boonex/events/js/entry.js

@@ -23,7 +23,8 @@ function BxEventsEntry(oOptions) {
 }
 }
 
 
 BxEventsEntry.prototype.init = function() {
 BxEventsEntry.prototype.init = function() {
-    $("[name = 'timezone']").val(moment.tz.guess());
+    if ('UTC' == $("[name = 'timezone']").val())
+        $("[name = 'timezone']").val(moment.tz.guess());
 };
 };
 
 
 /** @} */
 /** @} */

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

@@ -9,6 +9,7 @@
 	<string name="_bx_events_option_num_rss"><![CDATA[Количество элементов в ленте RSS]]></string>
 	<string name="_bx_events_option_num_rss"><![CDATA[Количество элементов в ленте RSS]]></string>
     <string name="_bx_events_option_time_format"><![CDATA[Формат времени]]></string>
     <string name="_bx_events_option_time_format"><![CDATA[Формат времени]]></string>
     <string name="_bx_events_option_short_date_format"><![CDATA[Короткий формат даты]]></string>
     <string name="_bx_events_option_short_date_format"><![CDATA[Короткий формат даты]]></string>
+    <string name="_bx_events_option_datetime_format"><![CDATA[Формат даты со временем]]></string>
     <string name="_bx_events_option_summary_chars"><![CDATA[Количество символов в автогенерируемой сводке к событию]]></string>
     <string name="_bx_events_option_summary_chars"><![CDATA[Количество символов в автогенерируемой сводке к событию]]></string>
     <string name="_bx_events_option_searchable_fields"><![CDATA[Поля для поиска]]></string>
     <string name="_bx_events_option_searchable_fields"><![CDATA[Поля для поиска]]></string>
     <string name="_bx_events_option_public_subscribed_me"><![CDATA[Открытый список заинтересованных пользователей]]></string>
     <string name="_bx_events_option_public_subscribed_me"><![CDATA[Открытый список заинтересованных пользователей]]></string>