mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-07-09 09:54:26 +03:00
161 lines
5.6 KiB
PHP
161 lines
5.6 KiB
PHP
<?php
|
||
/*-------------------------------------------------------
|
||
*
|
||
* LiveStreet Engine Social Networking
|
||
* Copyright © 2008 Mzhelskiy Maxim
|
||
*
|
||
*--------------------------------------------------------
|
||
*
|
||
* Official site: www.livestreet.ru
|
||
* Contact e-mail: rus.engine@gmail.com
|
||
*
|
||
* GNU General Public License, version 2:
|
||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||
*
|
||
---------------------------------------------------------
|
||
*/
|
||
|
||
/**
|
||
* Плагин для смарти.
|
||
* Позволяет получать дату с возможностью склонения
|
||
* формы слова и поддержкой мультиязычноти.
|
||
*
|
||
* Список ключей параметров:
|
||
* date* [string]
|
||
* format* [string]
|
||
* declination* [int]
|
||
* now* [int] Количество секунд, в течении которых событие имеет статус "Только что"
|
||
* day* [string] Указывает на необходимость замены "Сегодня", "Вчера", "Завтра".
|
||
* В указанном формате 'day' будет заменено на соответствующее значение.
|
||
* minutes_back* [int] Количество минут, в течении которых событие имеет статус "... минут назад"
|
||
* hours_back* [int] Количество часов, в течении которых событие имеет статус "... часов назад"
|
||
*
|
||
* (* - параметр является необязательным)
|
||
*
|
||
* @param array $aParams
|
||
* @param Smarty $oSmarty
|
||
* @return string
|
||
*/
|
||
function smarty_function_date_format($aParams,&$oSmarty) {
|
||
$sFormatDefault = "d F Y, H:i"; // формат даты по умолчанию
|
||
$iDeclinationDefault = 1; // индекс склонения по умолчанию
|
||
|
||
/**
|
||
* Определяем дату
|
||
*/
|
||
$sDate = (empty($aParams['date'])) ? time() : $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);
|
||
|
||
/**
|
||
* Если указана необходимость выполнять проверку на NOW
|
||
*/
|
||
if(isset($aParams['now'])) {
|
||
if($iDate+$aParams['now']>time()) return $oEngine->Lang_Get('date_now');
|
||
}
|
||
|
||
/**
|
||
* Если указана необходимость на проверку minutes back
|
||
*/
|
||
if(isset($aParams['minutes_back'])) {
|
||
require_once('modifier.declension.php');
|
||
|
||
$iTimeDelta = round((time()- $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()
|
||
)
|
||
: $oEngine->Lang_Get('date_minutes_back_less');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Если указана необходимость на проверку minutes back
|
||
*/
|
||
if(isset($aParams['hours_back'])) {
|
||
require_once('modifier.declension.php');
|
||
|
||
$iTimeDelta = round((time()- $iDate)/(60*60));
|
||
if($iTimeDelta<$aParams['hours_back']) {
|
||
return ($iTimeDelta!=0)
|
||
? smarty_modifier_declension(
|
||
$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)) {
|
||
/**
|
||
* Если дата совпадает с сегодняшней
|
||
*/
|
||
case date('Y-m-d'):
|
||
$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;
|
||
/**
|
||
* Если дата совпадает с завтрашней
|
||
*/
|
||
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",$sDay,$aParams['day']);
|
||
return date($sFormat,$iDate);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Определяем нужное текстовое значение названия месяца
|
||
*/
|
||
$iMonth = date("n",$iDate);
|
||
$sMonth = isset($aMonth[$iMonth])
|
||
? $aMonth[$iMonth]
|
||
: "";
|
||
|
||
/**
|
||
* Если не найден индекс склонения, берем склонене по умолчанию.
|
||
* Если индекс по умолчанию также не определен, берем первое значение в массиве.
|
||
*/
|
||
if(is_array($sMonth)) {
|
||
$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);
|
||
}
|
||
?>
|