1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-26 03:30:48 +03:00

Возможность указать часовой поясь в профиле

This commit is contained in:
Mzhelskiy Maxim 2012-07-27 09:36:55 +04:00
parent 38fd2dfc38
commit 15de718cfc
8 changed files with 186 additions and 51 deletions

View file

@ -352,12 +352,18 @@ class ActionSettings extends Action {
$this->sMenuSubItemSelect='tuning';
$this->Viewer_AddHtmlTitle($this->Lang_Get('settings_menu_tuning'));
$aTimezoneList=array('-12','-11','-10','-9.5','-9','-8','-7','-6','-5','-4.5','-4','-3.5','-3','-2','-1','0','1','2','3','3.5','4','4.5','5','5.5','5.75','6','6.5','7','8','8.75','9','9.5','10','10.5','11','11.5','12','12.75','13','14');
$this->Viewer_Assign('aTimezoneList',$aTimezoneList);
/**
* Если отправили форму с настройками - сохраняем
*/
if (isPost('submit_settings_tuning')) {
$this->Security_ValidateSendForm();
if (in_array(getRequest('settings_general_timezone'),$aTimezoneList)) {
$this->oUserCurrent->setSettingsTimezone(getRequest('settings_general_timezone'));
}
$this->oUserCurrent->setSettingsNoticeNewTopic( getRequest('settings_notice_new_topic') ? 1 : 0 );
$this->oUserCurrent->setSettingsNoticeNewComment( getRequest('settings_notice_new_comment') ? 1 : 0 );
$this->oUserCurrent->setSettingsNoticeNewTalk( getRequest('settings_notice_new_talk') ? 1 : 0 );
@ -374,6 +380,12 @@ class ActionSettings extends Action {
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
}
} else {
if (is_null($this->oUserCurrent->getSettingsTimezone())) {
$_REQUEST['settings_general_timezone']=(strtotime(date("Y-m-d H:i:s"))-strtotime(gmdate("Y-m-d H:i:s")))/3600 - date('I');
} else {
$_REQUEST['settings_general_timezone']=$this->oUserCurrent->getSettingsTimezone();
}
}
}
/**

View file

@ -77,7 +77,8 @@ class ModuleUser_MapperUser extends Mapper {
user_settings_notice_new_comment = ? ,
user_settings_notice_new_talk = ? ,
user_settings_notice_reply_comment = ? ,
user_settings_notice_new_friend = ?
user_settings_notice_new_friend = ? ,
user_settings_timezone = ?
WHERE user_id = ?
";
if ($this->oDb->query($sql,$oUser->getPassword(),
@ -104,6 +105,7 @@ class ModuleUser_MapperUser extends Mapper {
$oUser->getSettingsNoticeNewTalk(),
$oUser->getSettingsNoticeReplyComment(),
$oUser->getSettingsNoticeNewFriend(),
$oUser->getSettingsTimezone(),
$oUser->getId())) {
return true;
}

View file

@ -17,7 +17,7 @@
/**
* Плагин для смарти.
* Позволяет получать дату с возможностью склонения
* Позволяет получать дату с возможностью склонения
* формы слова и поддержкой мультиязычноти.
*
* Список ключей параметров:
@ -25,62 +25,71 @@
* format* [string]
* declination* [int]
* now* [int] Количество секунд, в течении которых событие имеет статус "Только что"
* day* [string] Указывает на необходимость замены "Сегодня", "Вчера", "Завтра".
* day* [string] Указывает на необходимость замены "Сегодня", "Вчера", "Завтра".
* В указанном формате 'day' будет заменено на соответствующее значение.
* minutes_back* [int] Количество минут, в течении которых событие имеет статус "... минут назад"
* hours_back* [int] Количество часов, в течении которых событие имеет статус "... часов назад"
*
*
* (* - параметр является необязательным)
*
*
* @param array $aParams
* @param Smarty $oSmarty
* @return string
*/
function smarty_function_date_format($aParams,&$oSmarty) {
require_once(Config::Get('path.root.engine').'/classes/Engine.class.php');
$oEngine = Engine::getInstance();
$oUserCurrent=$oEngine->User_GetUserCurrent();
$sFormatDefault = "d F Y, H:i"; // формат даты по умолчанию
$iDeclinationDefault = 1; // индекс склонения по умолчанию
/**
* Текущая дата и сдвиг времени для пользователя
*/
if ($oUserCurrent->getSettingsTimezone()) {
$iDiff=(date('I') + $oUserCurrent->getSettingsTimezone() - (strtotime(date("Y-m-d H:i:s"))-strtotime(gmdate("Y-m-d H:i:s")))/3600)*3600;
} else {
$iDiff=0; // пользователю показываем время от зоны из основного конфига
}
$iNow=time()+$iDiff;
/**
* Определяем дату
*/
$sDate = (empty($aParams['date'])) ? time() : $aParams['date'];
$sDate = (empty($aParams['date'])) ? $iNow : $aParams['date'];
$iDeclination = (!isset($aParams['declination'])) ? $iDeclinationDefault : $aParams['declination'];
$sFormat = (empty($aParams['format'])) ? $sFormatDefault : $aParams['format'];
require_once(Config::Get('path.root.engine').'/classes/Engine.class.php');
$oEngine = Engine::getInstance();
/**
* Если указан другой язык, подгружаем его
*/
if(isset($aParams['lang']) and $aParams['lang']!=$oEngine->Lang_GetLang()) {
$oEngine->Lang_SetLang($aParams['lang']);
}
$aMonth = $oEngine->Lang_Get('month_array');
$iDate= (preg_match("/^\d+$/",$sDate)) ? $sDate : strtotime($sDate);
$iDate+=$iDiff;
/**
* Если указана необходимость выполнять проверку на NOW
*/
if(isset($aParams['now'])) {
if($iDate+$aParams['now']>time()) return $oEngine->Lang_Get('date_now');
if($iDate+$aParams['now']>$iNow) return $oEngine->Lang_Get('date_now');
}
/**
* Если указана необходимость на проверку minutes back
*/
if(isset($aParams['minutes_back'])) {
require_once('modifier.declension.php');
$iTimeDelta = round((time()- $iDate)/60);
$iTimeDelta = round(($iNow- $iDate)/60);
if($iTimeDelta<$aParams['minutes_back']) {
return ($iTimeDelta!=0)
? smarty_modifier_declension(
$iTimeDelta,
$oEngine->Lang_Get('date_minutes_back',array('minutes'=>$iTimeDelta)),
$oEngine->Lang_GetLang()
)
$iTimeDelta,
$oEngine->Lang_Get('date_minutes_back',array('minutes'=>$iTimeDelta)),
$oEngine->Lang_GetLang()
)
: $oEngine->Lang_Get('date_minutes_back_less');
}
}
@ -90,58 +99,58 @@ function smarty_function_date_format($aParams,&$oSmarty) {
*/
if(isset($aParams['hours_back'])) {
require_once('modifier.declension.php');
$iTimeDelta = round((time()- $iDate)/(60*60));
$iTimeDelta = round(($iNow- $iDate)/(60*60));
if($iTimeDelta<$aParams['hours_back']) {
return ($iTimeDelta!=0)
return ($iTimeDelta!=0)
? smarty_modifier_declension(
$iTimeDelta,
$oEngine->Lang_Get('date_hours_back',array('hours'=>$iTimeDelta)),
$oEngine->Lang_GetLang()
)
$iTimeDelta,
$oEngine->Lang_Get('date_hours_back',array('hours'=>$iTimeDelta)),
$oEngine->Lang_GetLang()
)
: $oEngine->Lang_Get('date_hours_back_less');
}
}
/**
* Если указана необходимость автоподстановки "Сегодня", "Вчера", "Завтра".
*/
if(isset($aParams['day']) and $aParams['day']) {
switch(date('Y-m-d',$iDate)) {
switch(date('Y-m-d',$iDate)) {
/**
* Если дата совпадает с сегодняшней
*/
case date('Y-m-d'):
$sDay=$oEngine->Lang_Get('date_today');
break;
$sDay=$oEngine->Lang_Get('date_today');
break;
/**
* Если дата совпадает со вчерашней
*/
case date('Y-m-d', mktime(0, 0, 0, date("m") , date("d")-1, date("Y")) ):
$sDay=$oEngine->Lang_Get('date_yesterday');
break;
/**
$sDay=$oEngine->Lang_Get('date_yesterday');
break;
/**
* Если дата совпадает с завтрашней
*/
case date('Y-m-d', mktime(0, 0, 0, date("m") , date("d")+1, date("Y")) ):
$sDay=$oEngine->Lang_Get('date_tomorrow');
break;
default:
$sDay=null;
}
if( $sDay ) {
$sFormat=str_replace("day",preg_replace("#(\w{1})#",'\\\${1}',$sDay),$aParams['day']);
return date($sFormat,$iDate);
}
$sDay=$oEngine->Lang_Get('date_tomorrow');
break;
default:
$sDay=null;
}
if( $sDay ) {
$sFormat=str_replace("day",preg_replace("#(\w{1})#",'\\\${1}',$sDay),$aParams['day']);
return date($sFormat,$iDate);
}
}
/**
* Определяем нужное текстовое значение названия месяца
*/
$iMonth = date("n",$iDate);
$sMonth = isset($aMonth[$iMonth])
? $aMonth[$iMonth]
$sMonth = isset($aMonth[$iMonth])
? $aMonth[$iMonth]
: "";
/**
@ -149,11 +158,11 @@ function smarty_function_date_format($aParams,&$oSmarty) {
* Если индекс по умолчанию также не определен, берем первое значение в массиве.
*/
if(is_array($sMonth)) {
$sMonth = isset($sMonth[$iDeclination])
? $sMonth[$iDeclination]
$sMonth = isset($sMonth[$iDeclination])
? $sMonth[$iDeclination]
: $sMonth[$iDeclinationDefault];
}
$sFormat=preg_replace("~(?<!\\\\)F~U",preg_replace('~(\w{1})~u','\\\${1}',$sMonth),$sFormat);
return date($sFormat,$iDate);

View file

@ -0,0 +1 @@
ALTER TABLE `prefix_user` ADD `user_settings_timezone` VARCHAR( 6 ) NULL DEFAULT NULL AFTER `user_settings_notice_new_friend`;

View file

@ -676,6 +676,8 @@ return array(
'settings_tuning_notice_new_talk' => 'on a new Personal Message',
'settings_tuning_notice_reply_comment' => 'on reply to comment',
'settings_tuning_notice_new_friend' => 'On joining to a friends list',
'settings_tuning_general' => 'General settings',
'settings_tuning_general_timezone' => 'Timezone',
'settings_tuning_submit' => 'Save configs',
'settings_tuning_submit_ok' => 'Configs saved',
'settings_account' => 'Settings account',
@ -1143,5 +1145,47 @@ return array(
'date_minutes_back_less' => 'Less than a minute ago',
'date_hours_back' => '%%hours%% hours ago; %%hours%% hours ago; %%hours%% hours ago',
'date_hours_back_less' => 'Less than an hour ago',
'timezone_list'=> array(
'-12' => '[UTC - 12] Baker Island Time',
'-11' => '[UTC - 11] Niue Time, Samoa Standard Time',
'-10' => '[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time',
'-9.5' => '[UTC - 9:30] Marquesas Islands Time',
'-9' => '[UTC - 9] Alaska Standard Time, Gambier Island Time',
'-8' => '[UTC - 8] Pacific Standard Time',
'-7' => '[UTC - 7] Mountain Standard Time',
'-6' => '[UTC - 6] Central Standard Time',
'-5' => '[UTC - 5] Eastern Standard Time',
'-4.5' => '[UTC - 4:30] Venezuelan Standard Time',
'-4' => '[UTC - 4] Atlantic Standard Time',
'-3.5' => '[UTC - 3:30] Newfoundland Standard Time',
'-3' => '[UTC - 3] Amazon Standard Time, Central Greenland Time',
'-2' => '[UTC - 2] Fernando de Noronha Time, South Georgia &amp; the South Sandwich Islands Time',
'-1' => '[UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time',
'0' => '[UTC] Western European Time, Greenwich Mean Time',
'1' => '[UTC + 1] Central European Time, West African Time',
'2' => '[UTC + 2] Eastern European Time, Central African Time',
'3' => '[UTC + 3] Moscow Standard Time, Eastern African Time',
'3.5' => '[UTC + 3:30] Iran Standard Time',
'4' => '[UTC + 4] Gulf Standard Time, Samara Standard Time',
'4.5' => '[UTC + 4:30] Afghanistan Time',
'5' => '[UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time',
'5.5' => '[UTC + 5:30] Indian Standard Time, Sri Lanka Time',
'5.75' => '[UTC + 5:45] Nepal Time',
'6' => '[UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time',
'6.5' => '[UTC + 6:30] Cocos Islands Time, Myanmar Time',
'7' => '[UTC + 7] Indochina Time, Krasnoyarsk Standard Time',
'8' => '[UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time',
'8.75' => '[UTC + 8:45] Southeastern Western Australia Standard Time',
'9' => '[UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time',
'9.5' => '[UTC + 9:30] Australian Central Standard Time',
'10' => '[UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time',
'10.5' => '[UTC + 10:30] Lord Howe Standard Time',
'11' => '[UTC + 11] Solomon Island Time, Magadan Standard Time',
'11.5' => '[UTC + 11:30] Norfolk Island Time',
'12' => '[UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time',
'12.75' => '[UTC + 12:45] Chatham Islands Time',
'13' => '[UTC + 13] Tonga Time, Phoenix Islands Time',
'14' => '[UTC + 14] Line Island Time'
)
);
?>

View file

@ -678,6 +678,8 @@ return array(
'settings_tuning_notice_new_talk' => 'при новом личном сообщении',
'settings_tuning_notice_reply_comment' => 'при ответе на комментарий',
'settings_tuning_notice_new_friend' => 'при добавлении вас в друзья',
'settings_tuning_general' => 'Общие настройки',
'settings_tuning_general_timezone' => 'Часовой пояс',
'settings_tuning_submit' => 'сохранить настройки',
'settings_tuning_submit_ok' => 'Настройки успешно сохранены',
'settings_account' => 'Настройки акаунта',
@ -1145,5 +1147,47 @@ return array(
'date_minutes_back_less' => 'Менее минуты назад',
'date_hours_back' => '%%hours%% час назад; %%hours%% часа назад; %%hours%% часов назад',
'date_hours_back_less' => 'Менее часа назад',
'timezone_list'=> array(
'-12' => '[UTC 12] Меридиан смены дат (запад)',
'-11' => '[UTC 11] о. Мидуэй, Самоа',
'-10' => '[UTC 10] Гавайи',
'-9.5' => '[UTC 9:30] Маркизские острова',
'-9' => '[UTC 9] Аляска',
'-8' => '[UTC 8] Тихоокеанское время (США и Канада) и Тихуана',
'-7' => '[UTC 7] Аризона',
'-6' => '[UTC 6] Мехико, Центральная Америка, Центральное время (США и Канада)',
'-5' => '[UTC 5] Индиана (восток), Восточное время (США и Канада)',
'-4.5' => '[UTC 4:30] Венесуэла',
'-4' => '[UTC 4] Сантьяго, Атлантическое время (Канада)',
'-3.5' => '[UTC 3:30] Ньюфаундленд',
'-3' => '[UTC 3] Бразилия, Гренландия',
'-2' => '[UTC 2] Среднеатлантическое время',
'-1' => '[UTC 1] Азорские острова, острова Зелёного мыса',
'0' => '[UTC] Время по Гринвичу: Дублин, Лондон, Лиссабон, Эдинбург',
'1' => '[UTC + 1] Берлин, Мадрид, Париж, Рим, Западная Центральная Африка',
'2' => '[UTC + 2] Афины, Вильнюс, Киев, Минск, Рига, Таллин, Центральная Африка',
'3' => '[UTC + 3] Волгоград, Москва, Самара, Санкт-Петербург',
'3.5' => '[UTC + 3:30] Тегеран',
'4' => '[UTC + 4] Баку, Ереван, Тбилиси',
'4.5' => '[UTC + 4:30] Кабул',
'5' => '[UTC + 5] Екатеринбург, Исламабад, Карачи, Оренбург, Ташкент',
'5.5' => '[UTC + 5:30] Бомбей, Калькутта, Мадрас, Нью-Дели',
'5.75' => '[UTC + 5:45] Катманду',
'6' => '[UTC + 6] Алматы, Астана, Новосибирск, Омск',
'6.5' => '[UTC + 6:30] Рангун',
'7' => '[UTC + 7] Бангкок, Красноярск',
'8' => '[UTC + 8] Гонконг, Иркутск, Пекин, Сингапур',
'8.75' => '[UTC + 8:45] Юго-восточная Западная Австралия',
'9' => '[UTC + 9] Токио, Сеул, Чита, Якутск',
'9.5' => '[UTC + 9:30] Дарвин',
'10' => '[UTC + 10] Владивосток, Канберра, Мельбурн, Сидней',
'10.5' => '[UTC + 10:30] Лорд-Хау',
'11' => '[UTC + 11] Камчатка, Магадан, Сахалин, Соломоновы о-ва',
'11.5' => '[UTC + 11:30] Остров Норфолк',
'12' => '[UTC + 12] Новая Зеландия, Фиджи',
'12.75' => '[UTC + 12:45] Острова Чатем',
'13' => '[UTC + 13] Острова Феникс, Тонга',
'14' => '[UTC + 14] Остров Лайн'
)
);
?>

View file

@ -22,6 +22,18 @@
<label><input {if $oUserCurrent->getSettingsNoticeReplyComment()}checked{/if} type="checkbox" id="settings_notice_reply_comment" name="settings_notice_reply_comment" value="1" class="input-checkbox" /> {$aLang.settings_tuning_notice_reply_comment}</label>
<label><input {if $oUserCurrent->getSettingsNoticeNewFriend()}checked{/if} type="checkbox" id="settings_notice_new_friend" name="settings_notice_new_friend" value="1" class="input-checkbox" /> {$aLang.settings_tuning_notice_new_friend}</label>
</fieldset>
<fieldset>
<legend>{$aLang.settings_tuning_general}</legend>
<label>{$aLang.settings_tuning_general_timezone}:
<select name="settings_general_timezone" class="input-width-400">
{foreach from=$aTimezoneList item=sTimezone}
<option value="{$sTimezone}" {if $_aRequest.settings_general_timezone==$sTimezone}selected="selected"{/if}>{$aLang.timezone_list[$sTimezone]}</option>
{/foreach}
</select>
</label>
</fieldset>
{hook run='form_settings_tuning_end'}

View file

@ -20,6 +20,17 @@
<label><input {if $oUserCurrent->getSettingsNoticeReplyComment()}checked{/if} type="checkbox" id="settings_notice_reply_comment" name="settings_notice_reply_comment" value="1" class="input-checkbox" /> {$aLang.settings_tuning_notice_reply_comment}</label>
<label><input {if $oUserCurrent->getSettingsNoticeNewFriend()}checked{/if} type="checkbox" id="settings_notice_new_friend" name="settings_notice_new_friend" value="1" class="input-checkbox" /> {$aLang.settings_tuning_notice_new_friend}</label>
<br />
<h3>{$aLang.settings_tuning_general}</h3>
<label>{$aLang.settings_tuning_general_timezone}:
<select name="settings_general_timezone" class="input-width-400">
{foreach from=$aTimezoneList item=sTimezone}
<option value="{$sTimezone}" {if $_aRequest.settings_general_timezone==$sTimezone}selected="selected"{/if}>{$aLang.timezone_list[$sTimezone]}</option>
{/foreach}
</select>
</label>
{hook run='form_settings_tuning_end'}
<br />
<button type="submit" name="submit_settings_tuning" class="button button-primary">{$aLang.settings_profile_submit}</button>