我正在CakePHP中建立一个使用两个表的友谊系统:用户和朋友。
在用户(ID,用户名,电子邮件,密码)和朋友(id,user_from,user_to,status)
用户请求另一个用户成为朋友,这会在friends表中创建一条记录,同时存储用户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'));
}
}
}
因此我们将ID传递给user_to
的方法,然后'user_from'需要是当前登录的用户并将状态设置为'Requested'。 问题2 是怎么做的?另外,如何通过调用该方法来阻止用户创建多个记录,并显示一条消息,说明您已经请求了友谊。
下一个方法是:
function accept_friendship ( $id )
{
$this->Session->setFlash('Friendship Accepted');
$this->redirect(array('controller'=>'friends','action'=>'index'));
}
}
}
问题3:但我再次对于如何更改记录的状态以及在调用方法时将用户标记为朋友感到困惑。还需要防止在同一记录上多次调用它。
最后一位是为用户或其他用户列出朋友:
function users_friends( $id )
{
$this->set('friends', $this->Friend->find('all'));
}
function my_friends()
{
$this->set('friends', $this->Friend->find('all'));
}
如您所见,第一种方法需要您正在查看的用户的ID,然后第二种方法将使用当前登录的用户ID。 问题4:我如何使用它来列出该用户的朋友?
如果有人可以帮我把它带到正确的轨道,我会非常感激,因为我已经停下来,不知道怎么做这四件事,并试图尽可能地学习CakePHP。非常感激。感谢
编辑:我发现隐藏字段的视图可用于存储有关用户确认的朋友请求的信息,但这并不理想,因为这意味着将用户从其他地方发送出去时实际上我想要运行该功能并直接进行重定向。不是AJAX那么!
答案 0 :(得分: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:
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')
}
答案 1 :(得分:0)
答案3是这样的:
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,检查status
字段,如果它等于Requested
,则将其更新为Accepted
。这样它只会被调用一次。
并且为了防止人们反复“接受”朋友,只需在接受后删除“接受”链接。 if
语句会阻止您的代码不必要地更新。
您还应该采取某种预防措施,以便只有requested friend
可以accept
请求。否则,我可以输入URL yoursite.com/friends/accept_friendship/123
并接受随机人员请求而无需任何身份验证。