Пользователь может быть оценен другим пользователем, я хотел бы разрешить только один голос. Я решил использовать cookie, как только пользователь проголосует за cookie, установленным в браузере, когда он обновит страницу, у пользователя появится сообщение о том, что он уже оценил.Предотвращение множественного рейтинга
Проблема в том, что если пользователь попытается оценить другого пользователя, у него появится сообщение о том, что он уже голосовал, но он этого еще не сделал.
Я использую этот рейтинг звезда плагин: jQuery Raty
Это то, что сделали:
StarRatingController.php
/**
* Return the result of rating action
*
* @return Response
*/
public function rateAction()
{
$request = $this->getRequest();
$contentId = (int)$request->request->get('contentId');
$score = (float)$request->request->get('score');
$starrating = $this->get('fly_starrating_service');
$average = $starrating->save($contentId, $score);
$response = new Response();
$cookie = new Cookie('star_rating', 'rated', time()+3600 * 3 , '/', null, false, false);
$response->headers->setCookie($cookie);
return $response->setContent($average);
}
UserShow.html.twig
{% if app.request.cookies.has('star_rating') %}
<p>You have already rated</p>
{{ render(controller("IdeatoStarRatingBundle:StarRating:alreadyRated", {contentId:entity.id})) }}
{% else %}
{{ render(controller("IdeatoStarRatingBundle:StarRating:displayRate", {contentId:entity.id})) }}
{% endif %}
Javascript
jQuery(function($){
$('.alreadyRated').raty({
path: '/symfony/web/bundles/ideatostarrating/images/',
score: function() {
return $(this).data('score');
},
readOnly: function() {
return true;//$(this).attr('data-readonly') == 'true'
},
click: function(score, evt) {
var t = $(this);
var url = t.data('route');
var data = {
contentId: t.data('contentid'),
score: score
};
t.raty('readOnly', true);
$.post(url, data)
.done(function(result){
t.raty('score', result);
t.trigger('isr-rated', { score: score, average: result });
})
.fail(function(){
alert('An error occurred. Please try again');
t.raty('readOnly', false);
});
}
});
});
вы должны просто сохранить в базе данных, которые пользователь проголосовал другой пользователь ..? – Alex
Да, хорошая идея, но как я могу позволить тому же пользователю проголосовать через 3 дня того же пользователя, за который он уже голосовал? – Sirius
@ Сириус, это другое требование от того, что вы изначально задали. Но это легко сделать. Что-то вроде 'if ($ today> = $ lastVoteDay + 3) {...}'. Вы должны иметь возможность получить дату последнего голосования из своей базы данных, не так ли? – Chris