Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
asterix_kpi

Доп. поле Ваш водительский стаж

Recommended Posts

Доброго времени суток!

Подскажите... может кто-то уже делал такое....

 

Как организовать дополнительное поле в профиле "Ваш стаж вождения"

Вводят дату получения прав - а в профиле выводиться Ваш стаж - 1 год 9 месяцев и 2 дня...(ну и под аватарой тоже)

Спасибо!

Share this post


Link to post
Share on other sites

Хех и до сих пор ответа нет) Не уж то никто не знает как это сделать? Тоже нужно подобное, доп.поле где вводят дату, нажимают ок, а система сама высчитывает сколько времени с даты прошло и выводит в профиле пользователя. Только мне не обязательно что бы всё это выводилось в темах, только на страничках пользователей. Сколько искал, ничего не нашёл.

Share this post


Link to post
Share on other sites

Для этого нужно править шаблоны и вручную вывести это дополнительное поле, используя php выражение высчитываете текущаю дату минус дату получения прав.

Share this post


Link to post
Share on other sites

Для этого нужно править шаблоны и вручную вывести это дополнительное поле, используя php выражение высчитываете текущаю дату минус дату получения прав.

Примерно понимаю о чём вы говорите, но сам наврятли смогу реализовать)

Share this post


Link to post
Share on other sites

Примерно понимаю о чём вы говорите, но сам наврятли смогу реализовать)

Думаю, что часть PHP кода можно взять из даты рождения. Там расчет идет по такому же способу.

 

$member['bday_day']   		= intval( ipsRegistry::$request['day'] );
	$member['bday_month'] 		= intval( ipsRegistry::$request['month'] );
	$member['bday_year']  		= intval( ipsRegistry::$request['year'] );

	$to_update = array( 'bday_day'   		=> $member['bday_day'],
						'bday_month' 		=> $member['bday_month'],							'bday_year'  		=> $member['bday_year']

Edited by MartinFox

Share this post


Link to post
Share on other sites

Там совсем другой способ хранения времени, и расчет тоже немного другой.

 

1. Открыть /admin/sources/base/core.php

Найти

 

   /**
    * Set the timestamp
    *
    * @param    int        New timestamp
    * @return    @e void
    */
   static public function setTimestamp( $time )

Выше добавить

 

static public function time_diff( $date )
{
	$datetime1 = new DateTime();
	$datetime2 = new DateTime( $date );
	$interval  = $datetime1->diff( $datetime2 );

	$keys = array( 'y', 'm', 'd', 'h', 'i', 's' );
	$iter = 0;
	$time_diff = array();

	foreach( $keys as $k => $v )
	{
		if( $interval->$v )
		{
			$time_diff[] = self::decline( $interval->$v, $v );
			$cn = ( ! $iter ) ? ( ( $v == 'y' ) ? 3 : 2 ) : $cn;

			if( ++$iter == $cn )
			{
				break;
			}
		}
	}

	return count( $time_diff ) ? implode( " ", $time_diff ) : "--";
}

static public function decline( $num, $values=array() )
{
	$decline = array( 'y' => array( 'год', 'года', 'лет' ),
					  'm' => array( 'месяц', 'месяца', 'месяцев' ),
					  'd' => array( 'день', 'дня', 'дней' ),
					  'h' => array( 'час', 'часа', 'часов' ),
					  'i' => array( 'минута', 'минуты', 'минут' ),
					  's' => array( 'секунда', 'секунды', 'секунд' ),
	);

	if( is_string( $values ) )
	{
		$values = isset( $decline[ $values ] ) ? $decline[ $values ] : array();
	}

	$keys = array( 2, 0, 1, 1, 1, 2 );
	return $num . ' ' . $values[ ( $num % 100 > 4 && $num %100 < 20) ? 2 : $keys[min($num % 10, 5)] ];
}

Файл сохранить как UTF-8 безм BOM.

 

2. Создать новое дополнительное поле в группе Profile information.

Тип поля -одна строка

Формат поля - nn.nn.nnnn

 

3. Открыть шаблон Профили пользователей -> profileModern

Найти

 

										<if test="!empty($value)">
											<li class='clear clearfix'>
												{$value}
											</li>
										</if>

Заменить на

 

										<if test="!empty($value)">
											<li class='clear clearfix'>
											<if test="$key == 'ключ_поле'">
												{parse expression="str_replace( $member['field_ид_поле'], IPSTime::time_diff( $member['field_ид_поле'] ), $value)"}
											<else />
												{$value}
											</if>
											</li>
										</if>

ключ_поле - заменить на ключ дополнительного поле

ид_поле - заменить на ид дополнительного поле.

  • Upvote 1

Share this post


Link to post
Share on other sites

            return self::decline( $interval->y, 'y' ) . ( $interval->m ? ' ' . self::decline( $interval->m, 'm' ) : ' ' . decline( $interval->d, 'd' ) );

Пропустили self::

 

Может лучше if/else заменить на цикл? :)

  • Upvote 1

Share this post


Link to post
Share on other sites

Спасибо.

 

Можно и циклом, но я использовал if/else из расчета на то чтобы для разных относительных дат использовать разные условия. Например вместо 1 год 0 месяцев - 1 год 15 дней, 1 месяц 6 часов и тд. При том для малых значений типа минуты и секунды допустимо значение 0 - 1 час 0 минут. Хотя если будет оптимальный цикл то почему бы и нет - например следующие ненулевое значение + для каждого типа массив со своим форматом времени.

 

Пожалуй да, заменю. :)

Share this post


Link to post
Share on other sites
Например вместо 1 год 0 месяцев - 1 год 15 дней, 1 месяц 6 часов и тд.
А в первом варианте, если установить дату с сегодняшними месяцем и числом и отличным от текущего годом (20.08.2000), как раз выходило 15 лет 0 дней.

 

    static public function time_diff( $date )
   {
       $datetime1 = new DateTime();
       $datetime2 = new DateTime( $date );
       $interval  = $datetime1->diff( $datetime2 );

       $result = array();
       $iter = 0;

       foreach (array('y', 'm', 'd', 'h', 'i', 's') as $i)
       {
           if ($interval->$i)
           {
               $result[] = self::decline( $interval->$i, $i );

               $iter++;
               if ($iter == 2)
               {
                   break;
               }
           }
       }

       return count($result) ? implode(' ', $result) : '--';
   }

  • Upvote 1

Share this post


Link to post
Share on other sites

А в первом варианте, если установить дату с сегодняшними месяцем и числом и отличным от текущего годом (20.08.2000), как раз выходило 15 лет 0 дней.

Мне было лень еще одно условие дописать для дня.

 

Заменил. Думаю предустановленные форматы никому не нужны.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...