Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Повышение репутации через определённый промежуток времени

Опубликовано:

Не подскажите как реализовать функционал, что бы репутацию могли повышать/понижать через определённый промежуток времени?

 

Помниться на старенькой и древненькой IPB 1.3 был большой функционал к моду репутации - на тройке на жаль очень скуден это функционал.

Рекомендованные сообщения

Опубликовано:
  • Автор

Забыл важный момент уточнить:

Юзер А может повысить/понизить репутацию юзеру Б только скажем через час

Опубликовано:

Повторный запрет на изменения репутации сводится к проверке в /admin/sources/classes/class_reputation_cache.php, метод addRate

 

IPB 3.4.6

 

	/* Check for existing rating */
	$currentRating = $this->getCurrentMemberRating( array( 'app' => $app, 'type' => $type, 'id' => $type_id, 'memberId' => $this->memberData['member_id'] ) );

	/* Check the point types */
	if ( $rating == -1 && IPSMember::canRepDown( $currentRating, $this->memberData ) === false )
	{
		$this->error_message = $this->lang->words['reputation_invalid'];
		return false;
	}

	if ( $rating == 1 && IPSMember::canRepUp( $currentRating, $this->memberData ) === false )
	{
		$this->error_message = $this->lang->words['reputation_invalid'];
		return false;
	}

 

getCurrentMemberRating - возвращает запись рейтинга к сообщению для этого пользователя.

canRepDown и canRepUp - осуществляют проверку если ли пользователь может проголосовать за этот пост.

Опубликовано:

А в 3.1.4 все еще проще

 

	/* Insert */
	if( $current_rating )
	{
		//ipsRegistry::DB()->update( 'reputation_index', $db_insert, "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ) );
		return true;
	}
	else
	{
		ipsRegistry::DB()->insert( 'reputation_index', $db_insert );
	}

Нужно только проверить время когда пользователь проголосовал за этот пост и обновить рейтинг.

Вот только проблемы могут быть с обновлением кеша.

Опубликовано:
  • Автор

Нужно только проверить время, когда пользователь проголосовал за этот пост и обновить рейтинг.

Немного не понял. А где указать время через которое юзер опять сможет проголосовать?

Опубликовано:
  • Автор

У меня мод улучшенной репутации стоит, поэтому это идёт через хук:

		/* Insert */
	if( $current_rating )
	{
		ipsRegistry::DB()->update( 'reputation_index', $db_insert, "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ) );
	}
	else
	{
		ipsRegistry::DB()->insert( 'reputation_index', $db_insert );
	}

Опубликовано:

Вообще, логика завязана на том, что запись рейтинга для поста от пользователя может быть только одна. Если он повторно и может проголосовать то только обновлением текущей записи, т.е. по статистике голос будет проходить один общий. Можно попробовать добавить новую запись, но за подводные камни которые при этом могут всплыть я не ручаюсь.

Опубликовано:

ipsRegistry::DB()->update( 'reputation_index', $db_insert, "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ) );

Ну вот тут репутация и обновляется. Только не нужно обновлять на текущую, а суммировать к уже имеющиеся.

Опубликовано:
  • Автор

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

Вы добавьте, я протестирую. Тем более как показала практика, все ваши новые записи всегда хорошо работают, подводных камней практически не наблюдалось :)

Опубликовано:

		ipsRegistry::DB()->update( 'reputation_index', $db_insert, "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ) );

Заменить на

 

		$time_offset = 3600;
		$offset      = time() - $time_offset;

		if( $current_rating['rep_date'] > $offset )
		{
			$time_again = $current_rating['rep_date'] - $offset;

			$this->error_message = 'You have already voted for this post. Be able to vote again after '.IPSTime::time_ago( $time_again );
			return false;
		}

		ipsRegistry::DB()->insert( 'reputation_index', $db_insert );
		$current_rating = array();

Чуть выше в sql запросе найти

 

																		'where'  => "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ),

Ниже добавить

 

																		'order'  => 'id DESC',
																		'limit'  => array(0, 1),

 

3600 - время в секундах через которое юзер сможет повторно изменять рейтинг. Для удобство можете вывести в настройку АЦ.

Опубликовано:
  • Автор

@siv1987,

Сейчас потестим :)

Опубликовано:
  • Автор

Потестил. Не срабатывает, свободно повышаю определённому пользователю репутацию как и прежде без временного интервала :(

Опубликовано:

Может не тот файл отредактировали? Добавьте для теста перед if( $current_rating ) код

$this->error_message = 'test reputation';

return false;

Опубликовано:
  • Автор

Может не тот файл отредактировали? Добавьте для теста перед if( $current_rating ) код

$this->error_message = 'test reputation';

return false;

Добавил. При попытке изменения репутации выдаёт:

Rating failed: test reputation

 

Я так понял это проверка файла и она прошла.

Опубликовано:

Проверил на локалхосте. Там все отрабатывает нормально. При повторном изменение выдает ошибку что нужно подождать. SQL запрос отредактировали?

Опубликовано:
  • Автор

SQL запрос отредактировали?

Да.

 

Попробую ещё заново повторить всё, может где то ошибку допустил.

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.