Опубликовано: 3 февраля 201510 г Не подскажите как реализовать функционал, что бы репутацию могли повышать/понижать через определённый промежуток времени? Помниться на старенькой и древненькой IPB 1.3 был большой функционал к моду репутации - на тройке на жаль очень скуден это функционал.
Опубликовано: 3 февраля 201510 г Автор Забыл важный момент уточнить:Юзер А может повысить/понизить репутацию юзеру Б только скажем через час
Опубликовано: 3 февраля 201510 г Повторный запрет на изменения репутации сводится к проверке в /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 февраля 201510 г А в 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 ); } Нужно только проверить время когда пользователь проголосовал за этот пост и обновить рейтинг.Вот только проблемы могут быть с обновлением кеша.
Опубликовано: 3 февраля 201510 г Автор Нужно только проверить время, когда пользователь проголосовал за этот пост и обновить рейтинг.Немного не понял. А где указать время через которое юзер опять сможет проголосовать?
Опубликовано: 3 февраля 201510 г Автор У меня мод улучшенной репутации стоит, поэтому это идёт через хук: /* 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 ); }
Опубликовано: 3 февраля 201510 г Вообще, логика завязана на том, что запись рейтинга для поста от пользователя может быть только одна. Если он повторно и может проголосовать то только обновлением текущей записи, т.е. по статистике голос будет проходить один общий. Можно попробовать добавить новую запись, но за подводные камни которые при этом могут всплыть я не ручаюсь.
Опубликовано: 3 февраля 201510 г 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' ) );Ну вот тут репутация и обновляется. Только не нужно обновлять на текущую, а суммировать к уже имеющиеся.
Опубликовано: 3 февраля 201510 г Автор Можно попробовать добавить новую запись, но за подводные камни которые при этом могут всплыть я не ручаюсь.Вы добавьте, я протестирую. Тем более как показала практика, все ваши новые записи всегда хорошо работают, подводных камней практически не наблюдалось :)
Опубликовано: 4 февраля 201510 г 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 - время в секундах через которое юзер сможет повторно изменять рейтинг. Для удобство можете вывести в настройку АЦ.
Опубликовано: 4 февраля 201510 г Автор Потестил. Не срабатывает, свободно повышаю определённому пользователю репутацию как и прежде без временного интервала :(
Опубликовано: 4 февраля 201510 г Может не тот файл отредактировали? Добавьте для теста перед if( $current_rating ) код $this->error_message = 'test reputation';return false;
Опубликовано: 4 февраля 201510 г Автор Может не тот файл отредактировали? Добавьте для теста перед if( $current_rating ) код $this->error_message = 'test reputation';return false;Добавил. При попытке изменения репутации выдаёт:Rating failed: test reputation Я так понял это проверка файла и она прошла.
Опубликовано: 4 февраля 201510 г Проверил на локалхосте. Там все отрабатывает нормально. При повторном изменение выдает ошибку что нужно подождать. SQL запрос отредактировали?
Опубликовано: 4 февраля 201510 г Автор SQL запрос отредактировали?Да. Попробую ещё заново повторить всё, может где то ошибку допустил.
Не подскажите как реализовать функционал, что бы репутацию могли повышать/понижать через определённый промежуток времени?
Помниться на старенькой и древненькой IPB 1.3 был большой функционал к моду репутации - на тройке на жаль очень скуден это функционал.