Форматирование дат (На сайте: 1 год 5 месяцев 6 дней )

Хочу поделится хаком, как выводить дату в таком формате. Для этого необходимо в файл \engine\modules\viewer\plugs\function.date_format.php в function smarty_function_date_format вставить:

if(isset($aParams['day_back'])) {
		require_once('modifier.declension.php');
		$iTimeDelta = round((time()- $iDate)/(60*60*24));
		$year=floor($iTimeDelta/365);
		$mouth=floor(($iTimeDelta%365)/30);
		$day=($iTimeDelta%365)%30;
		$r = "";
		if($year>0) $r = smarty_modifier_declension(
						$year,
						$oEngine->Lang_Get('date_year_back',array('year'=>$year)),
						$oEngine->Lang_GetLang()
					);
		if($mouth>0) $r.= smarty_modifier_declension(
						$mouth,
						$oEngine->Lang_Get('date_mouth_back',array('mouth'=>$mouth)),
						$oEngine->Lang_GetLang()
					); 	
		if($day>0)	$r.= smarty_modifier_declension(
						$day,
						$oEngine->Lang_Get('date_day_back',array('day'=>$day)),
						$oEngine->Lang_GetLang()
					);	
		if($r!=""){
			return $r;
		}
		else return $oEngine->Lang_Get('date_day_back_less');
			
		
	}

В файл \templates\language\russian.php

'date_day_back' => '%%day%% день; %%day%% дня; %%day%% дней',
'date_mouth_back' => '%%mouth%% месяц; %%mouth%% месяца; %%mouth%% месяцев',
'date_year_back' => '%%year%% год; %%year%% года; %%year%% лет',

И при выводе даты прописать {date_format date=$oUserProfile->getDateRegister() day_back=«1»}

19 комментариев

avatar
Спасибо, отличный хак!
avatar
В версии 0.3.1 файла \engine\modules\viewer\plugs\function.date_format.php нет.
Куда там вставлять?
avatar
это для 0.4.2
avatar
Я понял. А в версии 0.3.1 в каких файлах изменения вносить? Или там такого не предусмотрено?
avatar
вот не пойму я разработчиков, все время произволят изменения в структуре, то одни файлы есть, то потом другие появляются. а эти удаляют.

Что-то не продумали они сразу хорошую структуру для дальнейшей расширяемости(
avatar
Отличное решение, Спасибо..=)
avatar
Странно, но у меня ошибка:
Fatal error: Call to a member function Lang_Get() on a non-object in /public_html/engine/modules/viewer/plugs/function.date_format.php on line 51


Вот мой function.date_format.php
function smarty_function_date_format($aParams,&$oSmarty) {
	$sFormatDefault = "d F Y, H:i";  //  формат даты по умолчанию
	$iDeclinationDefault  = 1;       //  индекс склонения по умолчанию
	if(isset($aParams['day_back'])) {
		require_once('modifier.declension.php');
		$iTimeDelta = round((time()- $iDate)/(60*60*24));
		$year=floor($iTimeDelta/365);
		$mouth=floor(($iTimeDelta%365)/30);
		$day=($iTimeDelta%365)%30;
		$r = "";
		if($year>0) $r = smarty_modifier_declension(
			$year,
			$oEngine->Lang_Get('date_year_back',array('year'=>$year)),
			$oEngine->Lang_GetLang()
			);
		if($mouth>0) $r.= smarty_modifier_declension(
			$mouth,
			$oEngine->Lang_Get('date_mouth_back',array('mouth'=>$mouth)),
			$oEngine->Lang_GetLang()
			);      
		if($day>0) $r.= smarty_modifier_declension(
			$day,
			$oEngine->Lang_Get('date_day_back',array('day'=>$day)),
			$oEngine->Lang_GetLang()
			);      
		if($r!=""){return $r;
			}
		else return $oEngine->Lang_Get('date_day_back_less');
	}


В файл \templates\language\russian.php я все вставил. Не могу понять в чем дело %)
  • Loci
  • 0
avatar
Ругается на 51строчку. У меня это
$oEngine->Lang_Get('date_year_back',array('year'=>$year)),
avatar
require_once(Config::Get('path.root.engine').'/classes/Engine.class.php');
$oEngine = Engine::getInstance();
avatar
Немогу сообразить куда это пихнуть. Можно разжевать ^_~
avatar
Перед первым использованием oEngine
avatar
Спасибо, заработало. Но чувствую я гдето немного напортачил (;
Почемуто выводиться только «41 год 24 дня», причем абсолютно у любого профиля. Хоть созданного в том году, хоть сегодняшнего.

Вот мой измененный function.date_format.php

function smarty_function_date_format($aParams,&$oSmarty) {
	$sFormatDefault = "d F Y, H:i";  //  формат даты по умолчанию
	$iDeclinationDefault  = 1;       //  индекс склонения по умолчанию
	
	require_once(Config::Get('path.root.engine').'/classes/Engine.class.php');
	$oEngine = Engine::getInstance();
	
	if(isset($aParams['day_back'])) {
		require_once('modifier.declension.php');
		$iTimeDelta = round((time()- $iDate)/(60*60*24));
		$year=floor($iTimeDelta/365);
		$mouth=floor(($iTimeDelta%365)/30);
		$day=($iTimeDelta%365)%30;
		$r = "";
		if($year>0) $r = smarty_modifier_declension(
			$year,
			$oEngine->Lang_Get('date_year_back',array('year'=>$year)),
			$oEngine->Lang_GetLang()
			);
		if($mouth>0) $r.= smarty_modifier_declension(
			$mouth,
			$oEngine->Lang_Get('date_mouth_back',array('mouth'=>$mouth)),
			$oEngine->Lang_GetLang()
			);      
		if($day>0) $r.= smarty_modifier_declension(
			$day,
			$oEngine->Lang_Get('date_day_back',array('day'=>$day)),
			$oEngine->Lang_GetLang()
			);      
		if($r!=""){return $r;
			}
		else return $oEngine->Lang_Get('date_day_back_less');
	}

Где я тут напакостил?
avatar
не могу понять куда это прописать
{date_format date=$oUserProfile->getDateRegister() day_back=«1»}
avatar
в шаблон
avatar
то есть в header.tpl?
avatar
еще один способ:

modules/user/User.entity.class.php
вставляем в любом месте:

# USER AGE
	public function getProfileAge(){
		
        $dob=$this->_aData['user_profile_birthday'];
		if (!$dob){
			return null;
		}
		$datetime = strtotime($dob);
		$elapsedSeconds = mktime() - $datetime; 
   		 // There are 31556926 seconds in a year. 
   		$yearsOld = $elapsedSeconds / 31556926; 
   		$yearsOld = floor($yearsOld); 
    	return $yearsOld;
	}

в skins/actions/whois.tpl

<td>{date_format date=$oUserProfile->getProfileBirthday() format="j F Y"}</td>

заменяем на
<td>{$oUserProfile->getProfileAge()}</td>

все.
avatar
обратите внимание, файлы могут подменяться одним из плагинов. тогда изменения нужно в плагин вносить.
avatar
данный вариант не чего не выводит
avatar
Можно обойтись шаблоном для вывода возраста:
{floor((time() - strtotime($oUserProfile->getProfileBirthday()))/(60*60*24*365))}
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.