CheeseCake:投票機能

2015 年 9 月 23 日 水曜日

今度作るシステムに投票機能が必要だったので調べてみた。確認したかったのは、どのように重複投票チェックをしているかの一点です。

投票履歴テーブル

CheeseCakeでは、投票の履歴を記録し、投票のたびに投票履歴がないかチェックしています。
投票履歴の記録に使われているテーブルはratinghistories。

mysql> show fields from cc2_ratinghistories;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| photo_id   | int(11)     | NO   | MUL | NULL    |                |
| visitor_id | varchar(32) | NO   |     | NULL    |                |
| created    | datetime    | NO   |     | NULL    |                |
| modified   | datetime    | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

投票された写真のIdをphoto_idに、投票者のIdをvisitor_idに格納します。

visitorIdのゲット/セット

Cookieにvisitorキーの値が格納されている場合は$visitorIdにセットし、ratinghistoriesテーブルからレコードが存在するかチェックしています。Cookieに値が格納されていなかった場合は逆に値を格納。

if ($this->Cookie->read('visitor')){    $visitorId = $this->Cookie->read('visitor');    $hasVoted = $this->Ratinghistory->hasAny('Ratinghistory.photo_id = '.$photoId.' AND Ratinghistory.visitor_id = "'.$visitorId.'"');}else{   $hasVoted = false;   $visitorId = md5(uniqid(time()));   $this->Cookie->write('visitor', $visitorId, true, '1 month');}

Cookie->writeの4つ目のパラメータに’1 month’を指定し、visitorIdを1ヶ月保存しています。これで、一ヶ月間は重複して投票できなくなるわけか。なるほど。

はじめての投票の時のみ投票処理

あとは、投票チェックの結果にあわせて処理を変えればいいだけですね。

if ($hasVoted){    
    $message = __('You can only vote once per photo.', true);    
    $this->Session->setFlash($message, 'default', array(), 'error');
}else{    
    $this->__updateRating($photoId, $visitorId);    
    $message = __('Thanks, your vote has been counted.', true);
    $this->Session->setFlash($message, 'default', array(), 'success');
}

学んだこと/調べたこと

  • 重複チェックのパターン。投票以外にも使えそう。
  • 1.2で実装されたCookieコンポーネントの使い方。CookieコンポーネントのAPIもはじめて読んだ。

関連記事

コメントをどうぞ

トラックバック

このエントリーのトラックバックURL:

http://www.bmoo.net/archives/2009/01/171034.html/trackback