web-dev-qa-db-ja.com

レートモジュールの投票で複数投票を防ぐにはどうすればよいですか?

rate module をインストールし、感情ウィジェットを設定しました。このモジュールは好きですが、投票に成功したら、もう一度[投票]ボタンをクリックできます。代わりに、「あなたは投票しました。再度投票しないでください」というウィンドウをポップアップして、人々が複数回投票するのを防ぎます。

2
enjoylife

レートモジュールはこれをサポートしていません。これを実行したい場合、あなたの最良のオプションは

  • 重複投票を拒否します。方法はあなた次第ですが、投票したすべてのIPアドレスを格納する投票APIテーブルを確認して、_rate_vote_alter_フックを使用できます。この方法で行うと、投票を変更できなくなります。
  • もう1つのオプションは、_rate_vote_alter_を使用して、評価モジュールが投票を保存しないようにし、_votingapi_set_votes_を使用して自分で行う方法です。これにより、(古い)投票を削除する基準を設定できるようになります。

レートモジュールがより柔軟に構築されていれば、これはもっと簡単にできたでしょう。他のユーザーが使用できるようにこの機能を追加するには、レートモジュールの問題とパッチを作成することを検討できます。

更新:
alterフックはどこにも定義されていませんが、drupal_alter('rate_vote', $votes, $context)で定義されています。つまり、次のことができるはずです。

_function my_module_rate_vote_alter(&$votes, $context) {
  ..
}
_
4
googletorp

人々のための作業コード:

/**
 * Implements hook_rate_vote_alter().
 */
function mymodule_rate_vote_alter(&$votes, &$context) {
  $cookie = $votes['tag'] . '_' . $votes['entity_type'] . '_' . $votes['entity_id'];
  // If the cookie is already set.
  if (isset($_COOKIE["$cookie"])) {
    // Indicating not to accept this vote.
    $context['save'] = FALSE;
  }
  else {
    // Set cookie and make sure that its valid for next 30 days.
    // This will populate the $_COOKIE["$cookie"] and make sure to block the
    // vote if user is trying to vote it more than once.
    setcookie("$cookie", 'ratevote', time() + (60 * 60 * 24 * 30), '/');
  }
}

hook_rate_vote_alter()は rate.hooks.inc で利用できます

0

これは、投票をデータベースに保存しない例です。

function my_module_rate_vote_alter(&$votes, $context) {
  // Check the database.

  $context['save'] = FALSE;
}
0
user2515