diff --git a/config/OpenPNE.yml.sample b/config/OpenPNE.yml.sample index 95d11167a..960a8712f 100644 --- a/config/OpenPNE.yml.sample +++ b/config/OpenPNE.yml.sample @@ -193,12 +193,15 @@ doctrine_cache_key_prefix: "" http_proxy: "" #################################### -# 言語設定 +# 国際化 (I18n) #################################### # 対応言語 supported_languages: ['en', 'ja_JP'] +# デフォルトタイムゾーン +default_timezone: "Asia/Tokyo" + #################################### # プラグインチャンネルサーバ設定 #################################### diff --git a/lib/user/opSecurityUser.class.php b/lib/user/opSecurityUser.class.php index 9f513691d..bdc600174 100644 --- a/lib/user/opSecurityUser.class.php +++ b/lib/user/opSecurityUser.class.php @@ -18,9 +18,12 @@ */ class opSecurityUser extends opAdaptableUser { + const TIMEZONE_NAMESPACE = 'openpne/user/opSecurityUser/timezone'; + protected $authAdapters = array(), - $serializedMember = ''; + $serializedMember = '', + $timezone = null; /** * Initializes the current user. @@ -37,9 +40,39 @@ public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $o parent::initialize($dispatcher, $storage, $options); + if (!isset($this->options['timezone'])) + { + $this->options['timezone'] = null; + } + if (!isset($this->options['default_timezone'])) + { + $this->options['default_timezone'] = sfConfig::get('op_default_timezone', date_default_timezone_get()); + } + + $currentTimezone = $storage->read(self::TIMEZONE_NAMESPACE); + $this->setTimezone(null !== $this->options['timezone'] ? $this->options['timezone'] : (null !== $currentTimezone ? $currentTimezone : $this->options['default_timezone'])); + $this->initializeCredentials(); } + public function shutdown() + { + parent::shutdown(); + + $this->storage->write(self::TIMEZONE_NAMESPACE, $this->timezone); + } + + public function setTimezone($timezone) + { + if ($this->timezone != $timezone) + { + $this->timezone = $timezone; + date_default_timezone_set($timezone); + + $this->dispatcher->notify(new sfEvent($this, 'user.change_timezone', array('timezone' => $timezone))); + } + } + public function getMemberId() { return $this->getAttribute('member_id', null, 'opSecurityUser'); @@ -252,6 +285,7 @@ public function login($memberId = null) } $this->setCulture($this->getMember()->getConfig('language', sfConfig::get('sf_default_culture'))); + $this->setTimezone($this->getMember()->getConfig('time_zone', sfConfig::get('op_default_timezone'))); return $uri; } diff --git a/lib/util/opDoctrineRecord.class.php b/lib/util/opDoctrineRecord.class.php index 2803fa6cd..d2c86abb3 100644 --- a/lib/util/opDoctrineRecord.class.php +++ b/lib/util/opDoctrineRecord.class.php @@ -78,6 +78,13 @@ protected function checkIsDatetimeField($fieldName) return 'datetime' === $definition['type']; } + protected function checkIsDatetimeOrTimestamp($fieldName) + { + $definition = $this->_table->getColumnDefinition($fieldName); + + return ('datetime' === $definition['type'] || 'timestamp' === $definition['type']); + } + protected function _set($fieldName, $value, $load = true) { // In setter, empty value must be handled as opDoctrineRecord::UNDEFINED_DATETIME @@ -85,6 +92,17 @@ protected function _set($fieldName, $value, $load = true) { $value = self::UNDEFINED_DATETIME; } + elseif ($this->checkIsDatetimeOrTimestamp($fieldName) && $time = strtotime($value)) + { + $timezone = date_default_timezone_get(); + $defaultTimezone = sfConfig::get('op_default_timezone', 'Asia/Tokyo'); + if ($timezone !== $defaultTimezone) + { + date_default_timezone_set($defaultTimezone); + $value = date('Y-m-d H:i:s', $time); + date_default_timezone_set($timezone); + } + } return parent::_set($fieldName, $value, $load); } @@ -117,7 +135,20 @@ public function _get($fieldName, $load = true) // In getter, opDoctrineRecord::UNDEFINED_DATETIME must be handled as null if ($this->checkIsDatetimeField($fieldName) && in_array($value, array(self::UNDEFINED_DATETIME, self::UNDEFINED_DATETIME_BC), true)) { - $value = null; + + return null; + } + elseif ($this->checkIsDatetimeOrTimestamp($fieldName) && $value) + { + $timezone = date_default_timezone_get(); + $defaultTimezone = sfConfig::get('op_default_timezone', 'Asia/Tokyo'); + if ($timezone !== $defaultTimezone) + { + date_default_timezone_set($defaultTimezone); + $time = strtotime($value); + date_default_timezone_set($timezone); + $value = date('Y-m-d H:i:s', $time); + } } return $value;