2016-11-29 15 views
-1

Пользователь может быть оценен другим пользователем, я хотел бы разрешить только один голос. Я решил использовать 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); 
       }); 
     } 
    }); 
}); 
+2

вы должны просто сохранить в базе данных, которые пользователь проголосовал другой пользователь ..? – Alex

+0

Да, хорошая идея, но как я могу позволить тому же пользователю проголосовать через 3 дня того же пользователя, за который он уже голосовал? – Sirius

+3

@ Сириус, это другое требование от того, что вы изначально задали. Но это легко сделать. Что-то вроде 'if ($ today> = $ lastVoteDay + 3) {...}'. Вы должны иметь возможность получить дату последнего голосования из своей базы данных, не так ли? – Chris

ответ

3

Это должно быть действительно реализованы на стороне сервера, в то время как вы даете оценку дубликата, он не должен принимать и возвращать сообщение об ошибке. Если страница перегрузки исправляет ее, то на стороне клиента вы можете отключить или запретить ратировку после того, как она была оценена.

$('div').raty('readOnly', true); 

Технически, ваш код должен выглядеть следующим образом:

$('div').raty('click', function() { 
    $(this).raty('readOnly', true); 
}); 

Добавлено Snippet

$(function() { 
 
    $('div').raty({ 
 
    'click': function() { 
 
     $(this).raty('readOnly', true); 
 
    } 
 
    }); 
 
});
<base href="https://cdnjs.cloudflare.com/ajax/libs/raty/2.7.1/images/" /> 
 
<script src="https://code.jquery.com/jquery-2.2.4.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/raty/2.7.1/jquery.raty.min.js"></script> 
 
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/raty/2.7.1/jquery.raty.min.css" /> 
 
<div></div>