2016-11-29 16 views
-1

ユーザーは他のユーザーが評価することができます。投票を1回許可します。私はクッキーを使用することに決めました。ユーザーが投票したらブラウザにクッキーが設定されます。ページを更新すると、ユーザーは既に評価しているというメッセージを表示します。複数の評価を避ける

問題は、ユーザーが別のユーザーを評価しようとすると、既に投票しているが、彼はまだいないというメッセージが表示されます。 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

これは本当にあなたが重複した評価を与える一方で、それはエラーメッセージを受け入れ、返すべきではありません、サーバー側で実装する必要があります。ページを再読み込みすることで問題が解決された場合、クライアント側では、評価された後にratyを無効にするか無効にするかを選択できます。

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

技術的には、あなたのコードは次のようになります。

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

を追加しましたスニペット

$(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>

関連する問題