2016-11-29 4 views
-1

Ein Benutzer kann von einem anderen Benutzer bewertet werden, ich möchte nur eine Stimme zulassen. Ich habe mich entschieden, cookie zu verwenden, sobald eine Benutzerabstimmung ein Cookie gesetzt hat, wenn er die Seite aktualisiert, erhält der Benutzer eine Nachricht, die ihm sagt, dass er bereits bewertet hat.Mehrfache Bewertung verhindern

Das Problem ist, wenn der Benutzer versucht, einen anderen Benutzer zu bewerten, wird ihm eine Nachricht mitgeteilt, dass er bereits gewählt hat, aber er hat es noch nicht getan.

Ich verwende diese Sterne-Plugin: jQuery Raty

Dies ist, was getan hat:

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

Sie einfach in einer Datenbank speichern sollten die Benutzer eine andere gewählt hat Benutzer..? – Alex

+0

Ja gute Idee, aber wie kann ich dem gleichen Benutzer erlauben, nach 3 Tagen den gleichen Benutzer zu wählen, für den er bereits gewählt hat? – Sirius

+3

@Sirius, das ist eine andere Anforderung als ursprünglich gefordert. Aber es ist einfach zu machen. Etwas wie 'if ($ today> = $ lastVoteDay + 3) {...}'. Sie sollten in der Lage sein, das Datum der letzten Abstimmung aus Ihrer Datenbank abzurufen, oder? – Chris

Antwort

3

Das ist wirklich in der Server-Seite implementiert werden sollte, während Sie eine doppelte Bewertung geben, sollte es eine Fehlermeldung nicht akzeptieren und zurück. Wenn das erneute Laden der Seite dies behebt, dann können Sie auf der Client-Seite raty deaktivieren oder verbieten, nachdem es bewertet wurde.

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

Technisch sollte Ihr Code wie folgt aussehen:

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

Added 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>