Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

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

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

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

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

 

Помниться на старенькой и древненькой 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 запрос отредактировали?

Да.

 

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

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.