Your IP : 172.28.240.42


Current Path : /var/www/html/clients/rebirth.e-nk.ru/live/engine/modules/viewer/plugs/
Upload File :
Current File : /var/www/html/clients/rebirth.e-nk.ru/live/engine/modules/viewer/plugs/function.date_format.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);
}
?>