2011-09-13 13 views
0

私はCakePHPでフレンドシップシステムを構築しています。フレンドシステムは、ユーザーとフレンドの2つのテーブルを使用しています。ユーザーはCakePHPフレンドシップシステム

(ID、ユーザ名、電子メール、パスワード)と友人(ID、user_from、user_to、状態)

ユーザーが友達になり、他のユーザーを要求し、これを保存する友人のテーブルにレコードを作成し、両方のユーザーIDを取得し、「要求済み」のステータスを設定します。ユーザーは、友情とステータスの変更を「承認済み」に受け入れるか、または友人関係をキャンセルすると、レコードがデータベースから削除されます。

要求するための例のリンクが見えると、ユーザーリストまたはユーザーの詳細ページにどちらか示すことができた:

<?php echo $this->Html->link('Add as Friend', array('controller'=>'friends','action'=>'add_friend',$user['User']['id'])); ?>

質問1は、私は、このリンクの変更を行うことができる方法でありますユーザーにリクエストがあった場合や既に友だちの場合は、キャンセルリクエストリンク?

このリンクをクリックすると、コントローラに以下の方法に対応しています

function add_friend ($id) 
    { 
     if(!empty($this->data)) 
     { 
      $this->Friend->Create(); 
      if($this->Friend->save($this->data)) 
      { 
       $this->Session->setFlash('Friendship Requested'); 
       $this->redirect(array('controller'=>'users','action'=>'login')); 
      } 
     } 
    } 

だから我々はuser_toなりますメソッドにIDを渡しているとし、「user_from」は、現在のユーザーでログインする必要がありますステータスを「要求済み」に設定します。 質問2私はこれを行う方法ですか?また、そのメソッドを呼び出して複数のレコードを作成することをユーザーが防ぎ、既に友情を要求しているというメッセージを表示するにはどうすればよいですか。

次の方法は次のとおりです。

function accept_friendship ($id) 
    { 
    $this->Session->setFlash('Friendship Accepted'); 
       $this->redirect(array('controller'=>'friends','action'=>'index')); 
      } 
     } 
    } 

質問3:しかし、再び、私は、レコードのステータスを変更し、メソッドが呼び出されたときに友人としてユーザーをマークだろうかへと困惑しています。また、同じレコードで複数回呼び出されないようにする必要があります。あなたが最初の方法を見ることができるように表示しているユーザーのIDを必要とし、その後、第二の方法は、現在使用されます

function users_friends($id) 
{ 
$this->set('friends', $this->Friend->find('all')); 
} 

function my_friends() 
{ 
$this->set('friends', $this->Friend->find('all')); 
} 

最終ビットは、ユーザーまたは他のユーザーのために友人をリストされログインしたユーザーID。 質問4:これを使ってそのユーザーの友達を一覧表示するにはどうすればよいですか?

これで私が正しい軌道に乗るのを助けることができれば、私は中止に踏み切り、その4つのことをどうやってやるのか分からず、助けてくれるようにCakePHPを学ぼうとしているので、非常に感謝しています。ありがとう

EDIT:ユーザーが確認したフレンドリクエストに関する情報を隠しフィールドで表示すると、それが発生することがありますが、これは理想的ではありません。実際には、私は関数を実行してリダイレクトをまっすぐにしたいと思います。思ったことはありません!

+0

ありがとうございます – Cameron

+0

これは本当に別の質問に分割する必要があります – Ross

答えて

0

回答3は、このようなものですリクエストした場合はstatusフィールドをチェックし、それがの場合0に変更し、Acceptedに更新します。この方法では、一度だけ呼び出されます。

また、人々が繰り返し友人を「受け入れる」ことを防ぐため、受け入れられた後に「受け入れる」リンクを削除するだけです。 ifステートメントは、コードが不必要に更新されないようにします。

また、requested friendにのみacceptの要求を送信できるように、何らかの予防を行う必要があります。それ以外の場合は、URL yoursite.com/friends/accept_friendship/123を入力し、認証なしでランダムな人の要求を受け入れることができます。

+0

どうすればその保護を最後に行うのですか? – Cameron

1

回答1および2:

function add_friend ($id) 
{ 
    if(!empty($this->data)) 
    { 
     $this->Friend->Create(); 
     if($this->Friend->save($this->data)) 
     { 
      $this->Session->setFlash('Friendship Requested'); 
      $this->redirect(array('controller'=>'users','action'=>'login')); 
     } 
    } 
if(empty($this->data)) 
    { 
     $this->set('friends', $this->Friend->find('all',array('Friend.id'=>$id)); 
    } 
} 




<?php 

if($friends['Friend']['status']=="Requested") 
{ 
    echo $this->Html->link('Request Pending', '#'); 
} 
else if($friends['Friend']['status']=="Accepted") 
{ 
    echo $this->Html->link('Already Friend', '#'); 
} 
else 
{ 
     echo $this->Html->link('Add as Friend', array('controller'=>'friends','action'=>'add_friend',$user['User']['id'])); 
} 
?> 

回答3と4:

function accept_friendship ($id) { 
    $this->Friend->id = $id; 
    $current_status = $this->Friend->field('status'); 

    if($current_status=='Requested') { 
     $this->Application->saveField('status', 'Accepted'); 
    } 

    $this->Session->setFlash('Friendship Accepted'); 
    $this->redirect(array('controller'=>'friends','action'=>'index')); 
} 

は基本的に友人のIDを取得:

funcrion friendlist($user_id) 
{ 
$session_user_id = $this->Session->read('Auth.User.id') 
if($user_id == $session_user_id) 
{ 
    $user_to = $session_user_id ; 
} 
else 
{ 
    $user_to = $user_id; 
} 
$this->Friend->find('all',array('Friend.user_to'=>$user_to,'Friend.status'=>'Accepted') 
} 
+0

なぜあなたはadd_friendメソッドで見つけることがありますか?このメソッドは、テーブルにレコードを保存していて、何も見つけられないはずです.../ – Cameron