Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Trotor

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

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

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

 

Помниться на старенькой и древненькой 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 - время в секундах через которое юзер сможет повторно изменять рейтинг. Для удобство можете вывести в настройку АЦ.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

@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 запрос отредактировали?

Поделиться сообщением


Ссылка на сообщение

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

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

×
×
  • Создать...