Trotor Posted February 3, 2015 Share Posted February 3, 2015 Не подскажите как реализовать функционал, что бы репутацию могли повышать/понижать через определённый промежуток времени? Помниться на старенькой и древненькой IPB 1.3 был большой функционал к моду репутации - на тройке на жаль очень скуден это функционал. Link to comment Share on other sites More sharing options...
Trotor Posted February 3, 2015 Author Share Posted February 3, 2015 Забыл важный момент уточнить:Юзер А может повысить/понизить репутацию юзеру Б только скажем через час Link to comment Share on other sites More sharing options...
siv1987 Posted February 3, 2015 Share Posted February 3, 2015 Повторный запрет на изменения репутации сводится к проверке в /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 - осуществляют проверку если ли пользователь может проголосовать за этот пост. Link to comment Share on other sites More sharing options...
siv1987 Posted February 3, 2015 Share Posted February 3, 2015 А в 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 ); } Нужно только проверить время когда пользователь проголосовал за этот пост и обновить рейтинг.Вот только проблемы могут быть с обновлением кеша. Link to comment Share on other sites More sharing options...
Trotor Posted February 3, 2015 Author Share Posted February 3, 2015 Нужно только проверить время, когда пользователь проголосовал за этот пост и обновить рейтинг.Немного не понял. А где указать время через которое юзер опять сможет проголосовать? Link to comment Share on other sites More sharing options...
Trotor Posted February 3, 2015 Author Share Posted February 3, 2015 У меня мод улучшенной репутации стоит, поэтому это идёт через хук: /* 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 ); } Link to comment Share on other sites More sharing options...
siv1987 Posted February 3, 2015 Share Posted February 3, 2015 Вообще, логика завязана на том, что запись рейтинга для поста от пользователя может быть только одна. Если он повторно и может проголосовать то только обновлением текущей записи, т.е. по статистике голос будет проходить один общий. Можно попробовать добавить новую запись, но за подводные камни которые при этом могут всплыть я не ручаюсь. Link to comment Share on other sites More sharing options...
siv1987 Posted February 3, 2015 Share Posted February 3, 2015 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' ) );Ну вот тут репутация и обновляется. Только не нужно обновлять на текущую, а суммировать к уже имеющиеся. Link to comment Share on other sites More sharing options...
Trotor Posted February 3, 2015 Author Share Posted February 3, 2015 Можно попробовать добавить новую запись, но за подводные камни которые при этом могут всплыть я не ручаюсь.Вы добавьте, я протестирую. Тем более как показала практика, все ваши новые записи всегда хорошо работают, подводных камней практически не наблюдалось :) Link to comment Share on other sites More sharing options...
siv1987 Posted February 4, 2015 Share Posted February 4, 2015 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 - время в секундах через которое юзер сможет повторно изменять рейтинг. Для удобство можете вывести в настройку АЦ. 1 Link to comment Share on other sites More sharing options...
Trotor Posted February 4, 2015 Author Share Posted February 4, 2015 @siv1987, Сейчас потестим :) Link to comment Share on other sites More sharing options...
Trotor Posted February 4, 2015 Author Share Posted February 4, 2015 Потестил. Не срабатывает, свободно повышаю определённому пользователю репутацию как и прежде без временного интервала :( Link to comment Share on other sites More sharing options...
siv1987 Posted February 4, 2015 Share Posted February 4, 2015 Может не тот файл отредактировали? Добавьте для теста перед if( $current_rating ) код $this->error_message = 'test reputation';return false; Link to comment Share on other sites More sharing options...
Trotor Posted February 4, 2015 Author Share Posted February 4, 2015 Может не тот файл отредактировали? Добавьте для теста перед if( $current_rating ) код $this->error_message = 'test reputation';return false;Добавил. При попытке изменения репутации выдаёт:Rating failed: test reputation Я так понял это проверка файла и она прошла. Link to comment Share on other sites More sharing options...
siv1987 Posted February 4, 2015 Share Posted February 4, 2015 Проверил на локалхосте. Там все отрабатывает нормально. При повторном изменение выдает ошибку что нужно подождать. SQL запрос отредактировали? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now